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.
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
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_postsdentro 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
iddentro de postagem. - Defina maior ID de postagem visto como ID da postagem.
- Marque a flag novas postagens vistas.
Emita postagem. (
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.
- Seja ID da postagem o número JSON no caminho
-
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
persistir estado no armazenamento com maior ID de postagem visto.
- Execute as etapas para
- 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
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 postsdentro de resposta da última sonda. - Para cada objeto JSON postagem em postagens de sonda:
- Seja id da postagem o número JSON no caminho
iddentro de postagem. - Termine estas etapas, retornando id da postagem.
- Seja id da postagem o número JSON no caminho
- 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,
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
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
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
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:
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-Afterquando apresentado com um erro 429.
- Isso deve automaticamente fazer retrocesso e tentar novamente usando o algoritmo de retrocesso exponencial e/ou as informações fornecidas pelo servidor
restaurar estado do armazenamento
persistir estado no armazenamento, recebendo um inteiro
assinar o message bus