通过 API 授予自定义徽章

您可以在论坛中自定义徽章,并通过 API 授予这些徽章。这是一种无需使用自定义徽章 SQL 即可授予徽章的绝佳方式。

要通过 API 授予徽章,您需要知道目标用户的用户名,以及您希望授予的徽章的 ID(或名称)。此外,请确保您已从网站的“管理 > API > 密钥”部分(/admin/api/keys)生成了 API 密钥。

查找徽章 ID

您可以从徽章的 URL 中获取徽章 ID。进入“管理/徽章”部分,然后点击您希望授予的徽章。URL 将类似于:https://forum.example.com/admin/badges/102。URL 中的最后一个数字即为徽章 ID。

发起 API 调用

要测试 API 调用,您可以尝试使用 curl 或 Postman 授予徽章。以下是我如何通过计算机终端使用 curl 授予徽章的示例。

首先,为方便起见,设置一个 api_key 变量:

api_key=yourapikey

然后,将 ID 为 102 的徽章授予用户 bobby

curl -X POST "https://forum.example.com/user_badges" \
-H "Api-Key: $api_key" \
-H "Api-Username: system" \
-F "username=bobby" \
-F "badge_id=102" \
-F "reason=https://forum.example.com/t/whats-the-best-photo-youve-ever-taken/160/2"

除了 badge_id,您还可以使用 badge_name 通过徽章名称来标识徽章:

-F "badge_name=My Custom Badge"

reason 参数是可选的。如果您提供该参数,则必须将其设置为网站上某个主题或帖子的 URL。

您应该会收到一个包含徽章详情及授予时间的 JSON 响应。

27 个赞

Has anybody added a badge (or flair) via Zapier to Discourse API like outlined here?

Also, seems like a great candidate for an action via the official integration, @HAWK.

3 个赞

另请参阅 https://meta.discourse.org/t/how-to-create-a-custom-badge-with-an-image-through-the-api/210616,其中展示了如何上传,并提供了另一个授予徽章的示例(使用 Python)。

1 个赞

此方法未在 https://docs.discourse.org/ 的 API 文档中说明的原因是什么?

我在那里找不到这个。

2 个赞

因为似乎没有人负责维护这些文档的完整性或及时更新,而且有好心人在这里发布了这些说明。通常,API 的文档是通过 逆向工程 Discourse API 和查看源代码来获取的。

7 个赞

太好了,那是不是没有办法通过 API 自动授予此类徽章了?

例如,某人因回复获得 5,000 个赞而被授予徽章。

1 个赞

如果您是自托管用户或企业版用户,您需要启用徽章 SQL

2 个赞

如果你无法启用徽章 SQL,技术上来说可以实现自动化,但这需要分两步进行。首先,发出 API 请求运行一个数据探索器查询,该查询将返回符合你条件但尚未获得徽章的用户的用户名:使用 Discourse API 运行数据探索器查询。然后,使用该查询返回的用户名通过 API 授予徽章。

不过,这感觉有点效率低下。据我所知,没有一个路由可以一次性向多个用户授予徽章,因此,根据符合条件的用户的数量,你可能会发出大量的 API 请求。

最终,这似乎是自动化插件可以处理的事情。可以有一个定期触发器来运行具有给定查询 ID 的数据探索器查询。根据查询返回的字段,结果可用于触发各种脚本。例如,如果查询返回了 username 字段,则可用于运行授予徽章、将用户添加到组等的脚本。

2 个赞

这不会导致最初禁用徽章 SQL 的相同问题吗?

1 个赞

我不这么认为。Data Explorer 查询在 10 秒后超时的事务块中运行。我认为这样做的目的是避免徽章查询可能触发的那种问题。如果配置不当,低效的 Data Explorer 查询可能会导致网站崩溃。

现在想想,我想知道自定义徽章 SQL 是否可以有同样的保护措施。

4 个赞