Suggerimento per chi scrive bot: elaborazione di ogni post

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

:information_source: 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 :satellite: 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_posts all’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 id all’interno di post.
    • Imposta highest seen post ID su post ID.
    • Imposta il flag new posts seen.
    • :white_check_mark: Emetti post. (:information_source: In altre parole: invia il post a qualsiasi elaborazione personalizzata che desideri eseguire.)
    • Se emit restituisce un segnale di backpressure, interrompi questo ciclo.
  • :information_source: 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 :floppy_disk: persistere lo stato nell’archiviazione con highest seen post ID.
  • 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 :satellite: 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 posts all’interno di latest probe response.
  • Per ogni oggetto JSON post in probe posts:
    • Sia post id il numero JSON al percorso id all’interno di post.
    • Termina questi passaggi, restituendo post id.
  • 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, :white_check_mark: 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 :arrow_forward: 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 :floppy_disk: 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 :satellite: 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:

  • :satellite: 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-After quando si presenta un errore 429.
  • :arrow_forward: ripristinare lo stato dall’archiviazione
  • :floppy_disk: persistere lo stato nell’archiviazione, che accetta un intero
  • :satellite: sottoscriversi al message bus

14 Mi Piace