La documentation de l'API Discourse mentionne un "corps de requête" pour une requête GET

J’essaie de créer un script pour obtenir des publications spécifiques d’un sujet. Voir cette page Discourse API Docs

Mais je reçois constamment le code d’état de réponse = 413.

Quelqu’un peut m’aider, s’il vous plaît ! J’enverrai 20 $ sur votre compte PayPal si vous pouvez résoudre ce problème.

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}  # J'ai essayé 0, ça n'a pas marché

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

Pour information, ma clé API et mon nom d’utilisateur API sont corrects. Mes autres API discourse fonctionnent, sauf celle-ci.

Salut, vous pouvez consulter Discourse API gen
Vous y trouverez facilement l’API dont vous avez besoin, vous n’aurez donc pas à l’implémenter séparément.
Si vous avez toujours besoin d’un support payant, faites-le nous savoir et nous déplacerons le sujet vers Marketplace afin que les personnes intéressées puissent vous contacter.

1 « J'aime »

Salut @Ahmed_Gagan

Merci pour votre réponse.

Je pense que j’ai toujours besoin d’une assistance payante.

J’ai déplacé la publication vers la marketplace

Vous envoyez un corps, vous devriez utiliser une requête POST.

1 « J'aime »

Il suffit de récupérer le sujet et de trier les publications que vous souhaitez en ignorant les autres.

De plus, si vous avez l’identifiant de la publication, vous pouvez obtenir /p/123.

J’ai essayé l’API pour récupérer un seul post. Elle ne renvoie pas « link_counts » et n’a pas « post_stream ».

Je pense que l’API pour obtenir des posts spécifiques d’un sujet a « post_stream ».

Et le sujet que j’essaie de traiter compte plus de 1500 messages…

1 « J'aime »

Peut-être devez-vous encoder explicitement vos données en json ?

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

Ça ne fonctionne pas.

J’ai aussi essayé json.dumps. Ça ne fonctionne pas…

J’aimerais que nous ayons des exemples de code…

GET a toujours une chaîne de requête et jamais de données POST (c’est pourquoi vous recevez une erreur 413 Payload Too Large, il ne s’attend à rien). Lorsque vous interrogez des données d’un serveur sans apporter de modification, vous utiliserez (presque) toujours GET et non POST. Vous devriez donc utiliser params= au lieu de data=.

Je pense que la documentation de cet appel d’API spécifique est mal formulée (" Schéma du corps de la requête " indique vraiment POST data) donc je déplace ceci vers Bug et vous n’avez rien à me payer.

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...\n```
5 « J'aime »

Ça marche !

Merci beaucoup @RGJ

2 « J'aime »

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