Nota: Questa guida presuppone che tu stia eseguendo un bot autorizzato su un forum Discourse, eventualmente utilizzando la User API o una Admin API Key. Se il tuo bot viene bloccato dagli amministratori, discuti con loro lo scopo del tuo bot e non tentare di aggirare tale blocco.
Il tuo bot funzionerebbe meglio se fosse eseguito sul server? Valuta di creare invece un plugin: Developing Discourse Plugins - Part 1 - Create a basic plugin
Introduzione
Questa guida presenterà un algoritmo per un utente bot che consente di ispezionare ed elaborare ogni post pubblicato su un forum Discourse a cui l’utente del bot ha accesso (esclusi i messaggi privati).
Avrai bisogno di un archiviazione duratura per un singolo intero, ovvero l’ID del post più alto elaborato con successo. Ad esempio, potresti salvarlo su Redis o in un file di testo semplice. Utilizzare Redis ti consentirà di mantenere attive le sottoscrizioni al message bus anche dopo il riavvio dei processi sul tuo lato.
È fortemente raccomandato di creare un nuovo account utente dedicato al bot, in modo che possa essere aggiunto a gruppi e ricevere messaggi privati quando necessario. Evita di utilizzare l’account @system.
Il seguente insieme di algoritmi è scritto imitando lo stile delle specifiche WHATWG e costruisce gradualmente l’algoritmo per monitorare continuamente i nuovi post.
Specifiche degli Algoritmi
Sia forum base URL l’URL del sito senza barra finale, ad esempio https://meta.discourse.org o https://www.contoso.com/forum per installazioni in sottocartelle.
Recuperare i prossimi post recenti
Per recuperare i prossimi post recenti dato un intero highest seen post ID e un flag triggered by message bus, esegui questi passaggi:
- Sia maximum response post ID il risultato dell’aggiunta di cinquanta (50) all’highest seen post ID.
- Sia request uri la concatenazione di forum base URL,
/posts.json,?before=e maximum response post ID. - Sia response il risultato di
fetch JSON rispettando i limiti di frequenza con request uri e credentials. - Se response è un errore HTTP, interrompi questi passaggi con un errore.
- Sia posts l’array JSON al percorso
latest_postsall’interno di response. - Imposta il flag new posts seen a falso (unset).
- Per ogni oggetto JSON post in posts, in ordine inverso, esegui questi passaggi:
- Sia post ID il numero JSON al percorso
idall’interno di post. - Imposta highest seen post ID su post ID.
- Imposta il flag new posts seen.
Emetti post. (
In altre parole: invia il post a qualsiasi elaborazione personalizzata che desideri eseguire.)- Se emit restituisce un segnale di backpressure, interrompi questo ciclo.
- Sia post ID il numero JSON al percorso
-
Il ciclo sopra viene eseguito in ordine inverso in modo che il tuo codice veda prima i post più vecchi e poi quelli più recenti. - Se il flag new posts seen è impostato:
- Esegui i passaggi per
persistere lo stato nell’archiviazione con highest seen post ID.
- Esegui i passaggi per
- Termina questi passaggi restituendo highest seen post ID.
Sondare un alto ID di post esistente
Per sondare un alto ID di post esistente, esegui questi passaggi:
- Sia latest probe request uri la concatenazione di forum base URL e
/posts.json. - Sia latest probe response il risultato di
fetch JSON rispettando i limiti di frequenza con latest probe request uri e credentials. - Se latest probe response è un errore HTTP, interrompi questi passaggi con un errore.
- Sia probe posts l’array JSON al percorso
latest postsall’interno di latest probe response. - Per ogni oggetto JSON post in probe posts:
- Sia post id il numero JSON al percorso
idall’interno di post. - Termina questi passaggi, restituendo post id.
- Sia post id il numero JSON al percorso
- Interrompi questi passaggi con un errore.
Riempimento retroattivo dall’ultimo
Per riempimento retroattivo dall’ultimo dato un intero opzionale highest seen post ID, esegui questi passaggi:
- Sia minimum post ID highest seen post ID se presente, altrimenti zero (0).
- Sia high existing post ID il risultato di sondare un alto ID di post esistente.
- Se maximum post ID è un errore, interrompi questi passaggi con un errore.
- Esegui i passaggi per riempimento retroattivo dati minimum post ID e high existing post ID.
Riempimento retroattivo
Per riempimento retroattivo dati due interi minimum post ID e high existing post ID:
- Sia current minimum post ID minimum post ID.
- Ripeti questi passaggi:
- Esegui i passaggi per recuperare i prossimi post recenti dati current minimum post ID e un flag triggered by message bus non impostato.
- Se i passaggi per recuperare i prossimi post recenti non sono completati con successo:
- Aggiorna l’algoritmo di backoff esponenziale con un segnale di fallimento e attendi la quantità di tempo specificata.
- Passa alla prossima iterazione del ciclo (senza aggiornare current minimum post ID).
- Sia candidate maximum response post ID il risultato dell’aggiunta di cinquanta (50) a current minimum post ID.
- Se candidate maximum response post ID è maggiore o uguale a high existing post ID,
termina questi passaggi. - Imposta current minimum post ID su candidate maximum response post ID.
Monitorare continuamente i nuovi post
Per monitorare continuamente i nuovi post, esegui questi passaggi:
- Sia highest seen post ID un intero opzionale non impostato.
- Imposta highest seen post ID sul risultato di
ripristinare lo stato dall’archiviazione. - Se highest seen post ID non è impostato:
- Imposta initial post ID sul risultato di sondare un alto ID di post esistente.
- Esegui i passaggi per
persistere lo stato nell’archiviazione con initial post ID. - Imposta highest seen post ID su initial post ID.
- Imposta notifications sul risultato dell’esecuzione dei passaggi per
sottoscriversi al message bus, con un canale /latest. - Esegui ripetutamente i seguenti passaggi:
- Imposta new highest seen post ID sul risultato di recuperare i prossimi post recenti, con il flag triggered by message bus impostato se si è verificato un aggiornamento del message bus, e highest seen post ID.
- Se i passaggi per recuperare i prossimi post recenti non sono completati con successo:
- Aggiorna l’algoritmo di backoff esponenziale con un segnale di fallimento e attendi la quantità di tempo specificata.
- Passa alla prossima iterazione del ciclo.
- Se new highest seen post ID è diverso da highest seen post ID:
- Aggiorna l’algoritmo di backoff esponenziale con un segnale di successo.
- Imposta highest seen post ID su new highest seen post ID.
- Attendi un messaggio su notifications o il verificarsi di un timeout definito dall’implementazione. Questo timeout non deve essere inferiore a 10 minuti e può ragionevolmente arrivare fino a 24 ore o leggermente di più.
Algoritmi che devi fornire:
fetch JSON rispettando i limiti di frequenza, che accetta un request uri e credenziali opzionali.
- Questo deve automaticamente eseguire backoff e riprovare utilizzando l’algoritmo di backoff esponenziale e/o le informazioni fornite dal server
Retry-Afterquando si presenta un errore 429.
- Questo deve automaticamente eseguire backoff e riprovare utilizzando l’algoritmo di backoff esponenziale e/o le informazioni fornite dal server
ripristinare lo stato dall’archiviazione
persistere lo stato nell’archiviazione, che accetta un intero
sottoscriversi al message bus