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

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.

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…

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…

O método GET sempre possui uma string de consulta (query string) e nunca possui dados de envio (post data) — é por isso que você está recebendo o erro 413 “payload too large” (corpo da solicitação muito grande), pois ele não espera nenhum dado. Ao consultar dados de um servidor sem realizar alterações, você (quase) sempre usará GET e não POST. Portanto, você deve usar params= em vez de data=.

Acho que a documentação para essa chamada específica da API está mal redigida (“Request Body schema” realmente indica o envio de dados POST), então estou movendo isso para Contribute > 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>\n<h2>\n<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...

Funciona!
Muito obrigado @RGJ