起因
想让飞书里"克劳德"这个自建应用能自动回复消息,找 Claude Code 生成了一个 bot.js,思路是:Express 起服务 → 订阅飞书消息接收事件 → 收到消息调用大模型生成回复 → 发回去。听起来是个很标准的闭环,实际操作下来,卡在了一连串环环相扣的小问题上,最后没跑通,先记录一下,以后有空再回来填坑。
踩过的坑,按顺序过一遍
-
auto 模式卡死 一开始 Claude Code 用的是 auto 权限模式,写文件前会先调用一个安全分类器(deepseek-v4-pro)判断安全性,结果这个模型当时不可用,导致 Write 操作一直卡住重试。后来手动切回普通权限模式解决。
-
依赖没装全 第一次 npm install 显示"up to date",但实际上 package.json 里没写全依赖,express 等包根本没装上。后来改成显式 npm install express axios @anthropic-ai/sdk dotenv 才真正装好。
-
API Key 混乱 .env 里填的 ANTHROPIC_API_KEY 格式不对(不是 sk-ant- 开头),大概率是别的平台的 Key 误填了进去,一直没来得及去 Anthropic 控制台重新生成核对。
-
ngrok 需要额外注册 npm 装的新版 ngrok 首次使用要注册账号、绑定 authtoken,多了一步没预料到的操作,好在最后跑通了,拿到了公网转发地址。
-
飞书订阅方式选错 飞书后台默认的"事件与回调"订阅方式是长连接,而 bot.js 写的是 Webhook 逻辑,两者对不上,机器人自然收不到消息。后来手动切换成"发送至开发者服务器"模式,把 ngrok 地址填进去。
-
验证请求返回格式错误 配置完回调地址后,飞书返回报错"返回数据不是合法的JSON格式"——这是飞书标准的 URL 验证流程,服务需要正确解析 challenge 字段并原样以 JSON 格式返回,bot.js 这块处理得有问题。
-
.env 疑似又没读到 最后一次重启服务,日志显示 injected env (0) from .env,配置又变回没读取到的状态,怀疑是记事本保存的时候把文件存成了 .env.txt 而不是 .env,这是 Windows 记事本一个常见的坑,最后卡在这一步没继续排查下去。
为什么没搞定
回头看,问题不是出在某一个"大坑"上,而是每一步都环环相扣:环境配置、依赖安装、密钥管理、网络转发、飞书后台设置、代码里的验证逻辑,任何一环出岔子,前面做对的部分也白搭。中间来回切换终端窗口、来回改配置,很容易把"哪一步已经做对了、哪一步还没做"搞混,尤其是 .env 文件反复出现"读取到 0 个变量"这种情况,说明基础配置这一层始终没有稳定下来。
下次接着做,建议这么切入
先把 .env 的问题彻底解决:直接用 dir 或 Get-ChildItem 确认文件名到底是不是 .env(无扩展名),必要时用 VS Code 之类的编辑器打开保存,别用记事本,避免自动加 .txt 后缀。
API Key 单独核对一遍:去 Anthropic 控制台重新生成一个 sk-ant- 开头的 Key,飞书那两个也去开发者后台"凭证与基础信息"重新确认复制。
确认订阅方式和代码逻辑匹配:既然已经写的是 Webhook 版本的 bot.js,就保持飞书后台选"发送至开发者服务器",不要来回切换。
单独测试 /feishu/event 这个路由:可以先用 Postman 或者简单的 curl 命令,手动模拟飞书发一个带 challenge 字段的请求过去,确认 bot.js 能不能正确原样返回 JSON,不用每次都靠飞书后台报错来排查。
这次没跑通,但每一步卡在哪、为什么卡,基本都定位清楚了,下次照着这个清单从头过一遍,应该能省不少来回折腾的时间。
浙公网安备 33010602011771号