Este é um guia de como buscar todas as postagens de um tópico usando a API do Discourse
Os resultados retornados pela API do Discourse para muitas rotas são paginados.
Por exemplo, o endpoint da API para “Obter um Tópico Único” - Ex:
https://examplesite/t/{id}.jsonretornará apenas 20 postagens por padrão, mesmo que o tópico contenha mais de 20 postagens.Devido a esse comportamento, existem duas maneiras de usar a API do Discourse para buscar todas as postagens de um tópico usando o endpoint
.../t/{id}.json.Anexar um Parâmetro de Consulta
A maneira mais fácil de buscar todas as postagens de um tópico é adicionar um parâmetro de consulta
print=trueao URL para o qual você está fazendo a solicitação.Ex:
https://examplesite/t/{id}.json?print=trueQuando o parâmetro de consulta
print=trueé adicionado, o Discourse define ochunk_sizepara o número de postagens retornadas como 1000. Isso significa que esta é uma boa abordagem a ser usada, desde que você tenha certeza de que seus tópicos não têm mais de 1000 postagens.Múltiplas Solicitações de API
O outro método para buscar todas as postagens é fazer múltiplas solicitações de API para obter todas as postagens do tópico:
Primeiro, você faria uma solicitação
GETinicial para o endpoint.../t/{id}.json. Isso conterá um hashposts_streamque inclui um arraypostse um arraystream. O arraypostsfornecerá as primeiras 20 postagens.Agora você precisa percorrer o array
stream, que fornece todos os IDs de postagem no tópico. Remova os primeiros 20 IDs de postagem do stream (caso contrário, você os estará baixando novamente sem motivo).Você pode então fazer solicitações adicionais para o endpoint “Obter Postagens Específicas de um Tópico”
.../t/{id}/posts.json, anexarpost_ids[]e passar todos os IDs do arraystreamem blocos de 20. Ex:.../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[]=65Limites de Taxa
Se você encontrar uma mensagem de
Erro: você realizou esta ação muitas vezes, tente novamente mais tardeao fazer várias chamadas de API, isso indica que você está atingindo os limites de taxa da chave de API.O Discourse tem um limite no número de solicitações
print=trueque podem ser feitas por hora, o que é controlado pela configuração do sitemax prints per hour per user. Esta configuração, por padrão, permite que os usuários imprimam apenas 5 tópicos por hora. Você pode definir essa configuração para0para desativar o limite de taxa.Observe que o limite de taxa não será aplicado se você usar uma chave de API de Todos os Usuários para as solicitações e fornecer o nome de usuário de um administrador do site para o parâmetro
Api-Usernameda solicitação. Isso significa que, em vez de desativar a configuração do sitemax prints per hour per user, você pode simplesmente usar um nome de usuário de administrador (por exemplo,system) para as solicitações.Se você estiver encontrando erros de limite de taxa com solicitações de API que não contêm
print=true, recomendamos adicionar um tempo limite ao seu script de API para que você não exceda os limites de taxa. Alternativamente, você pode ouvir os códigos de erro429(muitas solicitações) e retroceder nas solicitações quando receber essa resposta.Para referência, os limites de taxa padrão listados abaixo se aplicam aos nossos planos hospedados padrão e empresariais:
discourse/config/discourse_defaults.conf at main · discourse/discourse · GitHub
Apenas Auto-Hospedado - Veja: Available settings for global rate limits and throttling para detalhes sobre como ajustar os limites de taxa da API do Discourse.
O parâmetro de consulta ?page é suportado? Ele funciona, mas de uma maneira surpreendente - ?page=1 retorna apenas a primeira postagem no tópico, então para paginar com o parâmetro você precisa começar com https://example.com/t/slug/topicId.json, depois pular para https://example.com/t/slug/topicId.json?page=2, e continuar até eventualmente obter uma resposta 404.
Olá Simon,
Usar o parâmetro ?page=1 com o endpoint Get a single topic retornará os primeiros 20 posts de um tópico, e cada número de página subsequente retornará até 20 posts.
Quando não houver mais posts disponíveis (por exemplo, a página é muito alta e inválida), você receberá uma resposta 404.
Se você não especificar um número de página, o código definirá o número da página como 1, portanto, ?page=1 é o mesmo que não adicionar uma página explícita à solicitação do tópico.
Se você quisesse usar esse método para buscar todos os posts de um tópico, você conseguiria, mesmo que isso não seja mencionado na Documentação da API do Discourse.
Obrigado! Trabalhando em um bot do Matrix para buscar posts!
Acho que isso está errado. Definir como 0 desabilitará a impressão completamente. A descrição mais recente para esta configuração é Número máximo de impressões de página /print (definir como 0 para desabilitar a impressão).
