
1. 为什么要在飞书里接 Claude Code很多团队已经把代码问答、提交提醒、评审通知放在飞书群里完成但 Claude Code 默认是命令行工具坐在终端前才能用。如果能让飞书机器人把群里的问题转发给 Claude Code再把结果发回群里团队里不常开终端的人也能用上代码助手。这个场景的核心链路是飞书自定义机器人收到消息 → 你的中转服务调用 Claude Code或兼容接口→ 结果回传飞书群。中间最容易卡住的地方是 API Key 管理每个开发者各自申请、各自配置额度分散、排查困难。用 TaoToken 统一 Key 之后团队只需要维护一份凭证Claude Code 的config.toml和飞书侧服务共用同一个通道出问题只看一个地方。适合谁已经在用飞书做研发协作、想让 Claude Code 能力进入群聊的团队或者个人开发者想用飞书机器人做代码提醒、任务播报。下面从配置骨架到 curl 验证一步步走完闭环。2. TaoToken 前置准备统一 Key 与通道TaoToken 在这里扮演的是统一 API 通道的角色你拿到一个 KeyClaude Code 和飞书机器人服务都指向同一个地址不用分别维护多套凭证。官网入口是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 基址是 https://taotoken.net/api 。第一步登录后在控制台创建 API Key。建议按用途分 Key一个给 Claude Code CLI 用一个给飞书机器人服务用方便单独吊销。创建入口在 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite Key 列表在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 。拿到 Key 后先别急着写代码用一条 curl 确认通道通不通。这一步能排除掉大部分“配置都对但就是没反应”的问题curl -s https://taotoken.net/api/v1/messages \ -H Content-Type: application/json \ -H x-api-key: $TAOTOKEN_API_KEY \ -H anthropic-version: 2023-06-01 \ -d { model: claude-sonnet-4-20250514, max_tokens: 128, messages: [{role: user, content: 只回复两个字联通}] }返回里能看到content字段带文字说明 Key 和通道都正常。如果返回 401检查 Key 是否复制完整返回 404 多半是路径写错注意是/api/v1/messages。注意Key 不要写进前端代码或提交到 Git。飞书机器人服务里用环境变量读取Claude Code 侧用配置文件读取。3. 可复制配置config.toml 与 settings.json 骨架Claude Code 的配置分两层config.toml管模型和通道settings.json管权限和工具行为。下面两份骨架可以直接改 Key 后用。3.1 config.toml 骨架放在~/.claude/config.tomlWindows 是C:\Users\你的用户名\.claude\config.toml# Claude Code 主配置 model claude-sonnet-4-20250514 api_base_url https://taotoken.net/api api_key_env TAOTOKEN_API_KEY [model_params] max_tokens 4096 temperature 0.2 [timeouts] request_seconds 60 connect_seconds 10这里的关键是api_base_url指向 TaoToken 的 API 基址api_key_env告诉 Claude Code 从环境变量TAOTOKEN_API_KEY读 Key避免明文写进文件。3.2 settings.json 骨架放在项目根目录的.claude/settings.json控制工具权限{ permissions: { allow: [ Read, Glob, Grep, Edit ], deny: [ Bash(rm -rf *), Bash(git reset --hard *) ] }, env: { TAOTOKEN_API_KEY: ${TAOTOKEN_API_KEY} }, lark: { enabled: true, webhook_url: ${LARK_WEBHOOK_URL}, sign_secret: ${LARK_SIGN_SECRET} } }permissions.deny里把危险命令挡掉飞书机器人触发 Claude Code 时不会误执行破坏性操作。lark段是给中转服务读的Webhook 地址和签名密钥同样走环境变量。3.3 环境变量设置Windowssetx TAOTOKEN_API_KEY 你的Key setx LARK_WEBHOOK_URL https://open.feishu.cn/open-apis/bot/v2/hook/xxxx setx LARK_SIGN_SECRET 你的签名密钥macOS / Linuxexport TAOTOKEN_API_KEY你的Key export LARK_WEBHOOK_URLhttps://open.feishu.cn/open-apis/bot/v2/hook/xxxx export LARK_SIGN_SECRET你的签名密钥设置完重开终端用echo $TAOTOKEN_API_KEY确认能读到。4. 飞书 Webhook 配置与消息机器人搭建飞书侧分两步先在群里加自定义机器人拿到 Webhook再写一个中转服务把消息转给 Claude Code。4.1 创建飞书自定义机器人在飞书群聊右上角进入群设置找到“群机器人”添加“自定义机器人”。填写名称和描述后飞书会给一个 Webhook 地址形如https://open.feishu.cn/open-apis/bot/v2/hook/xxxx。安全设置里勾选“签名校验”会生成一个密钥这就是LARK_SIGN_SECRET。签名算法是把timestamp \n secret做 HMAC-SHA256再 Base64。中转服务发消息时要带上timestamp和sign两个字段。4.2 中转服务最小实现用 Node.js 写一个最小服务收到飞书消息后调用 TaoToken 通道再把结果发回群const express require(express); const crypto require(crypto); const fetch require(node-fetch); const app express(); app.use(express.json()); const TAOTOKEN_API_KEY process.env.TAOTOKEN_API_KEY; const LARK_WEBHOOK_URL process.env.LARK_WEBHOOK_URL; const LARK_SIGN_SECRET process.env.LARK_SIGN_SECRET; function genSign(timestamp, secret) { const str ${timestamp}\n${secret}; return crypto.createHmac(sha256, str).update().digest(base64); } async function sendToLark(text) { const timestamp Math.floor(Date.now() / 1000).toString(); const sign genSign(timestamp, LARK_SIGN_SECRET); await fetch(LARK_WEBHOOK_URL, { method: POST, headers: { Content-Type: application/json }, body: JSON.stringify({ timestamp, sign, msg_type: text, content: { text } }) }); } async function askClaude(question) { const res await fetch(https://taotoken.net/api/v1/messages, { method: POST, headers: { Content-Type: application/json, x-api-key: TAOTOKEN_API_KEY, anthropic-version: 2023-06-01 }, body: JSON.stringify({ model: claude-sonnet-4-20250514, max_tokens: 1024, messages: [{ role: user, content: question }] }) }); const data await res.json(); return data.content?.[0]?.text || 没有拿到回复; } app.post(/lark/callback, async (req, res) { const question req.body?.event?.message?.content || 你好; res.json({ code: 0 }); const answer await askClaude(question); await sendToLark(answer); }); app.listen(3000, () console.log(中转服务已启动端口 3000));这段代码做了三件事接收飞书事件、调用 TaoToken 通道、把结果发回群。genSign里的 HMAC 计算注意飞书要求先对空字符串做 update再 digest这是官方签名规则。4.3 飞书事件订阅配置如果要用事件订阅而不是只发不收需要在飞书开放平台创建企业自建应用配置事件回调地址为https://你的域名/lark/callback订阅im.message.receive_v1事件。回调地址需要公网可达本地调试可以用内网穿透工具把 3000 端口暴露出去。5. 验证请求与成功结果配置完成后用三步验证闭环。第一步验证 TaoToken 通道。用第 2 节的 curl 命令确认返回正常。第二步验证飞书 Webhook。用 curl 直接给飞书发一条消息timestamp$(date %s) sign$(echo -n ${timestamp}\n${LARK_SIGN_SECRET} | openssl dgst -sha256 -hmac -binary | base64) curl -s $LARK_WEBHOOK_URL \ -H Content-Type: application/json \ -d { \timestamp\: \$timestamp\, \sign\: \$sign\, \msg_type\: \text\, \content\: {\text\: \TaoToken 通道测试\} }群里收到消息说明 Webhook 和签名都对。第三步端到端验证。在飞书群里 机器人 发一句“解释一下快速排序”中转服务会调用 Claude Code 能力几秒后群里收到回复。如果回复里包含算法说明整条链路就通了。成功结果的特征飞书群消息延迟在 3 到 10 秒之间回复内容与问题相关TaoToken 控制台能看到对应的调用记录。6. 本篇常见错排查6.1 飞书返回 19021 签名错误现象是发消息时返回{code:19021,msg:sign match fail}。原因是签名计算方式不对。飞书要求先把timestamp \n secret作为密钥对空字符串做 HMAC-SHA256再 Base64。很多人写成对消息体做 HMAC就会失败。检查genSign函数确认 update 的是空字符串。6.2 Claude Code 报 401 或 403先确认TAOTOKEN_API_KEY环境变量在当前终端能读到。Windows 用setx设置后必须重开终端旧终端读不到新变量。如果 Key 正确但仍 401检查config.toml里api_base_url是否写成了https://taotoken.net/api末尾不要多加/v1路径拼接由客户端处理。6.3 飞书群收不到消息但服务日志正常检查机器人是否被移出群或者 Webhook 地址是否对应正确的群。飞书自定义机器人的 Webhook 是群级别的换群要重新创建。另外检查安全设置里的签名校验是否开启开启后必须带timestamp和sign否则飞书会静默丢弃。6.4 中转服务调用超时Claude Code 处理复杂问题时可能超过 30 秒。在config.toml里把request_seconds调到 60 或 90。飞书侧的事件回调要求 3 秒内响应所以中转服务要先返回{code:0}再异步处理不要等 Claude 回复完才响应飞书。6.5 模型名写错导致 404TaoToken 通道支持的模型名要和请求体里的model字段一致。如果返回model not found去模型对话页面确认当前可用的模型标识不要凭记忆写。模型对话入口在 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel-chatutm_campaignrewrite 。7. 长期编码场景与接入文档如果团队要把这套链路用于日常编码和 Agent 任务建议把 Key 管理、额度监控、模型切换集中到 Coding Plan 里避免每个项目单独配。入口在 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。接入过程中遇到参数细节查接入文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。Claude Code 相关的配置说明在 https://taotoken.net/doc/claudecode-anthropic?utm_sourcetaotoken_aicg_blog_endutm_contentclaudecodeutm_campaignrewrite 。我自己的习惯是飞书机器人只做通知和轻量问答重活还是回终端用 Claude Code 跑。这样群消息不会被长回复刷屏排查也简单——通道问题看 curl飞书问题看签名Claude 问题看模型名。三处分开验证比一次性端到端调试快得多。