Questa è una guida che spiega come recuperare tutti i post da un argomento utilizzando l’API di Discourse
I risultati restituiti dall’API di Discourse per molte route sono paginati.
Ad esempio, l’endpoint API per “Ottieni un singolo argomento” - Es:
https://examplesite/t/{id}.jsonrestituirà solo 20 post per impostazione predefinita, anche se l’argomento contiene più di 20 post.A causa di questo comportamento, ci sono due modi per utilizzare l’API di Discourse per recuperare tutti i post di un argomento utilizzando l’endpoint
.../t/{id}.json.Aggiungi un parametro di query
Il modo più semplice per recuperare tutti i post da un argomento è aggiungere un parametro di query
print=trueall’URL a cui stai effettuando la richiesta.Es:
https://examplesite/t/{id}.json?print=trueQuando viene aggiunto il parametro di query
print=true, Discourse impostachunk_sizeper il numero di post restituiti a 1000. Ciò significa che questo è un buon approccio da utilizzare finché sei certo che i tuoi argomenti non contengano più di 1000 post.Richieste API multiple
L’altro metodo per recuperare tutti i post è effettuare richieste API multiple per ottenere tutti i post dall’argomento:
Innanzitutto, effettueresti una richiesta
GETiniziale all’endpoint.../t/{id}.json. Questo conterrà un hashposts_streamche contiene un arraypostse un arraystream. L’arraypoststi fornirà i primi 20 post.Ora devi scorrere l’array
streamche ti fornisce tutti gli ID dei post nell’argomento. Rimuovi i primi 20 ID dei post dallo stream (altrimenti li stai scaricando di nuovo senza motivo).Puoi quindi effettuare richieste aggiuntive all’endpoint “Ottieni post specifici da un argomento”
.../t/{id}/posts.json, aggiungerepost_ids[]e passare tutti gli ID dall’arraystreamin blocchi di 20. Es.../t/{id}/posts.json?post_ids[]=46&post_ids[]=47&post_ids[]=48&post_ids[]=49&post_ids[]=50&post_ids[]=51&post_ids[]=52&post_ids[]=53&post_ids[]=54&post_ids[]=55&post_ids[]=56&post_ids[]=57&post_ids[]=58&post_ids[]=59&post_ids[]=60&post_ids[]=61&post_ids[]=62&post_ids[]=63&post_ids[]=64&post_ids[]=65Limiti di frequenza
Se incontri un messaggio
Errore: hai eseguito questa azione molte volte, riprova più tardiquando effettui chiamate API multiple, ciò indica che stai raggiungendo i limiti di frequenza della chiave API.Discourse ha un limite al numero di richieste
print=trueche possono essere effettuate all’ora, controllato dall’impostazione del sitomax prints per hour per user. Questa impostazione limita per impostazione predefinita gli utenti a stampare solo 5 argomenti all’ora. Puoi impostare quell’impostazione su0per disabilitare il limite di frequenza.Nota che il limite di frequenza non verrà applicato se utilizzi una chiave API per tutti gli utenti per le richieste e fornisci il nome utente di un amministratore del sito per il parametro
Api-Usernamedella richiesta. Ciò significa che invece di disabilitare l’impostazione del sitomax prints per hour per user, potresti semplicemente utilizzare un nome utente amministratore (ad esempiosystem) per le richieste.Se riscontri errori di limite di frequenza con richieste API che non contengono
print=true, ti consigliamo di aggiungere un timeout al tuo script API in modo da non superare i limiti di frequenza. In alternativa, puoi ascoltare i codici di errore429(troppe richieste) ed eseguire il backoff sulle richieste quando ricevi tale risposta.Come riferimento, i limiti di frequenza predefiniti elencati di seguito si applicano ai nostri piani ospitati standard e business:
discourse/config/discourse_defaults.conf at main · discourse/discourse · GitHub
Solo Self Hosted - Vedi: Available settings for global rate limits and throttling per i dettagli sulla modifica dei limiti di frequenza dell’API di Discourse.
Il parametro di query ?page è supportato? Funziona, ma in modo sorprendente: ?page=1 restituisce solo il primo post dell’argomento, quindi per paginare con il parametro è necessario iniziare con https://example.com/t/slug/topicId.json, quindi passare a https://example.com/t/slug/topicId.json?page=2, quindi continuare fino a ottenere infine una risposta 404.
Ciao Simon,
Utilizzando il parametro ?page=1 con l’endpoint Get a single topic restituirà i primi 20 post di un argomento e ogni numero di pagina successivo restituirà fino a 20 post.
Quando non ci sono altri post disponibili (ad esempio, la pagina è troppo alta e non valida), riceverai una risposta 404.
Se non specifichi un numero di pagina, il codice imposterà il numero di pagina a 1, quindi ?page=1 è uguale a non aggiungere una pagina esplicita alla richiesta dell’argomento.
Se volessi utilizzare questo metodo per recuperare tutti i post da un argomento, dovresti essere in grado di farlo, anche se non è menzionato nella Documentazione API di Discourse.
Grazie! Sto lavorando a un bot Matrix per recuperare i post!
Penso che sia sbagliato. Impostare su 0 disabiliterà del tutto la stampa. La descrizione più recente per questa impostazione è Numero massimo di impressioni della pagina /print (impostare su 0 per disabilitare la stampa).
