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.

1 me gusta

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.

1 me gusta

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…

1 me gusta

¿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 tiene una cadena de consulta y nunca tiene datos POST (por eso obtienes 413 payload demasiado grande, no espera ninguno). Al consultar datos de un servidor sin realizar un cambio, casi siempre usarás GET y no POST. Por lo tanto, deberías usar params= en lugar de data=.

Creo que la documentación para esta llamada API específica está mal redactada (“Request Body schema” realmente indica POST data), así que lo muevo a 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...
5 Me gusta

¡Funciona!

Muchas gracias @RGJ

2 Me gusta

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