Busque todos os posts de um tópico usando a API

:notebook_with_decorative_cover: Este é um guia passo a passo explicando como buscar todas as publicações 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 Único Tópico” - Ex: https://examplesite/t/{id}.json retornará apenas 20 publicações por padrão, mesmo que o tópico contenha mais de 20 publicações.

Devido a esse comportamento, existem duas maneiras de usar a API do Discourse para buscar todas as publicações de um tópico usando o endpoint .../t/{id}.json.

Adicionar um Parâmetro de Consulta

A maneira mais fácil de buscar todas as publicações de um tópico é adicionar um parâmetro de consulta print=true à URL para a 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 publicações retornadas como 1000. Isso significa que essa é uma boa abordagem a ser usada, desde que você tenha certeza de que seus tópicos não têm mais de 1000 publicações.

Múltiplas Solicitações de API

O outro método para buscar todas as publicações é fazer múltiplas solicitações à API para obter todas as publicações do tópico:

  1. Primeiro, você fará uma solicitação GET inicial ao endpoint .../t/{id}.json. Isso conterá um hash posts_stream que possui um array posts e um array stream. O array posts fornecerá as primeiras 20 publicações.

  2. Agora, você precisa percorrer o array stream, que fornece todos os IDs de publicações no tópico. Remova os primeiros 20 IDs de publicações do stream (caso contrário, você estará baixando-os novamente sem necessidade).

  3. Em seguida, você pode fazer solicitações adicionais ao endpoint “Obter Publicações Específicas de um Tópico” .../t/{id}/posts.json, adicionar post_ids[] e passar todos os IDs do array stream em lotes 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 Error: you have performed this action many times, please try again later ao fazer múltiplas chamadas de API, isso indica que você atingiu 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, controlado pela configuração do site max prints per hour per user. Essa configuração permite, por padrão, que os usuários imprimam apenas 5 tópicos por hora. Definir isso como 0 desabilitará completamente a impressão (solicitações com print=true retornarão um erro 403).

Observe que o limite de taxa não será aplicado se o usuário que faz a solicitação for um administrador. Isso significa que você pode usar uma chave de API com o nome de usuário de um administrador (por exemplo, system) para o parâmetro Api-Username da solicitação para contornar o limite de taxa de impressão.

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 não exceder os limites de taxa. Alternativamente, você pode monitorar códigos de erro 429 (muitas solicitações) e reduzir a frequência das solicitações ao receber essa resposta.

Para referência, os limites de taxa padrão listados abaixo se aplicam aos nossos planos hospedados padrão e empresariais:

:grey_exclamation: Apenas Hospedagem Própria - Consulte: Available settings for global rate limits and throttling para detalhes sobre o ajuste dos 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).