OpenClaw(养龙虾)+ 钉钉对接:2026年保姆级全链路操作指南|TaoToken 统一 Key 通道
1. 为什么要在 Docker 里把 OpenClaw 和钉钉接起来OpenClaw 是一个可以本地部署的 AI 智能体框架社区里习惯叫它“养龙虾”——因为它能像龙虾一样伸出很多“钳子”工具去操作浏览器、读写文件、执行代码。而钉钉是国内企业里最常见的协作入口。把这两者接起来本质上是让钉钉群变成 OpenClaw 的遥控器你在群里发一句话本地的龙虾就开始干活干完把结果推回群里。这个场景适合谁三类人最需要一是想把重复性工作日报汇总、资料检索、值班监控交给 AI 的个人开发者二是团队里负责内部工具建设的技术同学希望给同事一个“发消息就能用”的 AI 入口三是已经在本地跑着 OpenClaw但苦于没有一个顺手的交互界面的人。钉钉恰好补上了这块——它自带组织架构、消息通知和机器人能力不用自己再造一个聊天前端。整条链路的架构可以这样理解钉钉 App 里的消息通过钉钉的机器人回调或 Stream 长连接送到你自建的 Python 中间件中间件把消息转成 OpenClaw 能懂的请求发给本地 Docker 容器里的 OpenClaw 引擎引擎调用大模型和工具执行任务把结果返回给中间件中间件再调用钉钉的消息发送接口把回复推回群里。这里面有两个关键点一是 OpenClaw 跑在 Docker 里端口和数据都在本地隐私可控二是中间件是“翻译官”负责协议转换钉钉说的是它自己的消息格式OpenClaw 说的是另一套中间件负责两边对接。我实测下来最容易卡住的地方不是 OpenClaw 本身而是钉钉侧的回调地址配置和消息加解密。很多人第一次配完在群里 机器人 发消息后台日志一片安静或者报 401。这篇就按“先跑通、再优化”的顺序把 Docker 部署、钉钉机器人配置、Python 中间件、TaoToken 统一 Key 接入、curl 验证和 401 排查全部走一遍。你跟着做一个下午能跑通最小闭环。需要提前说明的是OpenClaw 需要连接一个大模型作为“大脑”。你可以用各家厂商的 API但如果你同时用多个模型比如日常对话用便宜的复杂任务用强的管理多个 Key 会很烦。TaoToken 提供统一 Key 通道一个 Key 就能调用多种模型省去在 OpenClaw 配置里来回换 Key 的麻烦。下面会给出具体接入方式。2. TaoToken 统一 Key 通道的前置准备在动手写代码之前先把“大脑”的接入方式定下来。OpenClaw 的 Docker 容器需要两个东西一个是模型服务的 Base URL一个是 API Key。如果你用 TaoToken 的统一 Key 通道这两项都从 TaoToken 拿。第一步打开 TaoToken 官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 注册并登录。登录后进入控制台找到 API Keys 页面deep linkhttps://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 。在这里创建一个新的 Key复制出来保存好——它只会完整显示一次。这个 Key 就是你后面填进 OpenClaw 配置和 Python 中间件的凭证。第二步确认 Base URL。TaoToken 的 API 入口是 https://taotoken.net/api 注意这个地址不带任何查询参数直接作为 OpenAI 兼容接口的 base_url 使用。OpenClaw 如果支持 OpenAI 兼容协议就把 base_url 指向它。第三步选模型。TaoToken 的模型列表里你可以挑一个适合 Agent 场景的模型。Agent 任务通常需要较强的指令遵循和工具调用能力建议选一个支持 function calling 的模型。具体模型 ID 在模型对话页面deep linkhttps://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 可以看到复制那个 Model ID后面配置里要用。这里有个容易踩的坑很多人把 Base URL 写成 https://taotoken.net/api/v1 或者带上一堆参数结果请求 404。正确做法是 base_url 用 https://taotoken.net/api 具体路径由 SDK 或 OpenClaw 自己拼接。如果你用的是 OpenAI 的 Python SDK它会自动在 base_url 后面加 /chat/completions所以 base_url 不要自己再加 /v1。另外如果你打算长期跑 Agent 任务比如让龙虾每天定时汇总消息、自动做代码审查这类持续性的编码和 Agent 工作负载可以考虑 TaoToken 的 Coding Plandeep linkhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。它针对长时间、高频次的调用做了额度优化比按量付费更适合“24 小时数字员工”这种用法。当然前期调试阶段用普通 API Key 就够了跑通之后再决定要不要升级。准备好这三样——API Key、Base URL、Model ID——就可以进入 Docker 部署环节了。记住这三个值后面会在两个地方出现OpenClaw 容器的环境变量以及 Python 中间件的配置。保持一致不要一个地方写错。3. Docker 部署 OpenClaw 与可复制配置这一节给出可以直接复制的 docker-compose 片段以及钉钉自定义机器人的配置项。先说 OpenClaw 的部署。我推荐用 docker-compose 而不是单条 docker run因为后面你可能要加中间件容器、加数据库compose 管理起来更清晰。新建一个目录比如 openclaw-dingtalk在里面创建 docker-compose.ymlversion: 3.8 services: openclaw: image: openclaw/core:latest container_name: openclaw restart: unless-stopped ports: - 8080:8080 volumes: - ./config:/app/config - ./data:/app/data environment: - LOCAL_MODEtrue - LLM_BASE_URLhttps://taotoken.net/api - LLM_API_KEYsk-你的TaoTokenKey - LLM_MODEL你的ModelID - TZAsia/Shanghai healthcheck: test: [CMD, curl, -f, http://localhost:8080/health] interval: 30s timeout: 10s retries: 3几个参数说明。LOCAL_MODEtrue 确保数据只在本地处理这是 OpenClaw 的核心卖点别关掉。LLM_BASE_URL 填 TaoToken 的 API 地址注意不要带 /v1。LLM_API_KEY 填你在控制台创建的那个 Key。LLM_MODEL 填模型 ID。TZ 设成上海时区不然日志时间对不上排查问题时很痛苦。启动命令docker compose up -d docker compose logs -f openclaw看到日志里出现类似 “OpenClaw core started, listening on 8080” 就说明容器起来了。访问 http://localhost:8080 能看到管理控制台。接下来配置钉钉侧。登录钉钉开发者后台创建“企业内部应用”。应用名称随便填比如“龙虾管家”。创建完成后在应用管理页面找到“添加应用能力”选择“机器人”。这里有几个关键配置项消息接收模式选“Stream 模式”2026 年推荐这样不需要公网回调地址中间件主动连钉钉省去内网穿透的麻烦。如果你选 HTTP 回调模式就需要一个公网地址后面要用 Cloudflare Tunnel 之类的工具暴露本地端口。机器人名称填“龙虾管家”图标随意。安全设置里如果你用 Stream 模式主要靠 AppKey 和 AppSecret 鉴权如果用 HTTP 回调建议开启签名验证记下 Token 和 EncodingAESKey。记下 AppKey 和 AppSecret这两个值要填进 Python 中间件。发布应用然后在钉钉群里添加这个机器人。这里有个细节钉钉企业内部应用的机器人默认只能在同一个组织内使用。如果你用的是个人钉钉号很多能力受限强烈建议用企业组织。没有企业的话可以免费创建一个。配置完成后在群里 机器人 发“测试”此时因为中间件还没启动不会有响应这是正常的。接下来写中间件。4. Python 中间件与消息路由实现中间件是整个链路的核心它要干三件事接收钉钉消息、调用 OpenClaw、把结果发回钉钉。我用 Flask dingtalk-stream SDK 来实现Stream 模式比 HTTP 回调稳定不用管公网地址。先建项目结构dingtalk-openclaw-bridge/ ├── app.py ├── config.py ├── requirements.txt └── logs/requirements.txtflask3.0.0 requests2.31.0 dingtalk-stream0.20.0安装依赖pip install -r requirements.txtconfig.py 放配置import os DINGTALK_APP_KEY os.getenv(DINGTALK_APP_KEY, 你的AppKey) DINGTALK_APP_SECRET os.getenv(DINGTALK_APP_SECRET, 你的AppSecret) OPENCLAW_API_URL os.getenv(OPENCLAW_API_URL, http://localhost:8080/api/v1/chat) OPENCLAW_TIMEOUT 60 # TaoToken 统一 Key 通道如果中间件也需要直接调模型 TAOTOKEN_BASE_URL https://taotoken.net/api TAOTOKEN_API_KEY os.getenv(TAOTOKEN_API_KEY, sk-你的TaoTokenKey) TAOTOKEN_MODEL os.getenv(TAOTOKEN_MODEL, 你的ModelID)app.py 是主程序。核心逻辑是注册一个事件处理器收到消息后提取文本和发送者调用 OpenClaw再把回复发回去。import json import logging import requests import dingtalk_stream from dingtalk_stream import AckMessage from config import ( DINGTALK_APP_KEY, DINGTALK_APP_SECRET, OPENCLAW_API_URL, OPENCLAW_TIMEOUT ) logging.basicConfig(levellogging.INFO) logger logging.getLogger(__name__) def ask_openclaw(prompt: str, user_id: str) - str: 把钉钉消息转发给本地 OpenClaw返回回复文本 payload { message: prompt, user_id: user_id, session_id: fdingtalk_{user_id}, tools_enabled: [browser, file_system] } try: resp requests.post( OPENCLAW_API_URL, jsonpayload, timeoutOPENCLAW_TIMEOUT ) if resp.status_code 200: data resp.json() return data.get(reply, 龙虾正在思考中...) logger.error(OpenClaw 返回非 200: %s %s, resp.status_code, resp.text) return fOpenClaw 错误: {resp.status_code} except requests.exceptions.Timeout: return 龙虾思考超时请稍后再试。 except Exception as e: logger.exception(调用 OpenClaw 失败) return 龙虾暂时失联请检查本地服务。 class DingTalkHandler(dingtalk_stream.ChatbotHandler): async def process(self, callback: dingtalk_stream.CallbackMessage): incoming dingtalk_stream.ChatbotMessage.from_dict(callback.data) text (incoming.text.content or ).strip() sender_id incoming.sender_staff_id or unknown logger.info(收到钉钉消息: %s from %s, text, sender_id) if not text: return AckMessage.STATUS_OK, OK reply_text ask_openclaw(text, sender_id) self.reply_text(reply_text, incoming) return AckMessage.STATUS_OK, OK def main(): credential dingtalk_stream.Credential( DINGTALK_APP_KEY, DINGTALK_APP_SECRET ) client dingtalk_stream.DingTalkStreamClient(credential) client.register_callback_handler( dingtalk_stream.chatbot.ChatbotMessage.TOPIC, DingTalkHandler() ) logger.info(龙虾管家中间件已启动正在监听钉钉消息...) client.start_forever() if __name__ __main__: main()启动中间件export DINGTALK_APP_KEY你的AppKey export DINGTALK_APP_SECRET你的AppSecret python app.py看到 “龙虾管家中间件已启动” 就说明连上钉钉了。这时候在群里 机器人 发消息中间件会收到转发给 OpenClaw再把回复发回群里。消息路由的关键在于 session_id。我用 dingtalk_{user_id} 作为会话标识这样同一个用户在钉钉里的多轮对话OpenClaw 能保持上下文。如果你希望按群维度隔离可以把 session_id 改成 dingtalk_{conversation_id}。这个看你的业务需求。还有一个细节钉钉机器人回复有频率限制如果 OpenClaw 处理时间较长比如超过 10 秒钉钉可能已经超时。稳妥做法是先回一个“收到正在处理”等 OpenClaw 出结果后再发一条。dingtalk-stream SDK 支持主动发消息你可以用 client 的 send 接口实现异步回复。上面代码为了简洁直接同步回复适合快速任务。5. curl 验证消息收发与 401 排查配置写完了怎么确认链路是通的分两步验证先验证 OpenClaw 本身能调通再验证钉钉消息能走通。先验证 OpenClaw 的 API。用 curl 直接打本地接口curl -X POST http://localhost:8080/api/v1/chat \ -H Content-Type: application/json \ -d { message: 你好帮我算一下 23 乘以 47, user_id: test_user, session_id: test_session }如果返回类似 {reply: 23 乘以 47 等于 1081}说明 OpenClaw 引擎正常。如果返回 401说明 OpenClaw 连大模型这一层鉴权失败检查 docker-compose 里的 LLM_API_KEY 和 LLM_BASE_URL 是否正确。再验证 TaoToken 的 Key 是否有效。直接用 curl 打 TaoToken 的接口curl -X POST https://taotoken.net/api/chat/completions \ -H Authorization: Bearer sk-你的TaoTokenKey \ -H Content-Type: application/json \ -d { model: 你的ModelID, messages: [{role: user, content: ping}] }正常会返回一个 JSON里面有 choices 数组。如果返回 401说明 Key 无效或过期去控制台重新创建一个。如果返回 404检查 URL 是不是写成了 https://taotoken.net/api/v1/chat/completions多了一层 /v1。接下来验证钉钉链路。在群里 机器人 发“测试”然后看中间件日志。如果日志里出现“收到钉钉消息”说明钉钉到中间件这一段通了。如果日志里出现“调用 OpenClaw 失败”说明中间件到 OpenClaw 这一段有问题检查 OPENCLAW_API_URL 和容器端口映射。常见的报错和排查动作我整理成表格报错现象可能原因排查动作401 UnauthorizedTaoToken Key 无效或未填检查环境变量 LLM_API_KEY重新生成 Keylocal proxy failed容器内无法访问外网检查 Docker 网络确认能解析 taotoken.netreading choices 报错返回体不是预期 JSON用 curl 直接打 TaoToken 接口看原始返回OAuth 相关错误钉钉 AppKey/AppSecret 错误核对开发者后台的凭证注意不要有多余空格钉钉无响应Stream 未连接或机器人未发布看中间件日志是否有“已启动”检查应用是否发布重点说 401。这个错误在三个地方可能出现TaoToken 层、OpenClaw 层、钉钉层。区分方法是看报错来源。如果 curl 打 TaoToken 就 401那是 Key 问题如果 curl 打 OpenClaw 返回 401那是 OpenClaw 配置里的 Key 问题如果钉钉日志里出现 OAuth 错误那是钉钉凭证问题。逐个排查不要混在一起。还有一个隐蔽的坑Docker 容器里的 localhost 和宿主机的 localhost 不是一回事。如果中间件跑在宿主机OpenClaw 跑在容器里OPENCLAW_API_URL 用 http://localhost:8080 是可以的因为端口映射出来了。但如果中间件也跑在容器里就要用容器名或 Docker 网络里的地址比如 http://openclaw:8080。这个搞错的话会报连接拒绝。验证成功后你可以试着发一个稍微复杂的指令比如“帮我搜索今天的天气并整理成一句话”。观察 OpenClaw 是否调用了浏览器工具结果是否正确回传到钉钉。这一步跑通整条链路就活了。6. 长期运行与 CTA跑通最小闭环之后接下来考虑的是稳定性和长期使用。几个实用建议。第一把中间件也放进 docker-compose和 OpenClaw 在同一个网络里。这样重启机器后两个服务自动起来不用手动敲命令。中间件的 Dockerfile 很简单基于 python:3.11-slim复制代码装依赖CMD 启动 app.py。compose 里加一个 servicedepends_on openclaw。第二日志要持久化。OpenClaw 的日志和中间件的日志都挂载到宿主机目录出问题时能回溯。特别是 Agent 执行了哪些操作审计日志很重要。第三高危操作加确认。OpenClaw 可以配置“人类确认模式”对于删除文件、群发消息这类操作先在钉钉发一个审批卡片人工点确认后才执行。这个在 OpenClaw 控制台的技能配置里开启。第四模型选择上日常对话可以用响应快的模型复杂任务切换到能力强的。TaoToken 的统一 Key 通道让你不用改代码就能换模型只需要在配置里改 Model ID。如果你打算让龙虾长期跑编码和 Agent 任务比如自动代码审查、定时汇总可以看看 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 额度上更适合持续负载。如果你在接入过程中遇到鉴权或配置问题先去 API Keys 页面https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 确认 Key 状态再对照接入文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 检查参数格式。想先试试模型效果可以直接在模型对话页面https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 发几条消息感受一下。最后说一个我踩过的坑钉钉机器人的回复如果包含 Markdown 表格在手机端可能显示错乱。解决办法是让 OpenClaw 输出纯文本或者在中间件里做一次格式转换把表格转成列表。这个在 System Prompt 里加一句“回复使用纯文本不要用 Markdown 表格”就能解决。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →