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:
-
Primeiro, você fará uma solicitação
GETinicial ao endpoint.../t/{id}.json. Isso conterá um hashposts_streamque possui um arraypostse um arraystream. O arraypostsfornecerá as primeiras 20 publicações. -
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). -
Em seguida, você pode fazer solicitações adicionais ao endpoint “Obter Publicações Específicas de um Tópico”
.../t/{id}/posts.json, adicionarpost_ids[]e passar todos os IDs do arraystreamem 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:
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.
