2015-05-15 15 views
6

Sto cercando di ottenere tutti i canali dalle mie iscrizioni. Ma "nextPageToken" non è disponibile.youtube.subscriptions.list (api v3) - nextPageToken non disponibile

La risposta dovrebbe contenente "nextPageToken":

(da developers.google.com - YouTube (v3) - Iscrizioni: lista)

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

Questa è la mia richiesta:

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

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

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

La mia risposta:

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

mi puoi dire perché il nextPageToken è mancante, per favore?

+0

Sembra di essere nuovamente a lavorare, tuttavia, è limitata a 500 voci: https://code.google .com/p/gdata-issues/issues/detail? id = 4282 # c6 –

risposta

3

Ecco un frammento JS mi è venuta a generare pageTokens fino a almeno 1024, non posso garantire che esso produrrà nulla validi dopo che, come non ho potuto trovare qualsiasi servizio che otterrà mi gettoni per gli offset > 450 per convalidare le mie supposizioni e ipotesi.

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

(controllare strumenti di sviluppo/console per vedere codici generati)

3

Ho uno script che viene eseguito ogni ora in base a questa API di YouTube V3 e si è interrotto per funzionare 4 ore fa. Il nextPageToken non è più disponibile. Prima era disponibile esattamente come nel primo codice che hai postato.

+0

Grazie per la risposta. Quindi sembra che si tratti di un errore di YouTube Server? – Fleckchen

+0

Non ne sono sicuro, ma credo di sì. Aspetterò un po 'di tempo per vedere se lo sistemano ... perché non posso farlo da solo. –

+1

praticamente lo stesso qui, improvvisamente nextpagokoken non è stato consegnato e stavo andando mentale> schippi

5

Ora ho una soluzione per questo. Per favore dimmi se questo aiuta.

I token sembrano essere gli stessi per ogni pagina di altre API API di YouTube V3, quindi posso utilizzarlo per recuperare tutte le pagine di sottoscrizioni di cui ho bisogno.

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

È possibile utilizzare UN'ALTRA API di YouTube per ottenere più token di pagina se è necessario altro. Basta recuperare 1 elemento alla volta e registrare i token da utilizzare in questa API.

Ho solo bisogno di sapere quando fermarmi ... quindi ho controllato quando le chiamate API non hanno restituito alcun canale!

@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 
+0

probabilmente è meglio usare il pageInfo.totalresults e guarda se hai ottenuto tanti oggetti, ma grazie per i token statici! – schippi

+0

Il problema dell'utilizzo di pageInfo.totalresults è che a volte il numero di elementi effettivamente restituiti è diverso da pageInfo.totalresults. Quando eseguo il codice qui sopra il pageInfo.totalresults è 236 ma alcune pagine restituiscono 49 o 48 itens e in I finiscono con 232 itens in totale. Quindi ... Devo davvero controllare quando non viene restituito altro itens. :) –

+2

Un avvertimento, i token dipendono dall'impostazione maxResults. Ho ottenuto token completamente diversi quando ho impostato maxResults su 1 e quando era su 50. – Gapipro

Problemi correlati