La documentación de la API de Discourse menciona un "cuerpo de solicitud" para una solicitud GET

Estoy intentando crear un script para obtener publicaciones específicas de un tema. Vea esta página Discourse API Docs

Pero sigo recibiendo el código de estado de respuesta = 413.

¡Alguien me ayude, por favor! Enviaré $20 a su cuenta de PayPal si puede resolverlo.

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}  # Intenté con 0, no funcionó

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

Para tu información, mi Api-Key y Api-Username son correctos. Mis otras APIs de Discourse funcionan excepto esta.

Hola, puedes consultar Discourse API gen
Encontrarás fácilmente la API que necesitas en esta gema, por lo que no tendrás que implementarla por separado.

Si aún necesitas soporte de pago, háznoslo saber y moveremos el tema a Marketplace para que las personas interesadas puedan contactarte.

Hola @Ahmed_Gagan

Gracias por tu respuesta.

Creo que todavía necesito soporte de pago.

Moví la publicación al marketplace

Estás enviando un cuerpo, deberías estar usando una solicitud POST.

Simplemente obtén el tema y selecciona las publicaciones que desees, ignorando las demás.

Además, si tienes el ID de la publicación, puedes obtener /p/123.

Intenté usar la API para recuperar una sola publicación. No devuelve “link_counts” y no tiene “post_stream”.

Creo que la API para obtener publicaciones específicas de un tema tiene “post_stream”.

Y el tema que estoy intentando procesar tiene más de 1500 publicaciones…

¿Quizás necesites codificar tus datos explícitamente como json?

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

No funciona.

También acabo de probar json.dumps. No funciona…

Ojalá tuviéramos algunos ejemplos de código…

GET siempre incluye una cadena de consulta y nunca contiene datos de envío (por eso obtienes el error 413 payload too large, ya que no espera ningún dato). Cuando consultas datos de un servidor sin realizar cambios, casi siempre deberás usar GET en lugar de POST. Por lo tanto, deberías usar params= en lugar de data=.

Creo que la documentación de esta llamada específica a la API está mal redactada (“Request Body schema” indica claramente el uso de POST data), así que traslado este tema a Contribute > Bug y no necesitas pagarme 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!

Muchas gracias @RGJ