Interact with discourse from Python?

Большое спасибо! Да, я это сделаю! Меня конкретно интересуют просмотры страниц (зарегистрированные пользователи, анонимные пользователи, поисковые боты), но я не могу найти эту информацию в документации по API. Есть какие-то подсказки?

Некоторые вызовы, специфичные для администратора, отсутствуют в документации API.

Откройте вкладку сети, перейдите на страницу администратора, просмотрите отчёт с нужными вам данными, а затем проверьте вкладку сети, чтобы увидеть, что загрузил браузер.

Это по сути краткое изложение Reverse engineer the Discourse API

Что я бы сделал, так это использовал бы плагин Data Explorer, чтобы получить нужные данные, а затем можно было бы извлечь их через API. Запуск запросов Data Explorer с помощью API Discourse

Абсолютно верно; если вам нужны данные, отличающиеся от тех, что уже доступны в панели администратора, то DE — это правильный выбор.

Это также гарантирует, что эти запросы не будут возвращать другие данные после обновления, НО при этом базовые структуры могут измениться, и вам, возможно, придется поддерживать запрос.

В любом случае есть компромиссы.

Спасибо вам обоим! Мне удалось обойтись методом «реверс-инжиниринга» + API-ключом! Большое спасибо!

Чуть опоздал к этому разговору (ну, к его продолжению :p), но я тоже хотел получать данные из форума Discourse и не хотел возиться с настройкой API-ключа. Если вы (или кто-то ещё) хотите простое обёртку для извлечения постов с любого форума Discourse, можете посмотреть её здесь: GitHub - elninotech/discourse-reader: A simple Python wrapper for reading data from Discourse forums · GitHub

Библиотека опубликована на PyPi, поэтому легко устанавливается через pip/uv, автоматически обрабатывает ограничение частоты запросов и имеет статическую типизацию с помощью Pydantic (на мой взгляд, это улучшает опыт разработки). Пример использования:

from discourse_reader import DiscourseClient

client = DiscourseClient("https://meta.discourse.org")

# Просмотр категорий
for cat in client.categories():
    print(f"{cat.name}: {cat.topic_count} тем")

# Получение темы со всеми её постами
topic = client.topics.get(12345)
print(topic.title)
print(topic.opening_post.cooked)       # исходный пост (HTML)
print(topic.accepted_answer)           # принятый ответ или None
for reply in topic.posts.replies():
    print(reply.username, reply.cooked)

Конечно, это не даст лучших или более быстрых данных, чем плагин Data Explorer, но, на мой взгляд, это удобно, если нужно быстро получить пакет тем или простую статистику сайта :slight_smile:

У меня сложилось впечатление, что такой подход может нарушать правила использования этого форума и стандартные правила использования форумов на платформе Discourse.

Вы не можете автоматизировать доступ к форуму или осуществлять его мониторинг, например, с помощью веб-краулера, расширения браузера или другого компьютерного программного обеспечения, не являющегося веб-браузером. Вы можете сканировать форум для индексации в общедоступной поисковой системе, если вы её администрируете.

Хм. Я не думаю, что делаю что-то особенное, кроме как просто оборачиваю обычный запрос curl к любому из публично документированных API-эндпоинтов. Однако, если команда @Discourse обидится на то, что я создал, пожалуйста, дайте мне знать.

Лично я не думаю, что сам пакет нарушает какие-либо Условия использования (ToS), поскольку ответственность за соблюдение условий форума всегда лежит на разработчике, использующем инструмент. Этот пакет обращается только к публичным и документированным API-эндпоинтам; если у разработчика есть злонамеренный умысел на скрапинг или мониторинг форума, это и так уже тривиальная задача.

Кстати, pydiscourse предлагает аналогичный функционал; единственное отличие — необходимость наличия API-ключа (я не знаю, насколько это легко сделать обычному пользователю), после чего его также можно использовать для нарушения условий использования любого форума. Так что если правило по умолчанию заключается в том, чтобы не автоматизировать доступ к форуму, не нарушают ли ToS и pydiscourse, и discourse2? discourse2 даже рекламирует доступ к общедоступным данным в списке своих функций, если API-ключ не предоставлен:

Работает как в серверной, так и в браузерной* среде (*полезно для запроса публичных данных без API-ключей и с соответствующего источника, например, последние темы и т. д.)

Скорее всего, существует множество других пакетов на других языках, которые уже поддерживают такой тип доступа.

Немного контекста: я создал это, чтобы легко извлекать данные с форума, который размещает один из наших клиентов (но у нас нет прямого доступа к базе данных). Это просто делает мой рабочий процесс чище, и я надеюсь помочь другим, оказавшимся в такой же ситуации.

Дело в том, что для генерации API-ключа сначала нужен доступ к панели администратора (Администратор > Дополнительно > API-ключи), поэтому предоставление API-ключа — это то, что администраторы хотят сделать; любой обычный пользователь не может его получить.

Да, если единственный способ получить API-ключ — через административный интерфейс, то этот пакет может упростить нарушение условий использования (ToS) конкретного форума.

Тем не менее, я всё ещё хотел бы обсудить некоторые другие пункты, которые я поднял, и узнать мнение других людей по ним, а именно: любой уже мог тривиально собирать данные или мониторить их с помощью curl или requests. Не должна ли ответственность лежать на разработчике за то, чтобы не нарушать ToS? Или она должна лежать на самих инструментах, которые они используют?

Что касается discourse2 и подобных пакетов, они имеют более широкое назначение, но discourse2 всё ещё заявляет о возможности работы с публичными конечными точками, если API-ключ не предоставлен. Способствует ли это нарушению ToS в той же степени?

Также, поскольку Discourse распространяется под лицензией GPLv2, не нарушает ли создание инструмента вроде discourse-reader какие-либо условия напрямую?

Интересно узнать мнение других людей по этим вопросам.

Официальный ruby-гем discourse_api также поддерживает доступ к публичным данным форума без API-ключа. Поэтому я считаю, что существование такого инструмента вполне допустимо. Ответственность за соблюдение условий использования конкретного форума лежит на пользователях.

(Это моё личное мнение, а не официальное юридическое заявление от CDCK :sweat_smile:)

Стоит также отметить, что неаутентифицированные запросы от ботов подпадают под гораздо более строгие ограничения частоты запросов и могут сталкиваться с другими уровнями защиты от ботов (например, Cloudflare). Поэтому, если есть возможность, всегда лучше использовать API-ключ.

Спасибо за ответ! На данный момент я обновил README в своём пакете, добавив предупреждение о необходимости соблюдать Условия использования (ToS) любого сайта, к которому разработчик может захотеть применить этот инструмент.

Я совершенно не знал об этом стандартном правиле ToS, когда создавал пакет. Надеюсь, что в будущем любой, кто захочет использовать этот пакет, тоже узнает об этом :slight_smile:

Да, это прямо перекликается с аргументами в пользу видеомагнитофонов… довольно давно. Точно так же и отмычки. Существуют законные и незаконные способы использования инструментов, и ответственность за это лежит на операторе.

Опять же, я не юрист, и это не официальное заявление, но мне кажется, что это точно отражает нашу точку зрения по этому вопросу:

Существует большая разница между добросовестным исследованием с помощью инструмента (например) и настройкой автоматизации.

Мы не будем злиться на людей, использующих Meta с помощью таких инструментов, особенно если они разрабатывают функциональность или изучают взаимодействие с API Discourse. Мы будем это поощрять, пока вы не занимаетесь массовым сбором данных, не создаете излишнюю нагрузку и не ухудшаете опыт других пользователей.