Chatbot id -4 的账户:为什么无法通过后台删除,有哪些绕过方法?

在通过 Discourse 核心代码和 Admin API 分析后的工作笔记(hoee 仓库中的 Cursor 分支)。

对象

在实例上的管理员卡片:/admin/users/-4/chatbot管理后台中的 Chatbot)。

管理员 JSON 返回内容(检查截图)

  • id: -4(根据核心规则,这是机器人:只有 user_id > 0 才代表“真实用户”)
  • username: Chatbot
  • admin: true
  • moderator: false
  • post_count: 0
  • can_be_deleted: false
  • can_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 插件在更新时可能重新创建机器人;在插件修复状态前,可能出现“缺少机器人用户”的提示。

上游代码参考链接

如需,可在回复中单独提供“如何通过 Admin → 设置 → discourse-ai 插件检查当前 ai_bot_enabled 值”的操作指南(无需 API)。

更新:账户已删除

该操作未通过 Admin API 在主机上执行(Guardian 仍禁止对负 id 进行访问),而是通过 rails runner 在生产环境的 app 容器内由用户 discourse 执行:

  • 通过 update_columns + reloadUser.find(-4)admin 标志移除;
  • 随后由具有 id > 0 的活跃管理员调用 UserDestroyer,并启用选项 delete_posts: true(本例中无任何帖子)。

外部验证:GET /u/chatbot.json 已不再返回用户,GET /admin/users/-4/list.json —— not_found

提醒:当重新启用 discourse-ai 插件时,若需要,该插件可能会再次创建机器人账户。