Dica para escritor de bot: Processando cada postagem

:information_source: Nota: Este guia pressupõe que você está operando um bot autorizado em um fórum Discourse, possivelmente usando a API de Usuário ou uma Chave de API de Administrador. Se o seu bot for bloqueado pelos administradores, discuta o propósito do seu bot com eles e não tente contornar esse bloqueio.

:information_source: Seu bot seria melhor se fosse executado no servidor? Considere criar um plugin em vez disso: Developing Discourse Plugins - Part 1 - Create a basic plugin

Introdução

Este guia apresentará um algoritmo para um usuário bot inspecionar e processar todas as postagens feitas em um fórum Discourse que o usuário do bot tem permissão para acessar (exceto mensagens privadas).

Você precisará de armazenamento durável para um único inteiro, o maior ID de postagem processado com sucesso. Por exemplo, você pode gravar isso no Redis ou em um arquivo de texto simples. Usar o Redis permitirá que você persista assinaturas do message bus através de reinícios de processo no seu lado.

É altamente recomendável criar uma nova conta de usuário para o bot, para que ela possa ser adicionada a grupos e mensagens privadas conforme necessário. Evite usar a conta @system.

O conjunto de algoritmos a seguir foi escrito imitando o estilo da especificação WHATWG e gradualmente constrói até o algoritmo para monitorar continuamente novas postagens.

Especificações dos Algoritmos

Seja a URL base do fórum a URL do site sem barra no final — por exemplo, https://meta.discourse.org ou https://www.contoso.com/forum para instalações em subpastas.

Buscar as próximas postagens recentes

Para buscar as próximas postagens recentes dado um inteiro maior ID de postagem visto e uma flag acionada pelo message bus, execute estas etapas:

  • Seja máximo ID de postagem na resposta o resultado de adicionar cinquenta (50) ao maior ID de postagem visto.
  • Seja URI da solicitação a concatenação da URL base do fórum, /posts.json, ?before=, e o máximo ID de postagem na resposta.
  • Seja resposta o resultado de :satellite: buscar JSON respeitando limites de taxa com a URI da solicitação e as credenciais.
  • Se resposta for um erro HTTP, aborte estas etapas com um erro.
  • Seja postagens o array JSON no caminho latest_posts dentro de resposta.
  • Seja a flag novas postagens vistas desmarcada.
  • Para cada objeto JSON postagem em postagens em ordem reversa, execute estas etapas:
    • Seja ID da postagem o número JSON no caminho id dentro de postagem.
    • Defina maior ID de postagem visto como ID da postagem.
    • Marque a flag novas postagens vistas.
    • :white_check_mark: Emita postagem. (:information_source: Em outras palavras: envie a postagem para qualquer processamento personalizado que você deseje realizar.)
    • Se emitir retornar um sinal de pressão de retorno (backpressure), interrompa este loop.
  • :information_source: O loop acima executa em ordem reversa para que seu código veja as postagens mais antigas primeiro e as mais recentes por último.

  • Se a flag novas postagens vistas estiver marcada:
    • Execute as etapas para :floppy_disk: persistir estado no armazenamento com maior ID de postagem visto.
  • Termine estas etapas retornando o maior ID de postagem visto.

Sondar um alto ID de postagem existente

Para sondar um alto ID de postagem existente, execute estas etapas:

  • Seja URI da última solicitação de sonda a concatenação da URL base do fórum e /posts.json.
  • Seja resposta da última sonda o resultado de :satellite: buscar JSON respeitando limites de taxa com a URI da última solicitação de sonda e as credenciais.
  • Se resposta da última sonda for um erro HTTP, aborte estas etapas com um erro.
  • Seja postagens de sonda o array JSON no caminho latest posts dentro de resposta da última sonda.
  • Para cada objeto JSON postagem em postagens de sonda:
    • Seja id da postagem o número JSON no caminho id dentro de postagem.
    • Termine estas etapas, retornando id da postagem.
  • Abortar estas etapas com um erro.

Preencher lacunas a partir do mais recente

Para preencher lacunas a partir do mais recente dado um inteiro opcional maior ID de postagem visto, execute estas etapas:

  • Seja mínimo ID de postagem o maior ID de postagem visto se presente, e zero (0) caso contrário.
  • Seja alto ID de postagem existente o resultado de sondar um alto ID de postagem existente.
  • Se máximo ID de postagem for um erro, aborte estas etapas com um erro.
  • Execute as etapas para preencher lacunas dado o mínimo ID de postagem e o alto ID de postagem existente.

Preencher lacunas

Para preencher lacunas dados dois inteiros mínimo ID de postagem e alto ID de postagem existente:

  • Seja mínimo atual ID de postagem mínimo ID de postagem.
  • Repita estas etapas:
    • Execute as etapas para buscar as próximas postagens recentes dado o mínimo atual ID de postagem e uma flag acionada pelo message bus desmarcada.
    • Se as etapas para buscar as próximas postagens recentes não foram concluídas com sucesso:
      • Atualize o algoritmo de retrocesso exponencial com um sinal de falha e aguarde a quantidade de tempo especificada.
      • Continue para a próxima iteração do loop (sem atualizar o mínimo atual ID de postagem).
    • Seja máximo candidato ID de postagem na resposta o resultado de adicionar cinquenta (50) ao mínimo atual ID de postagem.
    • Se o máximo candidato ID de postagem na resposta for maior ou igual ao alto ID de postagem existente, :white_check_mark: termine estas etapas.
    • Defina o mínimo atual ID de postagem como o máximo candidato ID de postagem na resposta.

Monitorar continuamente novas postagens

Para monitorar continuamente novas postagens, execute estas etapas:

  • Seja maior ID de postagem visto um inteiro opcional desmarcado.
  • Defina maior ID de postagem visto como o resultado de :arrow_forward: restaurar estado do armazenamento.
  • Se maior ID de postagem visto estiver desmarcado:
    • Defina ID inicial da postagem como o resultado de sondar um alto ID de postagem existente.
    • Execute as etapas para :floppy_disk: persistir estado no armazenamento com ID inicial da postagem.
    • Defina maior ID de postagem visto como ID inicial da postagem.
  • Defina notificações como o resultado de executar as etapas para :satellite: assinar o message bus, com um canal de /latest.
  • Execute as seguintes etapas repetidamente:
    • Defina novo maior ID de postagem visto como o resultado de buscar as próximas postagens recentes, com a flag acionada pelo message bus marcada se uma atualização do message bus ocorreu, e o maior ID de postagem visto.
    • Se as etapas para buscar as próximas postagens recentes não foram concluídas com sucesso:
      • Atualize o algoritmo de retrocesso exponencial com um sinal de falha e aguarde a quantidade de tempo especificada.
      • Continue para a próxima iteração do loop.
    • Se o novo maior ID de postagem visto for diferente do maior ID de postagem visto:
      • Atualize o algoritmo de retrocesso exponencial com um sinal de sucesso.
      • Defina o maior ID de postagem visto como o novo maior ID de postagem visto.
    • Aguarde uma mensagem em notificações ou até que um tempo limite definido pela implementação ocorra. Este tempo limite deve ser de no mínimo 10 minutos e pode razoavelmente variar até 24 horas ou ligeiramente mais.

Algoritmos que você precisa fornecer:

  • :satellite: buscar JSON respeitando limites de taxa, recebendo uma URI de solicitação e credenciais opcionais.
    • Isso deve automaticamente fazer retrocesso e tentar novamente usando o algoritmo de retrocesso exponencial e/ou as informações fornecidas pelo servidor Retry-After quando apresentado com um erro 429.
  • :arrow_forward: restaurar estado do armazenamento
  • :floppy_disk: persistir estado no armazenamento, recebendo um inteiro
  • :satellite: assinar o message bus

14 curtidas