Documentação da API do Discourse menciona um "corpo de solicitação" para uma solicitação GET

Estou tentando criar um script para obter posts específicos de um tópico. Veja esta página Discourse API Docs

Mas continuo recebendo o código de status de resposta = 413.

Alguém me ajude, por favor! Enviarei US$ 20 para sua conta do PayPal se você puder resolver isso.

def get_post_from_topic(topic_id, post_id):
    endpoint = "https://www.example.com/t/" + topic_id + "/posts.json"

    headers = {
        "Content-Type": "application/json",
        "Api-Key": api_key,
        "Api-Username": api_username,
    }

    data = {"post_ids[]": post_id}  # Tentei 0, não funcionou

    response = requests.get(endpoint, headers=headers, data=data)
    if response.status_code == 200:
        return response

FYI Minha Api-Key e Api-Username estão corretas. Minhas outras APIs do discourse funcionam, exceto esta.

Olá, você pode conferir a Discourse API gen
Você encontrará facilmente a API que precisa nesta gem, então não terá que implementá-la separadamente.
Se você ainda precisar de suporte pago, nos avise e moveremos o tópico para o Marketplace para que pessoas interessadas possam entrar em contato com você.

1 curtida

Olá @Ahmed_Gagan

Obrigado pela resposta.

Acho que ainda preciso de suporte pago.

Movi a postagem para o marketplace

Você está enviando um corpo, você deveria estar usando uma requisição POST.

1 curtida

Apenas obtenha o tópico e organize as postagens que você deseja, ignorando as outras.

Além disso, se você tiver o ID da postagem, poderá obter /p/123.

Tentei a API de recuperação de um único post. Ela não retorna “link_counts” e não tem “post_stream”.

Acho que a API get specific posts from topic tem “post_stream”.

E o tópico que estou tentando processar tem mais de 1500 posts…

1 curtida

Talvez você precise codificar seus dados explicitamente como json?

data = '{\"post_ids[]\":' + post_id +'}'

Não funciona.

Também tentei o json.dumps. Não funciona…

Gostaria que tivéssemos alguns exemplos de código…

GET sempre tem uma string de consulta e nunca tem dados de postagem (é por isso que você está recebendo 413 payload too large, ele não espera nada). Ao consultar dados de um servidor sem fazer uma alteração, você (quase) sempre usará GET e não POST. Portanto, você deve usar params= em vez de data=.

Acho que a documentação para esta chamada de API específica está mal formulada (“Request Body schema” realmente indica POST data), então estou movendo isso para Bug e você não precisa me pagar nada.

import requests
import json

def get_post_from_topic(topic_id, post_id):
    endpoint = f"https://forum.example.com/t/{topic_id}/posts.json"
    api_username = 'system'
    api_key = 'REDACTED'
    headers = {
        "Content-Type": "application/json",
        "Api-Key": api_key,
        "Api-Username": api_username,
    }
    params = {
      "post_ids[]": post_id
    }
    response = requests.get(endpoint, headers=headers, params = params) 
    if response.status_code == 200:
        return response

response = get_post_from_topic(6,8)
print(response.json())

{"post_stream": {"posts": [{"id": 8, "name": "system", "username": "system", "avatar_template": "/images/discourse-logo-sketch-small.png", "created_at": "2022-06-26T04:44:23.637Z", "cooked": "<p><a name=\"collect\"></a></p><h2><a name=\"what-information-do-we-collectcollect-1\" class=\"anchor\" href=\"#what-information-do-we-collectcollect-1\"></a><a href=\"#collect\">What information do we collect...
5 curtidas

Funciona!
Muito obrigado @RGJ

2 curtidas

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.