【问题标题】:youtube.subscriptions.list (api v3) - nextPageToken isn't availableyoutube.subscriptions.list (api v3) - nextPageToken 不可用
【发布时间】:2015-07-27 14:26:42
【问题描述】:

我正在尝试从我的订阅中获取所有频道。但是“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}

APIs Explorer - YouTube (v3) - Subscriptions.list:

https://developers.google.com/apis-explorer/#p/youtube/v3/youtube.subscriptions.list?part=snippet&maxResults=10&mine=true

我的回复:

{
 "kind": "youtube#subscriptionListResponse",
 "etag": "\"XXXXX/XXXXX\"",
 "pageInfo": {
  "totalResults": 115,
  "resultsPerPage": 10
 },
 "items": [
  ...

你能告诉我为什么没有 nextPageToken 吗?

【问题讨论】:

标签: java javascript api youtube subscriptions


【解决方案1】:

我现在有一个解决方法。 请告诉我这是否有帮助。

其他 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

【讨论】:

  • 最好使用 pageInfo.totalresults 并查看是否有尽可能多的项目,但感谢您提供静态令牌!
  • 使用pageInfo.totalresults的问题是有时候实际返回的item数和pageInfo.totalresults不同。当我在这里运行上面的代码时,pageInfo.totalresults 为 236,但有些页面返回 49 或 48 个项目,最终我总共得到 232 个项目。所以......我真的必须检查什么时候没有更多的物品被退回。 :)
  • 一个警告,令牌取决于 maxResults 设置。当我将 maxResults 设置为 1 和设置为 50 时,我得到了完全不同的令牌。
  • 你是对的!我使用的这些标记用于 50 个结果。
  • 好主意!再次感谢:-)
【解决方案2】:

这是我想出的一个 JS sn-p,它可以生成至少 1024 的 pageToken,我不能保证它会产生任何有效的东西,因为我找不到任何服务可以让我获得偏移量 > 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";
}

(检查开发者工具/控制台查看生成的代码)

【讨论】:

    【解决方案3】:

    我有一个基于此 Youtube API V3 每小时运行的脚本,它在 4 小时前停止工作。 nextPageToken 不再可用。之前,它与您发布的第一个代码完全一样。

    【讨论】:

    • 感谢您的回复。所以这似乎是 YouTube-Server 错误?
    • 我不确定,但我相信。我会等一段时间看看他们是否能解决它……因为我自己无法做到。
    • 这里几乎是一样的,突然 nextpagetoken 没有收到,我正在精神状态>
    • 这是 youtube api 错误。你可以去这里code.google.com/p/gdata-issues/issues/detail?id=7163 并“给它加星标”,这样它会得到更多的关注
    猜你喜欢
    • 2019-08-05
    • 2019-05-13
    • 1970-01-01
    • 2018-08-28
    • 2017-11-29
    • 1970-01-01
    • 2015-10-23
    • 2017-06-05
    • 2018-08-01
    相关资源
    最近更新 更多