
1. OpenClaw 定时任务在飞书渠道为什么总翻车OpenClaw 的 cron 定时任务本质是一个「调度器 渠道投递」的组合体。调度器负责在指定时间点唤醒任务渠道层负责把消息塞进飞书机器人。很多人第一次配的时候脑子里想的是「我设个时间到点它自己发」但实际跑起来会发现任务列表里状态是 idle日志里却什么都没有或者状态变成 done群里静悄悄。这不是玄学是 OpenClaw 对飞书渠道的投递目标、账户名、时间格式三件事卡得比较死。我先把最容易踩的坑摊开说。飞书渠道和 Telegram、Discord 这类渠道有个本质区别飞书机器人默认没有「最近会话」的概念。你在 Telegram 里可以写--channel last它会往你最近聊过的窗口发但飞书不行飞书要求你必须显式给出chat:oc_xxx或user:ou_xxx。OpenClaw 的报错写得很直白Delivering to Feishu requires target chatId|user:openId|chat:chatId。这句话翻译过来就是你不告诉我发给谁我就不发。第二个高频坑是账户名。OpenClaw 的openclaw.json里飞书渠道的账户配置通常长这样{ channels: { feishu: { accounts: { main: { appId: cli_xxxxxxxx, appSecret: xxxxxxxx, verificationToken: xxxxxxxx } } } } }注意这里的 key 是main不是default。但 cron 任务在创建时如果不显式指定--account它会默认去找default账户然后报Feishu account default not configured。这个错误信息看起来像配置没写其实配置写了只是名字对不上。第三个坑是时间格式。--at参数只认两种写法ISO 8601 带时区的完整时间比如2026-03-12T17:30:0008:00或者纯持续时间比如20m、1h。你写1m、17:30、明天下午都会被拒报Invalid --at; use ISO time or duration like 20m。这个设计其实是为了避免时区歧义但对刚上手的人来说确实不够友好。还有一个隐蔽的坑任务创建成功不等于调度器已经加载。OpenClaw 的 Gateway 在启动时会读取~/.openclaw/cron/jobs.json如果你在 Gateway 运行期间新增任务有些版本需要重启 Gateway 才会重新 arm timer。日志里如果只有cron: job added而没有cron: timer armed那基本就是没挂上。这些问题的共同点是报错信息不够「人话」日志分散在多个文件里排查路径不清晰。下面我会把 TaoToken 作为统一 API 通道接进来让模型调用和飞书投递走同一条链路这样 401、超时、模型不可用这类问题就能在一个地方定位不用在 OpenClaw 配置和模型供应商后台之间来回跳。2. TaoToken 统一通道前置准备Key、Base URL 与模型 ID在讲飞书 cron 配置之前先把 TaoToken 这条通道搭好。原因很简单OpenClaw 的定时任务如果带--model参数它会去调模型生成内容再投递到飞书。模型调用失败任务状态可能显示成功但消息内容是空的或者直接抛 401。把模型通道统一到 TaoTokenBase URL 和 Key 只有一套排查时不用猜是哪个供应商的问题。TaoToken 的 API 地址是https://taotoken.net/api注意这个地址不带任何查询参数直接作为 OpenAI 兼容的 Base URL 使用。官网入口是https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content从这里进去可以拿到 API Key也能看到当前支持的模型列表。你需要准备三样东西第一API Key。在 TaoToken 控制台的 API Keys 页面创建格式通常是sk-开头的一串字符。这个 Key 要填到 OpenClaw 的模型配置里或者填到环境变量里。第二Base URL。固定写https://taotoken.net/api。有些工具要求结尾不带斜杠有些要求带/v1TaoToken 的兼容层两种都能识别但建议统一写https://taotoken.net/api避免路径拼接时多出双斜杠。第三Model ID。TaoToken 的模型 ID 采用供应商/模型名的格式比如anthropic/claude-sonnet-4-20250514、openai/gpt-4o、bailian/qwen3.5-plus这类。你在 OpenClaw 的--model参数里填的就是这个 ID。注意不要填成claude-sonnet-4这种裸模型名TaoToken 的路由层需要前缀来区分上游。如果你用的是 Claude Code 或者 Cline 这类工具配置方式略有不同。Claude Code 需要设置ANTHROPIC_BASE_URL和ANTHROPIC_API_KEYCline 的 MCP 配置里要写baseUrl和apiKey。但 OpenClaw 的 cron 任务走的是它自己的模型调用层你只需要在openclaw.json里配好 provider 即可。一个典型的 OpenClaw 模型配置片段{ models: { providers: { taotoken: { baseUrl: https://taotoken.net/api, apiKey: sk-你的TaoToken密钥, models: { claude-sonnet: { id: anthropic/claude-sonnet-4-20250514 }, qwen-plus: { id: bailian/qwen3.5-plus } } } } } }配好之后你可以先用一个最简单的 curl 验证通道是否通curl -s https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer sk-你的TaoToken密钥 \ -H Content-Type: application/json \ -d { model: bailian/qwen3.5-plus, messages: [{role: user, content: 回复OK}], max_tokens: 10 }如果返回的 JSON 里有choices数组且message.content是OK说明通道正常。如果返回 401检查 Key 是否复制完整、是否有多余空格如果返回 404检查 Base URL 是否写成了https://taotoken.net/api/v1再加/chat/completions导致路径重复。这一步做完OpenClaw 的模型调用就有了统一出口。接下来配飞书 cron 时无论是一次性任务还是循环任务只要涉及模型生成都会走这条通道。出问题时你只需要看 TaoToken 的返回和 OpenClaw 的日志不用再去翻多个供应商的后台。3. 可复制配置飞书 cron 任务模板与 openclaw.json 片段这一节直接给可复制的配置。先看openclaw.json里飞书渠道和模型 provider 的完整片段再给 cron 命令模板。飞书渠道配置注意账户名用main和后面 cron 命令里的--account main对应{ channels: { feishu: { enabled: true, accounts: { main: { appId: cli_你的飞书应用ID, appSecret: 你的飞书应用密钥, verificationToken: 你的Verification Token, encryptKey: 你的Encrypt Key } } } }, models: { providers: { taotoken: { baseUrl: https://taotoken.net/api, apiKey: sk-你的TaoToken密钥, defaultModel: bailian/qwen3.5-plus } } }, cron: { enabled: true, timezone: Asia/Shanghai, storePath: ~/.openclaw/cron/jobs.json } }这里有几个点要注意。cron.timezone设成Asia/Shanghai后你在 cron 表达式里写0 8 * * *就是北京时间早上 8 点不用再手动换算 UTC。storePath是任务持久化路径默认就是~/.openclaw/cron/jobs.json如果你改过路径后面排查时要对应改。一次性任务模板带模型生成和飞书投递openclaw cron add \ --name AI日报 \ --at 2026-03-12T18:00:0008:00 \ --account main \ --channel feishu \ --to chat:oc_1f179c606f60946f0a411a786b2df6a1 \ --message 请帮我总结一下今天的 AI 热点新闻控制在200字以内 \ --model bailian/qwen3.5-plus \ --delete-after-run循环任务模板每天早 8 点执行openclaw cron add \ --name 每日晨报 \ --cron 0 8 * * * \ --tz Asia/Shanghai \ --account main \ --channel feishu \ --to chat:oc_1f179c606f60946f0a411a786b2df6a1 \ --message ☀ 早上好今天也要加油 \ --model bailian/qwen3.5-plus参数对照表参数必填说明示例--name是任务名称用于日志检索AI日报--at二选一ISO 8601 时间或持续时间2026-03-12T18:00:0008:00--cron二选一标准 cron 表达式0 8 * * *--tz否时区配合--cron使用Asia/Shanghai--account是飞书账户名对应配置里的 keymain--channel是渠道类型feishu--to是目标 IDchat:oc_xxx或user:ou_xxx--message是消息内容可含模型提示词请总结今天的新闻--model否模型 ID走 TaoToken 通道bailian/qwen3.5-plus--delete-after-run否一次性任务执行后删除无值飞书目标 ID 的获取方式群聊 ID 以oc_开头私聊用户 OpenID 以ou_开头。你可以在飞书开发者后台的「事件订阅」里看到机器人收到的消息元数据里面包含chat_id。或者在 OpenClaw 运行后用openclaw status查看当前会话信息里面会打印最近的 chat ID。如果你用的是 Claude Code 做本地调试想让它走 TaoToken 通道配置方式是设置环境变量export ANTHROPIC_BASE_URLhttps://taotoken.net/api export ANTHROPIC_API_KEYsk-你的TaoToken密钥然后在 Claude Code 里选择模型时填anthropic/claude-sonnet-4-20250514。这样 Claude Code 的请求也会经过 TaoToken和 OpenClaw 的 cron 任务共用同一个 Key排查 401 时只需要看一个地方。Cline 的 MCP 配置类似在cline_mcp_settings.json里写{ mcpServers: { taotoken: { command: npx, args: [-y, taotoken/mcp-server], env: { TAOTOKEN_BASE_URL: https://taotoken.net/api, TAOTOKEN_API_KEY: sk-你的TaoToken密钥 } } } }注意 MCP 直连生产库是禁止的这里只是把 TaoToken 作为模型通道不涉及数据库连接。配置完成后Cline 里的模型调用也会走统一通道。4. 验证请求与成功结果从 cron list 到飞书收消息配置写完之后不要直接等定时触发先手动验证一遍链路。验证顺序是先确认任务已注册再确认调度器已 arm最后确认飞书能收到消息。第一步查看任务列表openclaw cron list正常输出类似ID Name Schedule Next Status 799a799c-ebaa-4460-b821-c42850992a19 AI日报 at 2026-03-12 10:00Z in 3m idle注意Next字段显示的是 UTC 时间10:00Z对应北京时间18:00。如果你看到Status是idle说明任务已注册但还没到触发时间。如果Next显示invalid或空白说明 cron 表达式或--at格式有问题回去检查时间格式。第二步查看任务详情文件cat ~/.openclaw/cron/jobs.json这个文件里会列出所有任务的完整参数包括account、channel、to、model。你可以用它来核对创建时有没有漏参数。如果这里缺少account字段说明创建命令里没写--account任务执行时会去找default账户然后报错。第三步查看执行日志。OpenClaw 的日志按日期分文件路径通常是/tmp/openclaw/openclaw-2026-03-12.log。用 grep 过滤 cron 相关tail -100 /tmp/openclaw/openclaw-2026-03-12.log | grep -i cron成功执行时你会看到类似这样的日志序列cron: job added id799a799c nameAI日报 cron: timer armed id799a799c next2026-03-12T10:00:00Z cron: job triggered id799a799c model: request providertaotoken modelbailian/qwen3.5-plus model: response status200 tokens156 feishu: sending to chat:oc_1f179c606f60946f0a411a786b2df6a1 feishu: message sent message_idom_xxxxxxxx cron: job completed id799a799c如果中间某一步断了比如只有job triggered没有model: response说明模型调用卡住了去检查 TaoToken 的 Key 和 Base URL。如果feishu: sending之后没有message sent说明飞书投递失败看下一行的 error 字段。第四步确认飞书群收到消息。如果消息内容是模型生成的检查内容是否完整。如果收到的是空消息可能是--message里的提示词被模型理解成了「不需要回复」可以在提示词末尾加一句「请直接输出总结内容」。一个完整的验证命令把创建、列表、日志查看串起来openclaw cron add \ --name 验证任务 \ --at 2m \ --account main \ --channel feishu \ --to chat:oc_1f179c606f60946f0a411a786b2df6a1 \ --message 这是一条验证消息收到请忽略 \ --delete-after-run openclaw cron list sleep 130 tail -50 /tmp/openclaw/openclaw-$(date %Y-%m-%d).log | grep -E cron|feishu|model--at 2m表示 2 分钟后执行sleep 130等 130 秒让任务触发。如果一切正常飞书群里会收到「这是一条验证消息收到请忽略」日志里会看到完整的触发链路。如果验证通过说明 cron 调度、TaoToken 模型通道、飞书投递三件事都通了。接下来可以把--at换成--cron做循环任务或者把--message换成更复杂的提示词。5. 本篇常见错排查401、local proxy failed、reading choices、OAuth这一节按真实报错来排查。我把最常见的几类错误和对应解法列出来你遇到时可以直接对照。错误一401 Unauthorized日志里出现model: response status401 body{error:{message:Invalid API key}}或者飞书收到消息说「模型调用失败」。这是 TaoToken 的 Key 问题。检查三件事Key 是否复制完整sk-开头没有换行和空格openclaw.json里apiKey字段是否写对环境变量里是否有旧的OPENAI_API_KEY覆盖了配置。如果你同时配了环境变量和配置文件OpenClaw 的优先级通常是环境变量高于配置文件去~/.bashrc或~/.zshrc里检查有没有残留的 Key。错误二local proxy failed日志里出现model: request errorlocal proxy failed: dial tcp 127.0.0.1:7890: connect: connection refused这个报错说明 OpenClaw 在尝试走本地代理但代理没启动。检查环境变量HTTP_PROXY、HTTPS_PROXY、ALL_PROXY是否被设置成了127.0.0.1:7890这类地址。如果有取消这些环境变量或者把 TaoToken 的域名加入NO_PROXY。TaoToken 的 API 地址是直连的不需要走本地代理。错误三reading choices日志里出现model: response parse error: reading choices field或者飞书收到空消息。这个报错说明 TaoToken 返回的 JSON 里没有choices字段通常是模型 ID 写错了。比如你写了claude-sonnet-4而不是anthropic/claude-sonnet-4-20250514TaoToken 的路由层找不到对应模型返回了一个错误结构。去 TaoToken 控制台确认模型 ID 的完整写法注意前缀。错误四OAuth token expired日志里出现feishu: auth errorOAuth token expired, please re-authorize这是飞书应用凭证过期。飞书的appSecret和verificationToken一般不会过期但如果你用的是 tenant access token它默认 2 小时过期。OpenClaw 会自动刷新但如果刷新失败就会报这个错。检查飞书开发者后台的应用状态确认应用没有被停用appId和appSecret没有重置。如果重置过更新openclaw.json后重启 Gateway。错误五Delivering to Feishu requires target日志里出现cron: job failed errorDelivering to Feishu requires target chatId|user:openId|chat:chatId这是创建任务时没写--to参数。飞书渠道不支持--channel last必须显式指定目标。回去用openclaw cron add重新创建加上--to chat:oc_xxx。错误六Feishu account default not configured日志里出现cron: job failed errorFeishu account default not configured这是--account没写或写错了。你的openclaw.json里账户名是main但任务默认找default。在创建命令里加--account main或者把配置里的账户名改成default。错误七Invalid --at日志里出现Error: Invalid --at; use ISO time or duration like 20m时间格式不对。--at只认 ISO 8601 带时区格式或纯持续时间。把1m改成1m把17:30改成2026-03-12T17:30:0008:00。排查时的一个实用技巧把所有相关日志过滤出来按时间排序grep -E cron|feishu|model|taotoken /tmp/openclaw/openclaw-$(date %Y-%m-%d).log | sort这样能看到完整的执行链路哪一步断了很清楚。如果日志文件太大用tail -200先看最近的。还有一个容易忽略的点OpenClaw 的 Gateway 如果是在后台运行的修改openclaw.json后需要重启才会生效。重启命令通常是openclaw gateway restart重启后用openclaw cron list确认任务还在然后等下一次触发。6. 长期跑定时任务的通道选择与接入入口飞书 cron 任务跑通之后接下来要考虑的是长期稳定性。一次性任务用--delete-after-run执行完就删没什么负担。但循环任务每天跑模型调用量会累积如果 Key 额度不够或者通道不稳定某天早上就会漏发。TaoToken 的 Coding Plan 适合这种长期编码和 Agent 场景它提供的是包月或包量的调用额度不用每次担心余额。如果你只是偶尔跑几个定时任务按量付费的 API Key 也够用。关键是 Base URL 和 Key 统一之后OpenClaw、Claude Code、Cline 这些工具可以共用一套凭证排查问题时不用在多个后台之间切换。接入入口我整理一下按你的需求选排障和接入配置去 API Keys 页面拿 Key对照接入文档改openclaw.json。文档里有各工具的 Base URL 写法和模型 ID 列表。验证模型是否可用用模型对话页面直接发一条消息看返回是否正常。这个页面不需要配 OpenClaw适合快速确认 TaoToken 通道本身没问题。长期编码和 Agent 任务看 Coding Plan 页面选适合你调用量的档位。定时任务如果每天跑多次模型生成包量方案比按量更划算。控制台页面可以查看调用记录和余额排查 401 时先看这里有没有异常请求。API Keys 管理页面用来创建和吊销 Key建议给 OpenClaw 单独建一个 Key方便区分调用来源。最后给一个实用建议在openclaw.json里把cron.timezone固定成Asia/Shanghai所有任务都用--cron表达式而不是--at绝对时间。绝对时间适合一次性提醒循环任务用 cron 表达式更稳不会因为某次手动改时间导致后续调度错乱。日志文件建议加一个定时清理/tmp/openclaw/下的日志按天累积跑一个月可能占几百 MB用系统的 logrotate 或者简单的find /tmp/openclaw -name *.log -mtime 7 -delete定期清理。