youtube.subscriptions.list (api v3) – nextPageToken não está disponível

Estou tentando obter todos os canais das minhas assinaturas. Mas o “nextPageToken” não está disponível.

A resposta deve conter “nextPageToken”:

(de developers.google.com – YouTube (v3) – Assinaturas: lista)

{ "kind": "youtube#subscriptionListResponse", "etag": etag, "nextPageToken": string, "prevPageToken": string, "pageInfo": { "totalResults": integer, "resultsPerPage": integer }, "items": [ subscription Resource ] } 

Este é o meu pedido:

 GET https://www.googleapis.com/youtube/v3/subscriptions?part=snippet&maxResults=10&mine=true&key={YOUR_API_KEY} 

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

http://www.google.com/adwords

Minha resposta:

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

Você pode me dizer por que o nextPageToken está faltando, por favor?

Aqui está um trecho de JS que eu criei para gerar pageTokens até pelo menos 1024, não posso garantir que ele produzirá algo válido além disso, pois não consegui encontrar nenhum serviço que me traga tokens para offsets> 450 para validar minhas suposições e premissas.

 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"; } 

Eu tenho agora uma solução para isso. Por favor, me diga se isso ajuda.

Os tokens parecem ser os mesmos para cada página de outras chamadas API API V3 do Youtube, então eu posso usá-lo para buscar todas as páginas de assinaturas que eu preciso.

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

Você pode usar ANOTHER Youtube API para obter mais tokens de página se precisar de mais. Basta buscar 1 elemento por vez e registrar os tokens para usar nesta API.

Eu só preciso saber quando parar … então eu verifiquei quando chamadas de API não retornaram canais!

 @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 

Eu tenho um script que roda a cada hora com base nesta API do YouTube V3 e ele parou de funcionar há 4 horas. O nextPageToken não está mais disponível. Antes, estava disponível exatamente como no primeiro código que você postou.