Buscar todas as postagens de um tópico usando a API

:notebook_with_decorative_cover: 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}.json retornará 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=true ao URL para o qual você está fazendo a solicitação.

Ex: https://examplesite/t/{id}.json?print=true

Quando o parâmetro de consulta print=true é adicionado, o Discourse define o chunk_size para 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:

  1. Primeiro, você faria uma solicitação GET inicial para o endpoint .../t/{id}.json. Isso conterá um hash posts_stream que inclui um array posts e um array stream. O array posts fornecerá as primeiras 20 postagens.

  2. 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).

  3. Você pode então fazer solicitações adicionais para o endpoint “Obter Postagens Específicas de um Tópico” .../t/{id}/posts.json, anexar post_ids[] e passar todos os IDs do array stream em 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[]=65

Limites de Taxa

Se você encontrar uma mensagem de Erro: você realizou esta ação muitas vezes, tente novamente mais tarde ao 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=true que podem ser feitas por hora, o que é controlado pela configuração do site max 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 para 0 para 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-Username da solicitação. Isso significa que, em vez de desativar a configuração do site max 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 erro 429 (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

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

11 curtidas

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.

3 curtidas

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).