Discourse API docs erwähnen einen "request body" für einen GET request

Ich versuche, ein Skript zu erstellen, um bestimmte Beiträge aus einem Thema abzurufen. Sehen Sie sich diese Seite an: Discourse API Docs

Aber ich erhalte immer den Antwortstatuscode = 413.

Bitte helfen Sie mir! Ich schicke Ihnen 20 $ auf Ihr PayPal-Konto, wenn Sie es lösen können.

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}  # Ich habe 0 versucht, hat nicht funktioniert

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

FYI, mein Api-Key und Api-Benutzername sind korrekt. Meine anderen Discourse-APIs funktionieren, außer dieser.

Hallo, Sie können sich Discourse API gen ansehen.

Dort finden Sie die benötigte API ganz einfach, sodass Sie sie nicht separat implementieren müssen.

Wenn Sie dennoch kostenpflichtigen Support benötigen, lassen Sie es uns wissen. Wir werden das Thema dann in die Rubrik Marketplace verschieben, damit interessierte Personen Sie kontaktieren können.

1 „Gefällt mir“

Hallo @Ahmed_Gagan

Danke für die Antwort.

Ich denke, ich brauche immer noch kostenpflichtigen Support.

Ich habe den Beitrag in den Marktplatz verschoben

Sie senden einen Body, Sie sollten eine POST-Anfrage verwenden.

1 „Gefällt mir“

Holen Sie sich einfach das Thema und sortieren Sie die gewünschten Beiträge aus, indem Sie die anderen ignorieren.

Wenn Sie außerdem die Beitrags-ID haben, können Sie /p/123 aufrufen.

Ich habe die API zum Abrufen eines einzelnen Beitrags ausprobiert. Sie gibt keine „link_counts“ zurück und hat keinen „post_stream“.

Ich glaube, die API zum Abrufen bestimmter Beiträge aus einem Thema hat einen „post_stream“.

Und das Thema, das ich zu verarbeiten versuche, hat über 1500 Beiträge…

1 „Gefällt mir“

Vielleicht müssen Sie Ihre Daten explizit als JSON kodieren?

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

Es funktioniert nicht.

Ich habe auch gerade json.dumps ausprobiert. Funktioniert nicht…

Ich wünschte, wir hätten einige Codebeispiele…

GET hat immer eine Query-String und niemals Post-Daten (deshalb erhalten Sie 413 Payload zu groß, es erwartet keine). Wenn Sie Daten von einem Server abfragen, ohne eine Änderung vorzunehmen, verwenden Sie (fast) immer GET und nicht POST. Sie sollten also params= anstelle von data= verwenden.

Ich denke, die Dokumentation für diesen spezifischen API-Aufruf ist schlecht formuliert (“Request Body schema” deutet wirklich auf POST data hin), daher verschiebe ich dies zu Bug und Sie müssen mir nichts bezahlen.

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><h2><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 „Gefällt mir“

Es funktioniert! Vielen Dank @RGJ

2 „Gefällt mir“

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