- 后端
- 前端
- 协同办公
- 即时通讯
- 企业应用
【免费下载链接】dootask
DooTask是一款开源在线项目任务管理工具,提供各类文档协作工具、在线思维导图、在线流程图、项目管理、任务分发、即时IM,文件管理等工具;同时消息功能使用非对称加密技术让你的沟通更安全。
DooTask 的机器人(bot)是一类特殊的用户账号,其查看、编辑、删除权限由后端按「所有权 + 类型」两重维度硬性校验:自建机器人只认创建者本人,系统机器人只认管理员且不可删除。本文基于源码接口(bot__info/bot__edit/bot__delete)逐条拆解权限判定逻辑,并给出「不是你的机器人」「权限不足」「系统机器人不能删除」「超过最大创建数量」等高频报错的完整排查与解决路径,读完即可独立完成机器人权限问题的定位与处理。
一、先建立权限模型:机器人分三类,权限只有两层
DooTask 把机器人分为三类(详见 机器人是什么):
| 类型 | 邮箱特征 | 谁能操作 |
|---|---|---|
| 内置系统机器人 | 以@bot.system结尾,名称在白名单内 | 普通用户只能使用;仅系统管理员(userIsAdmin)可改昵称/头像;任何人都不能删除 |
| 用户自建机器人 | 邮箱前缀为user-normal-/user-session-,如user-normal-xxxx@bot.system | 只有创建者(主人)本人可查看 / 改 / 删 |
| Webhook 接入 | 自建机器人配置webhook_url后具备的扩展能力 | 归属权随自建机器人 |
虽然类型有三类,但权限校验实际只有两层:
- 自建机器人 → 主人:
user_bots.userid必须与当前登录用户一致; - 系统机器人 → 管理员:凭
User::isAdmin()判断,普通成员看得到但所有写操作都会被拦。
官方 FAQ 明确强调:没有「全局机器人管理员」角色,只有上述两层;且机器人权限由后端硬性判断,前端隐藏按钮不等于绕过校验——直接调用接口同样会被拦截。
二、后端校验入口:三个接口共享同一套判定逻辑
机器人相关接口集中在 app/Http/Controllers/Api/UsersController.php,分别是:
| 接口 | 方法 | 作用 |
|---|---|---|
api/users/bot/info | bot__info | 获取机器人信息 |
api/users/bot/edit | bot__edit | 添加 / 编辑机器人 |
api/users/bot/delete | bot__delete | 删除机器人 |
三个接口的权限判定模式完全一致,核心逻辑如下(以bot__delete为例):
$botUser = User::whereUserid($botId)->whereBot(1)->first(); if (empty($botUser)) { return Base::retError('机器人不存在'); } // 查「当前用户 × 该机器人」的归属记录 $userBot = UserBot::whereBotId($botUser->userid)->whereUserid($user->userid)->first(); if (empty($userBot)) { if (UserBot::systemBotName($botUser->email)) { // 系统机器人(仅限管理员) return Base::retError('系统机器人不能删除'); } else { // 其他用户的机器人(仅限主人) return Base::retError('不是你的机器人'); } }判定顺序值得注意:
- 先按
user_bots表查「当前用户与该机器人」的归属记录; - 若查不到归属记录,再判断它是不是系统机器人:
- 是系统机器人 → 非管理员报「权限不足」(info/edit)或「系统机器人不能删除」(delete);
- 非系统机器人 → 说明是别人的自建机器人,一律报「不是你的机器人」,连管理员也无法直接接管他人机器人。
bot__info与bot__edit对该分支的处理略有差异:info 和 edit 对系统机器人报「权限不足」,delete 对系统机器人报「系统机器人不能删除」——这是因为系统机器人本就不该被删除。
三、系统机器人的识别:白名单在UserBot::systemBotName
后端通过 app/Models/UserBot.php 的两个静态方法识别系统机器人:
isSystemBot($email):邮箱以@bot.system结尾,且前缀命中白名单;systemBotName($name):systemBotName 用match表达式维护了一张写死的白名单,返回中文显示名,未命中返回空字符串。
当前白名单(v1.7.90 版本源码确认)包括:
通知/提醒类:system-msg(系统消息)、task-alert(任务提醒)、todo-alert(待办提醒)、meeting-alert(会议通知)、okr-alert(OKR 提醒)、approval-alert(审批)
互动/办公类:check-in(签到打卡)、anon-msg(匿名消息)、bot-manager(机器人管理)
AI 对话类:ai-openai(ChatGPT)、ai-claude(Claude)、ai-deepseek(DeepSeek)、ai-gemini(Gemini)、ai-grok(Grok)、ai-ollama(Ollama)、ai-zhipu(智谱清言)、ai-qianwen(通义千问)、ai-wenxin(文心一言)、ai-dooai(Doo AI)
完整清单与依赖说明见 内置系统机器人有哪些。从源码结构可以推断:这套白名单决定了「系统机器人名单写死、不支持自助新增类型」,普通用户既无法创建同名机器人,也无法删除或自定义其行为。
四、自建机器人的硬性约束:50 个上限 + 2-20 字符名称
创建自建机器人的校验在 UserBot::newBot,两条硬性规则:
- 数量上限 50:统计
user_bots表中该userid名下机器人数量,>= 50即返回「超过最大创建数量。」; - 名称长度:机器人名
strlen小于 2 或大于 20 字符,返回「机器人名称由2-20个字符组成。」。
创建成功后,newBot还会自动为创建者建立与机器人的单聊会话(WebSocketDialog::checkUserDialog),并在会话中发送一条创建成功。的模板消息;若开启了会话功能(sessionSupported),还会额外创建一条web_socket_dialog_sessions会话记录。
五、报错排查与解决路径
5.1「不是你的机器人」
- 含义:当前账号不是该自建机器人的创建者(主人)。
- 来源:
bot__info/bot__edit/bot__delete中user_bots.userid != 当前用户且非系统机器人。 - 解决:用创建者本人账号登录,在「我的机器人」列表操作;DooTask没有机器人过户功能,想接管他人机器人只能让原主人通过
/token指令取走凭证后给你,由你以该凭证驱动机器人(机器人自身归属不变)。
5.2「权限不足」
- 含义:试图以非管理员身份修改系统机器人(昵称、头像)。
- 来源:
bot__info/bot__edit中对系统机器人分支调用$user->isAdmin()失败。isAdmin()的实现是检查身份数组中是否含admin(见 User::isAdmin)。 - 解决:普通成员对系统机器人「看得到、改不了」,所有写操作都会被拦;请把需求转给系统管理员处理。
5.3「系统机器人不能删除」
- 含义:系统机器人被写死为不可删除,任何人(含管理员)都不能删。
- 来源:
bot__delete中对系统机器人分支的硬编码返回。 - 解决:不要尝试删除,系统机器人是平台功能依赖的组成部分;如需隐藏或停用,从系统设置层面处理(如关闭对应插件),而不是删除账号。
5.4「超过最大创建数量」
- 含义:当前账号名下自建机器人已达 50 个上限。
- 来源:
UserBot::newBot的count() >= 50前置检查。 - 解决:先删掉一些不再使用的机器人腾出名额。注意删除是不可逆操作,删除前请确认。
5.5「机器人名称由2-20个字符组成」
- 含义:名称长度不合法。
- 来源:
UserBot::newBot与/setname指令共用同一条规则。 - 解决:将名称控制在 2-20 个字符之间重试。
5.6「机器人不存在」/「删除失败」
- 含义:
whereBot(1)查不到该 ID,或deleteUser事务执行失败。 - 解决:确认机器人 ID 正确且未被删除;删除失败通常意味着事务回滚,可从服务端日志定位具体异常。
六、删除流程详解:备注必填,事务内多表清理
删除接口api/users/bot/delete的入参为:
| 参数 | 类型 | 说明 |
|---|---|---|
id | Number | 机器人 ID |
remark | String | 删除备注,必填,≤ 255 字符 |
源码中的前置校验(bot__delete):
remark为空 → 「请输入删除备注」;mb_strlen(remark) > 255→ 「删除备注长度限制255个字」;- 随后才进入上面的所有权/类型判定。
通过校验后调用 User::deleteUser,整个删除流程在数据库事务中执行:
- 写入
user_deletes表(记录操作者、被删机器人 ID、邮箱、备注、缓存快照),作为可追溯的删除原因; - 删除该机器人账号的未读消息(
web_socket_dialog_msg_reads)与待办(web_socket_dialog_msg_todos)等关联数据; - 删除邮箱验证记录(
user_email_verifications); - 删除机器人用户本身。
因此文档所述「机器人删除会同时清掉关联会话」在实现上体现为:删除动作会在事务内连带清理该账号的未读、待办等消息关联数据,避免留下孤儿记录。
七、用斜杠指令管理机器人:/list、/newbot、/token等
通过单聊「机器人管理」(bot-manager@bot.system)可以直接用斜杠指令管理自建机器人,指令分发实现在 app/Tasks/BotReceiveMsgTask.php:
| 指令 | 作用 | 备注 |
|---|---|---|
/list | 列出我拥有的机器人 | 仅限「机器人管理」机器人使用,take(50)与数量上限一致 |
/newbot 名称 | 新建机器人 | 走UserBot::newBot,同样受 50 上限与名称长度限制 |
/setname [ID] 名称 | 修改昵称 | 名称长度校验同创建 |
/token | 获取机器人 Token | 拿到后可在外部系统代发消息 |
/revoke | 更新(作废)Token | 重新生成密码,旧 Token 失效 |
/deletebot | 删除机器人 | 调用deleteUser('delete bot') |
/clearday | 设置消息保留天数 | 1-999,默认 30 |
/webhook | 设置 Webhook 地址 | ≤ 255 字符 |
/dialog | 搜索该机器人的会话 | 返回前 20 条 |
/list与/newbot被硬性限制为仅能通过「机器人管理」机器人触发(源码!$isManager && in_array($type, ['/list', '/newbot'])直接 return);其余指令若由用户直接对自建机器人发送,则默认针对该机器人本身。每个指令最终都会经getBotInfo($botId, $userid)(源码实现)按bot_id + userid双重条件查询归属,查不到归属记录的请求一律按「机器人不存在」处理——这再次印证了所有权校验的前置地位。
八、FAQ 速查表
| 报错信息 | 触发场景 | 处理方式 |
|---|---|---|
| 不是你的机器人 | 操作他人的自建机器人 | 换创建者账号;或让原主人用/token取凭证给你 |
| 权限不足 | 非管理员改系统机器人 | 联系系统管理员 |
| 系统机器人不能删除 | 删除系统机器人 | 不可删除,从设置/插件层面处理 |
| 超过最大创建数量 | 名下自建机器人 ≥ 50 | 先删除不用的机器人 |
| 机器人名称由2-20个字符组成 | 名称长度不合法 | 修改为 2-20 字符 |
| 请输入删除备注 / 删除备注长度限制255个字 | 删除时备注缺失或超长 | 填写 ≤255 字符备注 |
| 机器人不存在 | ID 无效或已删除 | 核对 ID |
相关阅读
- 机器人是什么:三类机器人与关键属性
- 内置系统机器人清单与依赖插件
- 自建机器人的 Webhook 接入
- 删除流程对应后端接口
api/users/bot/delete
- 后端
- 前端
- 协同办公
- 即时通讯
- 企业应用
【免费下载链接】dootask
DooTask是一款开源在线项目任务管理工具,提供各类文档协作工具、在线思维导图、在线流程图、项目管理、任务分发、即时IM,文件管理等工具;同时消息功能使用非对称加密技术让你的沟通更安全。
相关推荐
【限时优惠】 NGCBot项目微信机器人运行报错排查指南
【限时优惠】 NGCBot项目微信机器人运行报错排查指南 前言:为什么需要这份指南? 在部署和使用NGCBot微信机器人的过程中,许多开发者都会遇到各种运行报错
JupyterLite:浏览器端零配置Python计算环境解决方案
JupyterLite:浏览器端零配置Python计算环境解决方案 你是否曾因Python环境配置而放弃尝试新项目?是否在团队协作中遇到过"在我这里能运行"的尴
前端数据科学WebAssemblyDooTask 系统管理员(admin identity)判定机制与权限边界详解
DooTask 系统管理员(admin identity)判定机制与权限边界详解 在 DooTask 的权限体系中,系统管理员是控制团队管理、系统设置、数据导出
后端前端协同办公即时通讯企业应用
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考