Ютьюб.подписки.список (api v3) - nextPageToken недоступен

Я пытаюсь получить все каналы из моей подписки. Но "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 Explorer-YouTube (v3) - Подписки.список:

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 отсутствует, пожалуйста?

3 ответов


вот фрагмент JS, который я придумал для генерации pageTokens до по крайней мере 1024, я не могу гарантировать, что он произведет что-либо действительное за пределами этого, поскольку я не смог найти службу, которая получит мне токены для смещений > 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";
}

(проверьте инструменты разработчика / консоль, чтобы увидеть сгенерированные коды)


теперь у меня есть обходной путь для этого. Пожалуйста, скажи мне, если это поможет.

токены кажутся одинаковыми для каждой страницы других вызовов API Youtube V3 API, поэтому я могу использовать его для извлечения всех страниц подписок, которые мне нужны.

tokens = ['CDIQAA','CGQQAA','CJYBEAA','CMgBEAA','CPoBEAA','CKwCEAA','CN4CEAA','CJADEAA','CMIDEAA','CPQDEAA','CKYEEAA', ...]

вы можете использовать другой API Youtube, чтобы получить больше маркеров страницы, если вам нужно больше. Просто извлеките 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

У меня есть скрипт, который работает каждый час на основе этого YouTube API V3, и он перестал работать 4 часа назад. В nextPageToken больше не доступен. Раньше он был доступен точно так же, как в первом коде, который вы опубликовали.