Я пытаюсь создать скрипт для получения конкретных постов из темы. Посмотрите эту страницу: Discourse API Docs
Но я постоянно получаю код статуса ответа 413.
Помогите, пожалуйста! Если сможете решить проблему, переведу $20 на ваш PayPal.
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-ключ и имя пользователя для API верны. Другие API Discourse работают, кроме этого.
Привет! Вы можете ознакомиться с Discourse API gen .
В этом геме вы легко найдёте необходимый API, поэтому вам не придётся реализовывать его отдельно.
Если вам всё же нужна платная поддержка, дайте нам знать — мы перенесём тему в Marketplace , чтобы заинтересованные лица могли связаться с вами.
Привет, @Ahmed_Gagan
Спасибо за ответ.
Думаю, мне всё ещё нужна платная поддержка.
Я переместил пост в раздел «Доска объявлений»
Hector
(Héctor Fernández)
26.Июнь.2022 19:20:50
6
Вы отправляете тело запроса, поэтому следуете использовать POST-запрос.
pfaffman
(Jay Pfaffman)
26.Июнь.2022 19:39:08
7
Просто выберите тему и отфильтруйте нужные сообщения, проигнорировав остальные.
Кроме того, если у вас есть идентификатор сообщения, вы можете перейти по ссылке /p/123.
Я попробовал вызвать API для получения одного сообщения. Он не возвращает «link_counts» и не содержит «post_stream».
Похоже, что API для получения конкретных сообщений из темы включает «post_stream».
И тема, которую я пытаюсь обработать, содержит более 1500 сообщений…
pfaffman
(Jay Pfaffman)
26.Июнь.2022 19:54:01
10
Возможно, вам нужно явно закодировать ваши данные как JSON?
data = '{"post_ids[]":' + post_id +'}'
Это не работает.
Я только что также попробовал json.dumps. Не работает…
Хотелось бы, чтобы у нас были примеры кода…
RGJ
(Richard - Communiteq)
26.Июнь.2022 22:19:35
13
GET всегда использует строку запроса и никогда не содержит POST-данных (именно поэтому вы получаете ошибку 413 «payload too large» — сервер не ожидает их). При запросе данных с сервера без внесения изменений вы (почти) всегда будете использовать GET, а не POST. Поэтому вам следует использовать params=, а не data=.
Кажется, документация для этого конкретного вызова API составлена некорректно («Request Body schema » действительно указывает на POST-данные), поэтому я переношу это в 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\">Какую информацию мы собираем...