Discourse を Python から操作できますか?

みなさん、こんにちは!Discourse が大好きです。私たちのコミュニティの根幹をなす存在です。

私たちは GitHub で強力なプレゼンスを持つオープンソースプロジェクトです。Python で書かれたロボットが GitHub リポジトリを管理しており、承認されたプルリクエストを自動的にマージするなどの作業を行っています。リポジトリが多数あり、全員がすべてのリポジトリを追跡しているわけではないため、新しいプロジェクトが作成されたときや、プルリクエストのレビューが必要なときに、そのロボットがフォーラムに投稿してくれたら素晴らしいでしょう。

Python から Discourse API を呼び出す最適な方法について、どなたかご教示いただけますでしょうか?

「いいね!」 3

There is a python discourse api library that is a few years old:

And a forked version that has been updated somewhat recently:

Hopefully the latter one will work for you.

Also this plugin may be of interest to you:

https://meta.discourse.org/t/the-github-linkback-plugin/66081

「いいね!」 7

Thanks @blake! That is exactly the kind of thing I needed to get started.

I will report back with my successes.

「いいね!」 2

I recently started a project for this, and am actively updating it. Currently working towards the next dot release:

https://github.com/samamorgan/discourse

「いいね!」 10

うまくいきましたか?私も試しています。"DiscourseClientError: Payload Too Large"というエラーが繰り返し表示されます。

「いいね!」 1

週末にトピックを取得しようとした際、私も突然このエラーが発生しました。このトピック取得コードは1年以上変更されていないため、API の何かが変更されたに違いありません。現在調査中です。

「いいね!」 2

Payload Too Large のエラーは、この変更 に起因します。

上記のプロジェクトについては存じ上げませんが、bennylope 氏のプロジェクトの状況は以下の通りです。同様の修正が他のラッパーにも必要かもしれません。

GitHub - pydiscourse/pydiscourse: A Python library for the Discourse API · GitHub の issue #38 で問題が解決していますが、修正版はまだ PyPI に公開されていません - https://github.com/bennylope/pydiscourse/issues/38。GitHub@bennylope 氏による公開を待っている状況です。そのため、PyPI の更新を待つか、git pull master で master ブランチを直接取得してください。

「いいね!」 5

ありがとうございます!これでうまくいきました。pydiscourse をアンインストールし、あなたが提案してくれた内容に基づいてローカルコピーを使用しました。そして、今では動作しています!
最新の投稿の感情分析を取得するために、Python の感情分析ツールを使用しようとしています。進捗状況については、改めて報告いたします。

「いいね!」 1

これを使っている人は他にいますか?これでトピックあたり20件以上の投稿を取得できますか?

「いいね!」 1

おそらくページネーションを使用する必要があります。投稿に特化して試したことはありませんが、以下のような方法があります:

pagesize = 20
for page in range(100):
    client.posts(topic_id, limit=pagesize, offset=page*pagesize)
「いいね!」 3

はい、これは古い投稿であることは承知していますが、本質的に私が求めているものなので、この投稿を最新の状態に保つだけで新しい投稿を作成する必要はないでしょう。

多くのプログラミング言語でプログラムを書く方法を知っていますが、残念ながらRubyはその一つではありません。この質問に対する新しい、より良い答えはありますか?

PythonからDiscourseと対話する?


余談ですが、DiscourseプラグインやテーマはPythonで作成できますか?

「いいね!」 1

テーマは絶対に無理です。JavaScript、CSS、HTMLのみです。

プラグイン:まあ、できます。

Ruby(on Rails)ベースのDiscourseプラグインにPythonモジュールをインポートし、Pycallを使用してPython関数を呼び出すことができます:GitHub - red-data-tools/pycall.rb: Calling Python functions from the Ruby language

RoRエコシステムで同等のモジュールがメンテナンスされていないため、非常に特定の目的で本番環境で使用しています。これにより、その専門的なコードをRubyに翻訳してからメンテナンスする必要がなくなります。

驚くほどうまく機能します。

とはいえ、そのプラグインの基本はまだRubyで書かれています。

Ruby on Railsも学ぶことをお勧めします。非常に快適な言語であり、私の意見ではPythonよりもコードが読みやすいです:slight_smile

必要に応じて、Pythonについてももっと学ぶ時間を取りたいと思います。

興味深いサイドノート:Discourse Chatbot 🤖 にあるエージェントの動作を作成するコードの一部は、「Funkagent」というPythonエージェントに基づいており、最初にRuby on Railsに翻訳(その後、変更、強化)しました。したがって、意味がある場合は、翻訳も選択肢になります。その場合、意味がありました。

「いいね!」 3

ありがとうございます。

それは妥当な回答であり、検討すべき選択肢です。

「いいね!」 1

私はRubyを「学んだ」前にいくつかのインポートスクリプトを書きました。やりたいことによっては、現在のスキルセットで思っている以上にできることがあるかもしれません。Rubyを使う方が、何か他のものを使いこなす方法を考えるよりも簡単でしょう。

ただし、APIとやり取りするのであれば、好きな言語を使用できます。

「いいね!」 5

Rubyは美しくデザインされており、私の意見では簡単に習得できます。

Ruby on Railsはもう少し学習が必要で、フレームワークとして慣習に依存しているため、時には扱いにくいこともありますが、慣れてしまえば非常に強力です。

「いいね!」 2

3件の投稿が新しいトピックに分割されました: プログラマー以外が Discourse AI - AI ボットを使用してプラグインやテーマを作成するのを支援するのはどれくらい難しいでしょうか

何が可能かを見る方法として、GitHub - discourse/all-the-plugins を確認できます。

シンプルに見える、やりたいことを選択してください。記念日の定義を変更する cakeday のようなものが欲しい場合は、cakeday が良い出発点になるかもしれません。変更したい小さなことを1つ選択し、一度に1つの小さなステップで物事を行います。

「いいね!」 2

ハハ、最近独学でRubyを学んでいます。本当に楽しいです。 :exploding_head:

「いいね!」 3

皆さん、こんにちは。私もPythonからDiscourseのデータ(主に閲覧数とユーザー数)を取得することに興味があります。ここにリストされているパッケージの多くは、もうアクティブではないようです。2026年現在、これを行うための新しい標準的な方法はありますか?

よろしくお願いします!

「いいね!」 1

必ずしも誰かのインターフェースを使う必要はありません。

組み込みのrequestsライブラリを使えばそれほど手間はかかりませんし、何か(例えば、すでに設定済みのPostmanなど)を使えば、私たちのAPI仕様をインポートして、そこからコードを生成させることができます。

そして、それをあなたのニーズに合わせて調整します。

import json
import pandas
import requests

url = "https://try.discourse.org/categories.json?include_subcategories=false"

payload = {}
headers = {
  'Accept': 'application/json'
}

response = requests.request("GET", url, headers=headers, data=payload)
response_data = json.loads(response.text)
data = pandas.DataFrame(response_data['category_list']['categories']).set_index('id')

これでカテゴリ情報が得られます。

            name   color text_color  ... uploaded_background_dark                                             topics can_vote
id                                   ...                                                                                     
5        general  25AAE2     FFFFFF  ...                     None  [{'fancy_title': 'Testing dulu ya jangan di hi...      NaN
4         videos  258af1     FFFFFF  ...                     None  [{'fancy_title': 'Ikan ganteng yang\u0026rsquo;\u0026rdq...      NaN
86      calendar  12A89D     FFFFFF  ...                     None  [{'fancy_title': 'Category Calendar demo topic...      NaN
2           tech     444     FFFFFF  ...                     None  [{'fancy_title': 'Poll: What\u0026rsquo;s your pref...      NaN
1      discourse  00B355     FFFFFF  ...                     None  [{'fancy_title': 'Welcome to our demo!', 'id':...      NaN
53  Topic Voting  F7941D     FFFFFF  ...                     None  [{'fancy_title': 'Is this topic worth voting f...     True
6         gaming  800080     FFFFFF  ...                     None  [{'fancy_title': 'Impressions Games City Build...      NaN
8         movies  B22222     FFFFFF  ...                     None  [{'fancy_title': 'What\u0026rsquo;s your all-time f...      NaN
9         sports  0000FF     FFFFFF  ...                     None  [{'fancy_title': 'Modernizing the antiquated b...      NaN

[9 rows x 45 columns]

保護された情報にアクセスしたい場合は、APIキーを使用することをお勧めします。

「いいね!」 6