在通过 Discourse 核心代码和 Admin API 分析后的工作笔记(hoee 仓库中的 Cursor 分支)。
对象
在实例上的管理员卡片:/admin/users/-4/chatbot(管理后台中的 Chatbot)。
管理员 JSON 返回内容(检查截图)
id: -4(根据核心规则,这是机器人:只有user_id > 0才代表“真实用户”)username: Chatbotadmin: truemoderator: falsepost_count: 0can_be_deleted: falsecan_be_anonymized: false
为什么 can_be_deleted: false 即使帖子数为 0
在 Guardian#can_delete_user? 中,如果目标用户是 管理员,则删除被禁止。这与帖子数量无关。
为什么通过 UI 或管理员 HTTP 请求经常“失败”
对于诸如 revoke admin / destroy 这类操作,当目标 ID 为负数时,Guardian#can_administer? 不通过:其中有一个条件要求目标 ID 为正数(obj.id.positive?)。因此,对普通用户名的 member 路由请求会返回 404,而对 -4 这类 ID,即使 API 身份是 staff,也可能返回 403 invalid_access。
结论:通过标准 Admin API 以与普通用户相同的 UX 来撤销管理员权限或删除账户是不可行的——需要另一个路径(见下文)。
非破坏性方法:不删除数据库记录
在网站设置中禁用 AI 机器人模块:设置参数 ai_bot_enabled(设为 false,GPT 机器人及其相关 UI(如私信/页眉)将被禁用;用户记录仍可保留)。
在 checkout hoee 仓库并配置 discourse.env 文件的机器上,添加以下脚本辅助工具:
scripts/discourse-ai-chatbot-operator.sh audit- 快速导出/admin/users/-4/list.json中的字段ai-bot-disable/ai-bot-enable- 向ai_bot_enabled发送 PUT 请求(需使用discourse.env中的 system 密钥,勿公开)
强制路径:真正删除用户
仅在 Discourse 应用主机上执行,操作前需备份数据库:在 Rails 控制台中,将用户记录的 admin 标志设为 false(例如使用 update_columns),然后由真实管理员(id > 0)调用 UserDestroyer,如需删除帖子,可设置 delete_posts: true。复制代码块:scripts/discourse-ai-chatbot-operator.sh rails-destroy-snippet。
风险:discourse-ai 插件在更新时可能重新创建机器人;在插件修复状态前,可能出现“缺少机器人用户”的提示。
上游代码参考链接
- discourse/discourse
app/models/user.rb-human?/ 负数 ID - discourse/discourse
lib/guardian.rb-can_administer? - discourse/discourse
lib/guardian/user_guardian.rb-can_delete_user?
如需,可在回复中单独提供“如何通过 Admin → 设置 → discourse-ai 插件检查当前 ai_bot_enabled 值”的操作指南(无需 API)。