1. 为什么要在 2026 年把 OpenClaw 接进钉钉OpenClaw原 Clawdbot是一个把大模型能力封装成可编排任务的自动化框架它能做什么简单说你在钉钉群里发一句话它就能调用模型、跑脚本、回结果。适合谁适合想给自己或小团队搭一个“随叫随到 AI 助手”的开发者尤其是已经在用钉钉办公、又不想每天切十个网页的人。我自己的场景是这样的团队日常在钉钉群里同步进度很多重复问题周报模板、接口字段解释、日志排查思路其实可以让 AI 先答一轮。以前的做法是每个人自己开一个对话窗口复制粘贴效率很低。2026 年 OpenClaw 的容器化做得比较成熟配合钉钉机器人回调就能把“群消息 → 模型 → 群回复”这条链路跑通。这篇教程的目标很明确用 Docker 一键部署 OpenClaw接入钉钉自定义机器人并且通过 TaoToken 统一模型 Key 和 API 通道最后以“钉钉群里发消息能收到 AI 回复”作为验收标准。全程可复制命令和配置我都会给全。你不需要懂 Kubernetes也不需要买很贵的机器一台 2 核 4G 的云主机就够跑起来。需要提前说明的是模型调用这块我不建议你到处散落 Key。OpenClaw 支持自定义 OpenAI 兼容的 Base URL所以我们可以把模型通道统一收敛到 TaoToken后面换模型、换 Key 只改一个地方。这也是我实测下来最省心的做法。2. 部署前把 TaoToken 通道准备好在写 docker-compose 之前先把模型通道准备好否则 OpenClaw 起来了也没法回消息。OpenClaw 的模型层走的是 OpenAI 兼容协议所以我们需要三样东西Base URL、API Key、Model ID。这三件套在后面的配置里会反复出现先记牢。Base URL 用https://taotoken.net/api注意这个地址不带任何查询参数直接填在配置里就行。API Key 需要你去控制台生成入口在 API Keys 页面https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite 。生成之后复制保存它只会完整显示一次。Model ID 这块OpenClaw 的配置里叫model你填你实际要用的模型标识即可。如果你不确定用哪个可以先到模型对话页面试一下https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite 在网页里发一条消息确认通道通了、模型能回再写进配置文件。这一步能帮你排除掉“Key 错了”还是“配置写错了”的扯皮。如果你后面打算长期跑编码类或 Agent 类任务可以了解一下 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite 它更适合高频调用场景。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite 遇到字段对不上时可以翻一下。这里有个坑要提前说很多人把 Base URL 写成带/v1的地址结果 OpenClaw 请求 404。OpenClaw 内部会自己拼/v1/chat/completions所以你填https://taotoken.net/api就好不要再加后缀。这个我在排障章节还会再提一次。3. 可复制的 docker-compose 与环境变量配置这一节是核心配置能直接抄。先建工作目录再写docker-compose.yml和.env。我把模型通道和钉钉凭证拆成环境变量这样镜像升级时不用改 compose 文件。mkdir -p /opt/openclaw cd /opt/openclaw先写.env把三件套和钉钉凭证都放进去cat .env EOF # 模型通道TaoToken 三件套 OPENAI_BASE_URLhttps://taotoken.net/api OPENAI_API_KEYsk-你的TaoTokenKey OPENCLAW_MODEL你的ModelID # 服务端口 OPENCLAW_PORT3000 # 钉钉应用凭证 DINGTALK_APP_KEY你的AppKey DINGTALK_APP_SECRET你的AppSecret DINGTALK_AGENT_ID你的AgentId DINGTALK_TOKEN你的回调Token DINGTALK_AES_KEY你的AES_KEY EOF然后是docker-compose.yml注意environment里引用了.env的变量version: 3.8 services: openclaw: image: openclaw/openclaw:2026-stable container_name: openclaw-core restart: unless-stopped ports: - ${OPENCLAW_PORT}:3000 environment: - NODE_ENVproduction - PORT3000 - LOG_LEVELinfo - OPENAI_BASE_URL${OPENAI_BASE_URL} - OPENAI_API_KEY${OPENAI_API_KEY} - OPENCLAW_MODEL${OPENCLAW_MODEL} - DINGTALK_APP_KEY${DINGTALK_APP_KEY} - DINGTALK_APP_SECRET${DINGTALK_APP_SECRET} - DINGTALK_AGENT_ID${DINGTALK_AGENT_ID} - DINGTALK_TOKEN${DINGTALK_TOKEN} - DINGTALK_AES_KEY${DINGTALK_AES_KEY} volumes: - ./data:/app/data networks: - openclaw-network networks: openclaw-network: driver: bridge启动docker compose up -d docker compose logs -f openclaw日志里看到server listening on 3000就说明服务起来了。如果你用的是旧版docker-compose命令把docker compose换成docker-compose即可功能一样。关于钉钉凭证的获取简单说一下路径登录钉钉开放平台创建“企业内部应用”应用类型选机器人在“凭证与基础信息”里拿 AppKey 和 AppSecret在“开发配置”里拿 AgentId。回调的 Token 和 AES_KEY 在“消息接收模式”里自己生成这两个值要和 OpenClaw 配置完全一致否则回调验证会失败。如果你更习惯用配置文件而不是环境变量OpenClaw 也支持settings.json。在./data目录下建一个{ model: { baseUrl: https://taotoken.net/api, apiKey: sk-你的TaoTokenKey, modelId: 你的ModelID }, dingtalk: { appKey: 你的AppKey, appSecret: 你的AppSecret, agentId: 你的AgentId, token: 你的回调Token, aesKey: 你的AES_KEY } }两种方式选一种就行不要同时配否则优先级容易搞混。我一般用环境变量因为改起来不用进容器。4. 验证请求与钉钉回调成功结果配置写完先别急着去钉钉发消息按顺序验证三层模型通道、OpenClaw 服务、钉钉回调。第一层验证模型通道。在宿主机上直接 curl 一下curl -s https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer sk-你的TaoTokenKey \ -H Content-Type: application/json \ -d { model: 你的ModelID, messages: [{role: user, content: 只回复两个字通了}] }返回 JSON 里choices[0].message.content是“通了”说明 Key 和 Base URL 没问题。如果这里就报 401先别往下走去排障章节看。第二层验证 OpenClaw 服务curl http://localhost:3000/health返回{status:ok}即可。再进容器确认模型配置被读到了docker exec -it openclaw-core env | grep -E OPENAI|OPENCLAW_MODEL第三层钉钉回调。在钉钉开放平台的消息接收配置里URL 填http://你的公网IP:3000/dingtalk/webhookToken 和 AES_KEY 填.env里那两个值然后点“验证”。钉钉会发一个加密的 challenge 过来OpenClaw 解密后原样返回验证通过会提示成功。验证通过后在钉钉里找到你的机器人应用发一句“帮我列三个周报要点”。正常的话几秒内会收到回复。同时看日志docker compose logs -f openclaw | grep -i dingtalk能看到webhook received和reply sent两条记录就说明整条链路通了。到这一步你的 OpenClaw 钉钉 TaoToken 就算验收完成。5. 常见报错排查401、local proxy failed、reading choices这一节按真实报错来遇到哪个查哪个。401 Unauthorized。九成是 Key 问题。先确认.env里OPENAI_API_KEY没有多余空格和引号然后确认 Base URL 是https://taotoken.net/api而不是带/v1的地址。改完.env后必须docker compose up -d重建容器光 restart 不会重新读环境变量。如果还报 401去 API Keys 页面确认这个 Key 没被删、没过期。local proxy failed / connection refused。这个通常是容器内访问不到外网或者 DNS 解析失败。进容器测一下docker exec -it openclaw-core sh -c curl -I https://taotoken.net/api如果这里就失败检查宿主机 DNS 和出网策略。另外确认你没有在.env里配HTTP_PROXY之类的变量容器里配了代理反而会连不上。reading choices of undefined。这个报错说明请求发出去了但返回体里没有choices字段。常见原因有两个一是 Model ID 写错了通道返回了错误对象二是 Base URL 拼错请求打到了别的路径。解决办法是先用第 4 节的 curl 命令单独测模型通道确认返回结构正常再回头检查 OpenClaw 的OPENCLAW_MODEL值。钉钉回调验证失败。先确认 OpenClaw 服务在跑、3000 端口对公网开放安全组放行。然后核对 Token 和 AES_KEY这两个值区分大小写复制时容易多带空格。如果还是失败把钉钉后台的 Token 和 AES_KEY 重新生成一次同步更新.env并重建容器。OAuth 相关报错。如果你在钉钉侧看到 OAuth 授权失败检查应用的可见范围是否包含你自己以及是否申请了“消息通知与推送”权限。权限没批下来之前机器人收不到消息。排障时有个通用技巧先分层再定位。模型层用 curl 测服务层用 health 测回调层用钉钉后台的验证按钮测。哪一层断了就修哪一层不要三层一起改否则你永远不知道是哪个改动生效了。6. 把通道固定下来后面少折腾整套跑通之后我建议你做一件事把 TaoToken 的三件套固定成团队内部的默认通道写进你的部署模板里。这样以后新开一个 OpenClaw 实例复制.env改个端口就能用不用每次重新找 Key。模型对话入口可以留着做快速验证https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite 。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite 字段有疑问时翻一下比猜快。Key 管理在 https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite 建议给不同环境生成不同的 Key方便出问题时单独吊销。最后提醒一句钉钉机器人的回调地址必须是公网可访问的本地localhost不行。如果你在本地调试可以用内网穿透工具把 3000 端口暴露出去但生产环境还是建议直接部署在有公网 IP 的云主机上。数据持久化目录./data记得定期备份里面存了会话和配置丢了要重配。