Discourse APIのドキュメントにGETリクエストの「リクエストボディ」という記載があります

トピックから特定の投稿を取得するスクリプトを作成しようとしています。このページを参照してください: Discourse API Docs

しかし、レスポンスステータスコードが常に413になります。

どなたか助けてください!解決できたらPayPalアカウントに20ドル送ります。

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}  # 0を試しましたが、うまくいきませんでした

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

念のため、私のApi-KeyとApi-Usernameは正しいです。他のディスコースAPIは機能しますが、これは機能しません。

Discourse API gen を確認できます。

このgemで必要なAPIが簡単に見つかるため、別途実装する必要はありません。

それでも有料サポートが必要な場合は、お知らせください。トピックを Marketplace に移動し、関心のある方が連絡できるようにします。

「いいね!」 1

@Ahmed_Gagan様

返信ありがとうございます。

有料サポートが必要なようです。

投稿をマーケットプレイスに移動しました

ボディを送信していますが、POSTリクエストを使用する必要があります。

「いいね!」 1

トピックを取得し、不要な投稿を無視して、必要な投稿を整理してください。

また、投稿IDがあれば /p/123 で取得できます。

投稿を1件取得するAPIを試しましたが、「link_counts」が返されず、「post_stream」もありませんでした。

トピックから特定の投稿を取得するAPIには「post_stream」があると思います。

そして、私が処理しようとしているトピックには1500件以上の投稿があります…

「いいね!」 1

データを明示的にJSONとしてエンコードする必要があるかもしれません。

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

機能しません。

json.dumpsも試しましたが、機能しません…

コード例があればいいのに…

GET は常にクエリ文字列を持ち、POST データを持つことはありません(そのため、413 Payload Too Large が返されるのは、POST データが予期されていないためです)。変更を加えることなくサーバーからデータを照会する場合は、(ほぼ) 必ず GET を使用し、POST は使用しません。したがって、data= の代わりに params= を使用する必要があります。

この特定の API 呼び出しのドキュメントは、悪く表現されていると思います(「リクエストボディスキーマ」は POST data を示唆しています)。そのため、これを Bug に移動します。料金は不要です。

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

うまくいきました!

@RGJ さん、ありがとうございました。

「いいね!」 2

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