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
Hector
(Héctor Fernández)
26 Junio, 2022 19:20
6
Estás enviando un cuerpo, deberías estar usando una solicitud POST.
pfaffman
(Jay Pfaffman)
26 Junio, 2022 19:39
7
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…
pfaffman
(Jay Pfaffman)
26 Junio, 2022 19:54
10
¿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…
RGJ
(Richard - Communiteq)
26 Junio, 2022 22:19
13
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...