Recupera tutti i post da un argomento usando l'API

:notebook_with_decorative_cover: 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}.json restituirà 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=true all’URL a cui stai effettuando la richiesta.

Es: https://examplesite/t/{id}.json?print=true

Quando viene aggiunto il parametro di query print=true, Discourse imposta chunk_size per 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:

  1. Innanzitutto, effettueresti una richiesta GET iniziale all’endpoint .../t/{id}.json. Questo conterrà un hash posts_stream che contiene un array posts e un array stream. L’array posts ti fornirà i primi 20 post.

  2. Ora devi scorrere l’array stream che 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).

  3. Puoi quindi effettuare richieste aggiuntive all’endpoint “Ottieni post specifici da un argomento” .../t/{id}/posts.json, aggiungere post_ids[] e passare tutti gli ID dall’array stream in 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[]=65

Limiti di frequenza

Se incontri un messaggio Errore: hai eseguito questa azione molte volte, riprova più tardi quando 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=true che possono essere effettuate all’ora, controllato dall’impostazione del sito max prints per hour per user. Questa impostazione limita per impostazione predefinita gli utenti a stampare solo 5 argomenti all’ora. Puoi impostare quell’impostazione su 0 per 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-Username della richiesta. Ciò significa che invece di disabilitare l’impostazione del sito max prints per hour per user, potresti semplicemente utilizzare un nome utente amministratore (ad esempio system) 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 errore 429 (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

:grey_exclamation: 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.

11 Mi Piace

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.

3 Mi Piace

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).