Recupera tutti i post da un argomento utilizzando l'API

:notebook_with_decorative_cover: Questa è una guida pratica su come recuperare tutti i post di un argomento utilizzando l’API di Discourse

I risultati restituiti dall’API di Discourse per molte rotte sono paginati.

Ad esempio, l’endpoint API per “Ottieni un singolo argomento” - Esempio: 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 di un argomento è aggiungere un parametro di query print=true all’URL a cui stai effettuando la richiesta.

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

Quando viene aggiunto il parametro di query print=true, Discourse imposta la chunk_size per il numero di post restituiti a 1000. Ciò significa che questo è un buon approccio da utilizzare purché si sia certi che i propri argomenti non abbiano più di 1000 post.

Più richieste API

L’altro metodo per recuperare tutti i post è effettuare più richieste API per ottenere tutti i post dell’argomento:

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

  2. Ora devi iterare sull’array stream, che ti fornisce tutti gli ID dei post nell’argomento. Rimuovi i primi 20 ID dei post dallo stream (altrimenti li scaricheresti 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. Esempio:
    .../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 velocità

Se ricevi un messaggio di errore Error: you have performed this action many times, please try again later durante l’esecuzione di più chiamate API, ciò indica che hai raggiunto i limiti di velocità della chiave API.

Discourse ha un limite sul numero di richieste print=true che possono essere effettuate per ora, controllato dall’impostazione del sito max prints per hour per user. Questa impostazione consente per impostazione predefinita agli utenti di stampare solo 5 argomenti all’ora. Impostarla su 0 disabiliterà completamente la stampa (le richieste con print=true restituiranno un errore 403).

Tieni presente che il limite di velocità non verrà applicato se l’utente che effettua la richiesta è un amministratore. Ciò significa che puoi utilizzare una chiave API con il nome utente di un amministratore (ad esempio system) per il parametro Api-Username della richiesta per aggirare il limite di velocità della stampa.

Se incontri errori di limite di velocità con richieste API che non contengono print=true, consigliamo di aggiungere un timeout allo script API in modo da non superare i limiti di velocità. In alternativa, puoi ascoltare i codici di errore 429 (troppe richieste) e ridurre la frequenza delle richieste quando ricevi tale risposta.

Per riferimento, i limiti di velocità predefiniti elencati di seguito si applicano ai nostri piani di hosting standard e business:

:grey_exclamation: Solo per installazioni self-hosted - Consulta: Available settings for global rate limits and throttling per i dettagli sulla regolazione dei limiti di velocità 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).