youtube.subscriptions.list (api v3) - nextPageToken 不可用
youtube.subscriptions.list (api v3) - nextPageToken isn't available
我正在尝试从我的订阅中获取所有频道。但是 "nextPageToken" 不可用。
响应应包含 "nextPageToken":
(来自 developers.google.com - YouTube (v3) - 订阅:列表)
{
"kind": "youtube#subscriptionListResponse",
"etag": etag,
"nextPageToken": string,
"prevPageToken": string,
"pageInfo": {
"totalResults": integer,
"resultsPerPage": integer
},
"items": [
subscription Resource
]
}
这是我的要求:
GET https://www.googleapis.com/youtube/v3/subscriptions?part=snippet&maxResults=10&mine=true&key={YOUR_API_KEY}
API 资源管理器 - YouTube (v3) - Subscriptions.list:
我的回复:
{
"kind": "youtube#subscriptionListResponse",
"etag": "\"XXXXX/XXXXX\"",
"pageInfo": {
"totalResults": 115,
"resultsPerPage": 10
},
"items": [
...
你能告诉我为什么缺少 nextPageToken 吗?
我有一个基于这个 Youtube API V3 每小时运行的脚本,它在 4 小时前停止工作。 nextPageToken 不再可用。之前,它与您发布的第一个代码完全一样。
我现在有一个解决方法。
如果有帮助,请告诉我。
其他 API Youtube V3 API 调用的每个页面的标记似乎都相同,所以我可以用它来获取我需要的所有订阅页面。
tokens = ['CDIQAA','CGQQAA','CJYBEAA','CMgBEAA','CPoBEAA','CKwCEAA','CN4CEAA','CJADEAA','CMIDEAA','CPQDEAA','CKYEEAA', ...]
如果您需要更多,可以使用另一个 Youtube API 来获取更多页面令牌。一次只需获取 1 个元素并记录要在此 API.
中使用的标记
我只需要知道什么时候停止...所以我检查了 API 呼叫何时返回没有频道!
@retry(stop_max_attempt_number=7)
def get_subscription_page(self, channel_id, pageToken):
print 'Retrieving subscription page using Youtube API (token: %s)' % pageToken
res = self.youtube_data_api.subscriptions().list(part="id,snippet,contentDetails",channelId=channel_id, maxResults=50, pageToken=pageToken).execute()
return res
def get_subscriptions(self, channel_id):
self.authorize(channel_id)
subs = []
# Tokens to deal with api bug...
# https://code.google.com/p/gdata-issues/issues/detail?id=7163
tokens = ['CDIQAA','CGQQAA','CJYBEAA','CMgBEAA','CPoBEAA','CKwCEAA','CN4CEAA','CJADEAA','CMIDEAA','CPQDEAA','CKYEEAA']
iPage = 0
pageToken = ''
while True:
res = self.get_subscription_page(channel_id, pageToken)
channelIds = []
for channel in res['items']: channelIds.append(channel.get('snippet').get('resourceId').get('channelId'))
pageToken = res.get('nextPageToken')
# If no next page token is returned... it might be caused by a bug.
# This workaroud will only have effect when the bug still lives.
if not pageToken:
if not channelIds:
# Workaroud for this: https://code.google.com/p/gdata-issues/issues/detail?id=7163
print ' (Workaround due to API bug) No channels returned in this API call! Finished!'
break
else:
pageToken = tokens[iPage]
# get channel info for each channel ID
channelsInfo = self.get_channel_info(channelIds)
subs += channelsInfo
print ' Itens already retrieved: %d ' % len(subs)
iPage += 1
if args.debug: break
if pageToken: continue
print 'No more pages to retrieve!'
break
return subs
这是我想出的用于生成至少 1024 的 pageTokens 的 JS 片段,我不能保证它会产生任何超出此范围的有效内容,因为我找不到任何服务可以让我获得偏移量 > 450 的令牌验证我的猜测和假设。
var d0 = "AEIMQUYcgkosw048";
var d1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
var d2 = d1;
var d1c = 0;
var d2c = 0;
var overflowSuffix = "Q";
var direction = "AA";
var d2OverflowCounter = 0;
var pageSize = 50;
for (i = 0; i < 1024; i++) {
if (i % pageSize == 0) console.log("C" + d1.charAt((d1c / d0.length) % d1.length) + d0.charAt(i % d0.length) + overflowSuffix + direction, ":", i);
if (++d1c % (1 << 8) == 0) d1c = 1 << 7;
if (++d2c % (1 << 7) == 0) overflowSuffix = d2.charAt(++d2OverflowCounter) + "E";
}
(检查开发者工具/控制台以查看生成的代码)
我正在尝试从我的订阅中获取所有频道。但是 "nextPageToken" 不可用。
响应应包含 "nextPageToken":
(来自 developers.google.com - YouTube (v3) - 订阅:列表)
{
"kind": "youtube#subscriptionListResponse",
"etag": etag,
"nextPageToken": string,
"prevPageToken": string,
"pageInfo": {
"totalResults": integer,
"resultsPerPage": integer
},
"items": [
subscription Resource
]
}
这是我的要求:
GET https://www.googleapis.com/youtube/v3/subscriptions?part=snippet&maxResults=10&mine=true&key={YOUR_API_KEY}
API 资源管理器 - YouTube (v3) - Subscriptions.list:
我的回复:
{
"kind": "youtube#subscriptionListResponse",
"etag": "\"XXXXX/XXXXX\"",
"pageInfo": {
"totalResults": 115,
"resultsPerPage": 10
},
"items": [
...
你能告诉我为什么缺少 nextPageToken 吗?
我有一个基于这个 Youtube API V3 每小时运行的脚本,它在 4 小时前停止工作。 nextPageToken 不再可用。之前,它与您发布的第一个代码完全一样。
我现在有一个解决方法。 如果有帮助,请告诉我。
其他 API Youtube V3 API 调用的每个页面的标记似乎都相同,所以我可以用它来获取我需要的所有订阅页面。
tokens = ['CDIQAA','CGQQAA','CJYBEAA','CMgBEAA','CPoBEAA','CKwCEAA','CN4CEAA','CJADEAA','CMIDEAA','CPQDEAA','CKYEEAA', ...]
如果您需要更多,可以使用另一个 Youtube API 来获取更多页面令牌。一次只需获取 1 个元素并记录要在此 API.
中使用的标记我只需要知道什么时候停止...所以我检查了 API 呼叫何时返回没有频道!
@retry(stop_max_attempt_number=7)
def get_subscription_page(self, channel_id, pageToken):
print 'Retrieving subscription page using Youtube API (token: %s)' % pageToken
res = self.youtube_data_api.subscriptions().list(part="id,snippet,contentDetails",channelId=channel_id, maxResults=50, pageToken=pageToken).execute()
return res
def get_subscriptions(self, channel_id):
self.authorize(channel_id)
subs = []
# Tokens to deal with api bug...
# https://code.google.com/p/gdata-issues/issues/detail?id=7163
tokens = ['CDIQAA','CGQQAA','CJYBEAA','CMgBEAA','CPoBEAA','CKwCEAA','CN4CEAA','CJADEAA','CMIDEAA','CPQDEAA','CKYEEAA']
iPage = 0
pageToken = ''
while True:
res = self.get_subscription_page(channel_id, pageToken)
channelIds = []
for channel in res['items']: channelIds.append(channel.get('snippet').get('resourceId').get('channelId'))
pageToken = res.get('nextPageToken')
# If no next page token is returned... it might be caused by a bug.
# This workaroud will only have effect when the bug still lives.
if not pageToken:
if not channelIds:
# Workaroud for this: https://code.google.com/p/gdata-issues/issues/detail?id=7163
print ' (Workaround due to API bug) No channels returned in this API call! Finished!'
break
else:
pageToken = tokens[iPage]
# get channel info for each channel ID
channelsInfo = self.get_channel_info(channelIds)
subs += channelsInfo
print ' Itens already retrieved: %d ' % len(subs)
iPage += 1
if args.debug: break
if pageToken: continue
print 'No more pages to retrieve!'
break
return subs
这是我想出的用于生成至少 1024 的 pageTokens 的 JS 片段,我不能保证它会产生任何超出此范围的有效内容,因为我找不到任何服务可以让我获得偏移量 > 450 的令牌验证我的猜测和假设。
var d0 = "AEIMQUYcgkosw048";
var d1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
var d2 = d1;
var d1c = 0;
var d2c = 0;
var overflowSuffix = "Q";
var direction = "AA";
var d2OverflowCounter = 0;
var pageSize = 50;
for (i = 0; i < 1024; i++) {
if (i % pageSize == 0) console.log("C" + d1.charAt((d1c / d0.length) % d1.length) + d0.charAt(i % d0.length) + overflowSuffix + direction, ":", i);
if (++d1c % (1 << 8) == 0) d1c = 1 << 7;
if (++d2c % (1 << 7) == 0) overflowSuffix = d2.charAt(++d2OverflowCounter) + "E";
}
(检查开发者工具/控制台以查看生成的代码)