如何用 Python 与 Discourse 交互?

大家好!我们热爱 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 个赞

周末尝试获取主题时,我也突然遇到了这个错误。这段获取主题的代码已经超过一年没有改动,所以一定是 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 获取最新代码。

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 交互?


作为附带问题,可以使用 Python 创建 Discourse 插件和/或主题吗?

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 可以是一个很好的起点。你需要选择一个你想改变的小东西,然后一次只做一小步。

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’&rdq...      NaN
86      calendar  12A89D     FFFFFF  ...                     None  [{'fancy_title': 'Category Calendar demo topic...      NaN
2           tech     444     FFFFFF  ...                     None  [{'fancy_title': 'Poll: What’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’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 个赞