Большое спасибо! Да, я это сделаю! Меня конкретно интересуют просмотры страниц (зарегистрированные пользователи, анонимные пользователи, поисковые боты), но я не могу найти эту информацию в документации по 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, но, на мой взгляд, это удобно, если нужно быстро получить пакет тем или простую статистику сайта ![]()
У меня сложилось впечатление, что такой подход может нарушать правила использования этого форума и стандартные правила использования форумов на платформе 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
)
Стоит также отметить, что неаутентифицированные запросы от ботов подпадают под гораздо более строгие ограничения частоты запросов и могут сталкиваться с другими уровнями защиты от ботов (например, Cloudflare). Поэтому, если есть возможность, всегда лучше использовать API-ключ.
Спасибо за ответ! На данный момент я обновил README в своём пакете, добавив предупреждение о необходимости соблюдать Условия использования (ToS) любого сайта, к которому разработчик может захотеть применить этот инструмент.
Я совершенно не знал об этом стандартном правиле ToS, когда создавал пакет. Надеюсь, что в будущем любой, кто захочет использовать этот пакет, тоже узнает об этом ![]()
Да, это прямо перекликается с аргументами в пользу видеомагнитофонов… довольно давно. Точно так же и отмычки. Существуют законные и незаконные способы использования инструментов, и ответственность за это лежит на операторе.
Опять же, я не юрист, и это не официальное заявление, но мне кажется, что это точно отражает нашу точку зрения по этому вопросу:
Существует большая разница между добросовестным исследованием с помощью инструмента (например) и настройкой автоматизации.
Мы не будем злиться на людей, использующих Meta с помощью таких инструментов, особенно если они разрабатывают функциональность или изучают взаимодействие с API Discourse. Мы будем это поощрять, пока вы не занимаетесь массовым сбором данных, не создаете излишнюю нагрузку и не ухудшаете опыт других пользователей.