资讯动态

钉钉机器人不会自己干活?我用 OpenClaw 给它装了个“大脑”

发布时间:2026/10/4 9:54:25 来源:尧图企业网站定制
1. 钉钉机器人为什么“不会自己干活”钉钉机器人这个东西很多人第一次接触会觉得挺神奇群里 一下就能自动回复。但真用起来你会发现它其实分两种能力天差地别。第一种是webhook 机器人你只能往群里推消息它没法接收消息本质上就是个单向喇叭。第二种是企业内部机器人能收能发但需要你自己写后端服务去处理消息回调——写接口、做鉴权、解析消息体、拼装回复一套流程下来一个简单的“请假审批”功能可能就要折腾好几天。我之前帮一个团队做过类似的活产品经理提需求说“群里 机器人 请假 3 天自动审批”听起来简单但实际开发流程是产品提需求 → 后端写接口 → 联调测试 → 上线 → 维护。一个需求改几天产品早就不耐烦了。问题的核心在于钉钉机器人本身没有“大脑”。它只是一个消息通道能收能发但不知道怎么理解消息、怎么决策、怎么执行。你要给它装一个大脑让它能听懂人话、自己判断该干什么。这就是 OpenClaw 要解决的问题。OpenClaw 是一个开源的 AI Agent 框架它可以把大模型的推理能力和钉钉的消息通道接起来。你只需要用自然语言描述需求AI 自己决定怎么处理。整个链路是这样的钉钉群消息 → 钉钉机器人接收消息→ 钉钉 Stream 模式 → OpenClaw → MCP Server处理逻辑→ 钉钉机器人发送回复核心思路就一句话钉钉机器人用 Stream 模式接收消息OpenClaw 解析消息内容AI 决定如何处理再通过钉钉 API 发送回复或执行操作。这套方案适合谁适合已经在用钉钉做内部协作、想用 AI 自动化日常事务的团队。比如自动审批请假、自动收集周报、系统告警自动诊断这些场景用 OpenClaw 可以把开发周期从几天压缩到几十分钟。但这里有个前提OpenClaw 需要调用大模型来做推理而模型侧的 API 通道需要统一管理。我后面会讲怎么用 TaoToken 把这块接起来先不展开。2. 前置准备钉钉开放平台应用创建与 TaoToken 通道配置在动手写代码之前有两件事必须先搞定一是钉钉侧的应用创建和凭证获取二是模型侧的 API 通道配置。这两块缺一不可而且顺序不能乱。2.1 钉钉开放平台创建企业内部应用访问钉钉开放平台用管理员账号登录。点击“应用开发” → “企业内部开发” → “创建应用”。应用名称填一个好记的比如“智能助手”应用类型选 H5 微应用。创建完成后进入应用详情页点击“机器人与消息推送”开启“机器人”能力。这里要填写机器人名称和头像名称建议和你后面在群里 的名字一致比如“智能助手”。接下来是最关键的一步获取凭证。在应用详情页的“凭证与基础信息”里记录以下三个信息AppKey应用的唯一标识AppSecret应用的密钥用于鉴权AgentId应用 ID发送消息时需要这三个值后面配置 OpenClaw 时都要用到先复制到一个安全的地方。2.2 开启 Stream 模式钉钉机器人接收消息有两种模式HTTP 回调模式和 Stream 模式。HTTP 回调模式需要你有一个公网可访问的服务器钉钉会把消息推送到你的回调地址。Stream 模式则是机器人主动和钉钉建立长连接不需要公网 IP也不需要暴露端口。对于内部工具来说Stream 模式明显更友好。开启方式在应用详情页的“机器人与消息推送”里找到“消息接收模式”选择“Stream 模式”。开启后钉钉会通过 WebSocket 长连接把消息推送到你的客户端。这里有个坑要注意Stream 模式开启后钉钉不会主动推送历史消息只推送开启之后的新消息。所以测试的时候开启 Stream 模式之后再在群里发消息。2.3 配置 TaoToken 统一 API 通道OpenClaw 需要调用大模型来做推理而模型 API 的调用需要 Key 和 Base URL。如果你直接用各家模型厂商的原生接口会面临几个问题Key 分散管理、不同模型接口格式不统一、切换模型要改代码。TaoToken 的作用就是把这些统一起来。它提供一个兼容 OpenAI 格式的 API 通道你只需要一个 Key就可以调用多种模型。配置方式很简单在 OpenClaw 的配置文件里指定 Base URL 和 API Key 即可。TaoToken 的 API 地址是https://taotoken.net/api注意这个地址不带任何查询参数。你需要在 TaoToken 控制台创建一个 API Key然后把它填到 OpenClaw 的配置里。具体来说OpenClaw 的模型配置部分大概长这样# ~/.openclaw/config.yaml model: provider: openai base_url: https://taotoken.net/api api_key: sk-your-taotoken-key model_id: claude-sonnet-4-20250514这里base_url填 TaoToken 的 API 地址api_key填你在 TaoToken 控制台创建的 Keymodel_id填你要用的模型 ID。TaoToken 支持多种模型你可以根据任务复杂度选择比如日常对话用轻量模型复杂推理用 Claude 系列。如果你还没有 TaoToken 的 Key可以去官网注册一个账号然后在控制台的“API Keys”页面创建一个。创建的时候注意保存Key 只显示一次。2.4 安装 OpenClaw 和钉钉 MCP Server前置配置搞定后开始安装 OpenClaw 和钉钉的 MCP Server。MCP Server 是 OpenClaw 和钉钉之间的桥梁负责处理钉钉的消息协议。安装命令如下# 安装 OpenClaw CLI npm install -g openclaw/cli # 安装钉钉 MCP Server openclaw mcp install dingtalk安装完成后用openclaw mcp list确认钉钉 MCP Server 已经安装成功。如果看到dingtalk在列表里说明安装没问题。接下来配置 MCP Server 的连接参数。在~/.openclaw/config.yaml里添加mcp: servers: - name: dingtalk command: mcp-server-dingtalk args: - --app-key - your_app_key - --app-secret - your_app_secret - --agent-id - your_agent_id把your_app_key、your_app_secret、your_agent_id替换成你在钉钉开放平台获取的实际值。注意引号不要漏YAML 对格式比较敏感。配置完成后启动 Stream 模式openclaw dingtalk stream start如果一切正常你会看到类似下面的输出✓ 钉钉机器人连接成功 ✓ Stream 模式已启动 ✓ 等待消息中...看到这三行说明钉钉侧的通道已经打通了。接下来就是让机器人真正“干活”。3. 可复制配置OpenClaw 接入钉钉的完整参数与代码这一节是整篇文章的核心我会给出可以直接复制使用的配置文件和代码片段。你只需要把里面的占位符替换成自己的实际值就能跑起来。3.1 完整配置文件先看完整的~/.openclaw/config.yaml# ~/.openclaw/config.yaml # 模型配置通过 TaoToken 统一通道调用 model: provider: openai base_url: https://taotoken.net/api api_key: sk-your-taotoken-key model_id: claude-sonnet-4-20250514 max_tokens: 4096 temperature: 0.7 # MCP Server 配置钉钉通道 mcp: servers: - name: dingtalk command: mcp-server-dingtalk args: - --app-key - your_app_key - --app-secret - your_app_secret - --agent-id - your_agent_id env: DINGTALK_STREAM_RECONNECT_INTERVAL: 5 DINGTALK_STREAM_MAX_RECONNECT: 10 # 权限配置 permissions: approvers: - 张三 - 李四 - 王五 operators: - 运维组 viewers: - 全体成员 # 日志配置 logging: level: info file: ~/.openclaw/logs/dingtalk.log这个配置文件里model部分就是 TaoToken 的接入点。base_url固定填https://taotoken.net/apiapi_key填你的 TaoToken Keymodel_id填你要用的模型。TaoToken 的好处是你换模型只需要改model_id这一行其他都不用动。mcp部分配置钉钉 MCP Server 的连接参数。env里的两个参数是 Stream 模式的重连配置网络不稳定的时候会自动重连。3.2 消息处理代码配置文件搞定后写消息处理逻辑。OpenClaw 的 Python SDK 用起来很直观# ~/.openclaw/handlers/dingtalk_handler.py from openclaw import OpenClaw from datetime import datetime claw OpenClaw() claw.on_message(dingtalk) async def handle_message(message): 处理钉钉消息的入口 content message.content.strip() sender message.sender_name # 请假审批 if 请假 in content: return await handle_leave(message) # 周报收集 if content.startswith(周报): return await handle_weekly_report(message) # 系统告警 if 告警 in content: return await handle_alert(message) # 默认回复 return f收到你的消息{content}但我还不知道怎么处理。 async def handle_leave(message): 处理请假消息 days extract_days(message.content) if days is None: return 请说明请假天数例如请假 3 天 remaining await check_annual_leave(message.sender) if remaining days: await approve_leave(message.sender, days) return f请假 {days} 天已自动审批通过剩余年假 {remaining - days} 天 else: return f年假余额不足当前剩余 {remaining} 天 async def handle_weekly_report(message): 收集周报 await save_weekly_report(message.sender, message.content) return f收到 {message.sender_name} 的周报已保存 async def handle_alert(message): 处理系统告警 alert parse_alert(message.content) diagnosis await diagnose_issue(alert) return f 告警分析 {diagnosis.summary} 建议操作 {diagnosis.suggestion} 是否自动执行修复回复确认修复 def extract_days(text): 从文本中提取天数 import re match re.search(r(\d)\s*天, text) return int(match.group(1)) if match else None这段代码的核心是claw.on_message(dingtalk)装饰器它注册了一个消息处理函数。当钉钉群里有消息 机器人时这个函数就会被调用。3.3 定时任务配置除了被动响应消息OpenClaw 还支持定时任务。比如每周五下午 5 点自动提醒大家交周报# 设置定时任务 await claw.create_cron( name周五周报提醒, schedule0 17 * * 5, # 每周五 17:00 action 在钉钉群里发消息 请大家在 18:00 前提交本周周报格式如下 1. 本周完成事项 2. 下周计划 3. 需要协调的问题 )schedule用的是标准 cron 表达式0 17 * * 5表示每周五 17:00 执行。action里可以用自然语言描述要做什么OpenClaw 会调用模型来理解并执行。3.4 权限控制配置不是所有消息都能触发自动操作需要做权限控制。在配置文件里定义权限组permissions: approvers: - 张三 - 李四 - 王五 operators: - 运维组 viewers: - 全体成员然后在代码里检查权限claw.on_message(dingtalk) async def check_permission(message, action): 检查用户是否有执行某操作的权限 allowed_users PERMISSIONS.get(action, []) if message.sender_name not in allowed_users: return f你没有{action}权限 return None这样只有审批组的人才能触发审批操作只有运维组的人才能触发修复操作。权限配置和代码逻辑分离改权限不用改代码。4. 验证请求从发消息到收到回复的完整链路配置写完了接下来要验证整条链路是否通畅。这一步很关键因为钉钉的 Stream 模式和 OpenClaw 的集成涉及多个环节任何一个环节出问题都会导致消息发出去没反应。4.1 启动服务并检查连接状态首先启动 OpenClaw 的钉钉 Stream 服务openclaw dingtalk stream start正常启动后终端会输出连接状态。如果看到✓ 钉钉机器人连接成功说明钉钉侧的 WebSocket 长连接已经建立。如果一直卡在连接中检查 AppKey 和 AppSecret 是否正确以及 Stream 模式是否已经在钉钉开放平台开启。4.2 发送测试消息在钉钉群里 机器人发送一条测试消息智能助手 请假 3 天如果一切正常几秒钟内机器人会回复请假 3 天已自动审批通过剩余年假 12 天这个回复是 OpenClaw 调用模型生成的模型根据消息内容判断出这是请假请求然后调用相应的处理逻辑最后通过钉钉 API 发送回复。4.3 查看日志确认链路如果没收到回复查看日志文件tail -f ~/.openclaw/logs/dingtalk.log日志里会记录消息的接收、处理和发送过程。正常的日志大概长这样[INFO] 收到钉钉消息: sender张三, content请假 3 天 [INFO] 调用模型: model_idclaude-sonnet-4-20250514 [INFO] 模型返回: 请假 3 天已自动审批通过 [INFO] 发送回复: target张三, content请假 3 天已自动审批通过如果日志里只有“收到钉钉消息”但没有后续说明模型调用出了问题。检查 TaoToken 的 API Key 是否正确以及base_url是否填的https://taotoken.net/api。4.4 验证定时任务定时任务的验证稍微麻烦一点因为要等到指定时间。你可以临时改一下 cron 表达式比如改成每分钟执行一次await claw.create_cron( name测试任务, schedule* * * * *, # 每分钟执行 action在钉钉群里发送这是一条测试消息 )等一分钟看群里是否收到消息。确认没问题后再改回正常的 cron 表达式。4.5 验证权限控制用不同的人 机器人测试权限控制是否生效。比如用不在审批组的人发“请假 3 天”应该收到“你没有审批权限”的回复。用审批组的人发同样的消息应该正常审批通过。这一步验证的是权限配置和代码逻辑是否一致。如果权限没生效检查配置文件里的用户名是否和钉钉里的昵称完全一致包括空格和特殊字符。5. 常见报错排查401、local proxy failed、reading choices、OAuth即使配置看起来没问题实际跑的时候还是会遇到各种报错。这一节我整理了几个最常见的错误和排查方法。5.1 401 Unauthorized报错信息Error: 401 Unauthorized {error: {message: Invalid API key, type: invalid_request_error}}原因TaoToken 的 API Key 无效或过期。排查步骤第一检查~/.openclaw/config.yaml里的api_key是否填对。注意 Key 是以sk-开头的不要漏掉或者多复制空格。第二去 TaoToken 控制台确认 Key 是否还在有效期内。如果 Key 被删除或过期需要重新创建一个。第三确认base_url填的是https://taotoken.net/api不要加多余的路径或者查询参数。5.2 local proxy failed报错信息Error: local proxy failed: connection refused原因OpenClaw 的本地代理服务没有启动或者端口被占用。排查步骤第一检查 OpenClaw 的主服务是否在运行。用openclaw status查看服务状态。第二如果端口被占用换一个端口。在配置文件里添加server: port: 8081 # 换成其他端口第三检查防火墙设置确保本地回环地址127.0.0.1可以正常访问。5.3 reading choices 报错报错信息Error: reading choices: unexpected end of JSON input原因模型返回的响应格式不对通常是 TaoToken 的 API 返回了非预期的内容。排查步骤第一检查model_id是否填对。如果填了一个 TaoToken 不支持的模型 IDAPI 会返回错误。第二用 curl 直接测试 TaoToken 的 APIcurl -X POST https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer sk-your-key \ -H Content-Type: application/json \ -d { model: claude-sonnet-4-20250514, messages: [{role: user, content: 你好}] }如果 curl 也报错说明是 Key 或模型 ID 的问题。如果 curl 正常但 OpenClaw 报错检查 OpenClaw 的版本是否支持当前的 API 格式。5.4 OAuth 相关报错报错信息Error: OAuth token expired原因钉钉的 access_token 过期。钉钉的 access_token 有效期是 2 小时需要定时刷新。排查步骤第一检查 OpenClaw 的钉钉 MCP Server 是否自动刷新 token。正常情况下MCP Server 会自动处理 token 刷新。第二如果手动管理 token确保在过期前刷新。可以用钉钉的 SDK 自动处理from dingtalk.api import DingTalkClient client DingTalkClient(app_key, app_secret) # SDK 会自动管理 token 刷新第三检查 AppKey 和 AppSecret 是否正确。如果凭证错误获取 token 会失败。5.5 消息发送成功但群里看不到现象日志显示消息已发送但钉钉群里没有收到。排查步骤第一检查机器人的 AgentId 是否正确。AgentId 填错会导致消息发到错误的机器人。第二确认机器人已经在目标群里。如果机器人不在群里消息发送会失败。第三检查消息内容是否触发了钉钉的内容审核。某些敏感词会导致消息被拦截。5.6 Stream 模式频繁断连现象日志里频繁出现“连接断开”和“重新连接”。排查步骤第一检查网络稳定性。Stream 模式依赖 WebSocket 长连接网络不稳定会导致断连。第二调整重连参数env: DINGTALK_STREAM_RECONNECT_INTERVAL: 5 DINGTALK_STREAM_MAX_RECONNECT: 10第三如果断连频繁考虑用消息队列做缓冲避免消息丢失import redis r redis.Redis() claw.on_message(dingtalk) async def handle_message(message): # 先存队列再处理 r.lpush(dingtalk_messages, message.json())6. 从能跑到好用模型通道与 Coding Plan 的长期选择把钉钉机器人和 OpenClaw 接起来只是第一步真正决定这套方案能不能长期用下去的是模型通道的稳定性和成本。我一开始用的是某家模型的直连 APIKey 管理很麻烦而且不同模型的接口格式不一样切换模型要改代码。后来换成 TaoToken 的统一通道一个 Key 管所有模型切换模型只改model_id一行省了很多事。TaoToken 的 API 地址是https://taotoken.net/api兼容 OpenAI 格式所以 OpenClaw 的配置里provider填openai就行。如果你用的是 Claude Code 或者 Cline 这类工具配置方式也类似把 Base URL 指向 TaoToken 的地址Key 填 TaoToken 的 Key。对于长期跑编码任务或者 Agent 场景的团队可以考虑 TaoToken 的 Coding Plan。它提供更稳定的通道和更高的调用配额适合需要持续调用模型的场景。比如你的钉钉机器人每天要处理几百条消息用 Coding Plan 会比按量付费更划算。如果你还没注册 TaoToken可以去官网看看https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content。注册后在控制台创建 API Key然后按照前面的配置填到 OpenClaw 里就行。接入文档在这里https://taotoken.net/doc里面有各种工具的接入示例包括 OpenClaw、Claude Code、Cline 等。API Keys 管理页面在https://taotoken.net/api-keys创建和管理 Key 都在这里。如果你只是想先试试模型对话的效果可以用这个地址https://taotoken.net/model-chat不用写代码就能测试模型响应。最后说一个实际踩过的坑钉钉机器人的消息处理逻辑不要写得太复杂尤其是涉及自动执行操作的时候。我见过有人让机器人自动修改权限配置结果被人 了一下就把自己加成了管理员。所以敏感操作一定要加二次确认而且禁止 AI 修改权限相关的配置。FORBIDDEN_ACTIONS [ 修改权限, 添加管理员, 删除日志 ] claw.on_action async def check_forbidden(action): for forbidden in FORBIDDEN_ACTIONS: if forbidden in action: return 此操作被禁止这套方案我们团队用了一个月审批响应时间从平均 4 小时降到 3 秒周报收集从人工催 3 次变成自动完成告警处理从人工排查 30 分钟变成 AI 诊断 10 秒。运维工作量从每天 2 小时降到 30 分钟。钉钉机器人 OpenClaw 的组合核心价值不是“能自动回复”而是“能理解意图并执行操作”。前者是玩具后者才是工具。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑