
1. Claude 长任务跑完没提醒Pushplus 微信通知链路怎么搭用 Claude Code 跑重构、批量改文件、生成测试用例这类活儿最难受的不是它写不出来而是它写完了你不知道。终端窗口切到别的标签页回来一看任务早就结束了白白等了十几分钟。更麻烦的是有些任务要跑五六分钟你不敢走开只能盯着屏幕发呆。这个问题的本质是Claude Code 在本地执行任务完成事件只发生在终端里没有一个「往外推」的通道。解决办法就是给它挂一个回调钩子任务结束时触发一个 HTTP 请求把消息推到微信上。Pushplus 就是干这个的它提供一个极简的推送 API你注册后拿到一个 token往指定 URL 发一条 POST 就能收到微信服务号消息。整条链路是这样的Claude Code 任务完成 → 触发 Stop Hook → 执行一段脚本 → 脚本调用 Pushplus API → 微信收到通知。你不需要一直盯着终端手机响了再回来看结果就行。适合谁用经常用 Claude Code 跑长任务的人、同时开多个终端窗口的人、以及想把 Claude 接入自己工作流做自动化提醒的人。下面我会把环境变量、Hook 配置、验证请求、常见报错全部走一遍你照着复制就能跑通。先说清楚一个前提Pushplus 的 token 是敏感信息不要硬编码在会提交到 Git 的文件里。我建议用环境变量存后面配置片段里也会这么写。2. TaoToken 前置准备拿到 Base URL、API Key 和 Model ID在配通知链路之前得先保证 Claude Code 本身能正常跑任务。如果你用的是 TaoToken 作为接入层需要先把三个东西准备好Base URL、API Key、Model ID。这三件套缺一不可后面配置里会反复出现。Base URL 用https://taotoken.net/api注意这个地址不带任何查询参数。API Key 去控制台生成路径是 console 页面里的 api-keys 管理。Model ID 根据你实际要用的模型填比如 Claude 系列对应的模型标识。我试过把这几个值写进 shell 的 profile 文件里这样每个新终端都能读到不用每次手动 export。具体做法是在~/.zshrc或~/.bashrc里加几行export TAOTOKEN_BASE_URLhttps://taotoken.net/api export TAOTOKEN_API_KEY你的APIKey export TAOTOKEN_MODEL你的ModelID export PUSHPLUS_TOKEN你的PushplusToken改完执行source ~/.zshrc让它生效。你可以用echo $TAOTOKEN_BASE_URL确认一下有没有读进去。Pushplus 的 token 获取流程打开官网注册登录后在「一对一消息」页面能看到你的 token复制出来。这个 token 就是推送的凭证谁拿到都能给你发消息所以别泄露。注册过程中会要求实名认证按提示走完就行。这里有个细节要注意Pushplus 的推送接口是http://www.pushplus.plus/send请求方式 POST参数里token必填title和content是消息标题和正文template可以选txt、html、json等格式。最简用法就是发 token 加 content。如果你还没配 TaoToken 的接入先去 doc 页面看一下接入说明把 Claude Code 的 Base URL 指向https://taotoken.net/apiKey 填你生成的那个。这一步不通后面通知链路配了也没意义因为根本没任务在跑。配置完成后你可以先用模型对话页面测一下 Key 是否有效确认能正常返回再往下走。这一步花两分钟能省掉后面排查「到底是通知没发出去还是任务根本没跑」的麻烦。3. 可复制配置Claude Code Hook Pushplus 回调片段Claude Code 支持 Hook 机制可以在特定事件发生时执行命令。我们要用的是Stop事件也就是 Claude 完成一次响应或任务结束时触发。配置文件放在项目根目录的.claude/settings.json或者用户级的~/.claude/settings.json。下面是一份可以直接复制的 settings 片段路径和字段名保持原样{ hooks: { Stop: [ { matcher: , hooks: [ { type: command, command: bash -c curl -s -X POST http://www.pushplus.plus/send -H \Content-Type: application/json\ -d \{\\\token\\\:\\\$PUSHPLUS_TOKEN\\\,\\\title\\\:\\\Claude 任务完成\\\,\\\content\\\:\\\Claude Code 已完成当前任务请回到终端查看结果。\\\,\\\template\\\:\\\txt\\\}\ } ] } ] } }这段配置的意思是当 Stop 事件触发时执行一条 curl 命令把 token 和消息内容 POST 到 Pushplus 的 send 接口。$PUSHPLUS_TOKEN会从环境变量里读所以前面 export 的那一步必须做。如果你觉得把 curl 塞在 JSON 里转义太丑可以改成调用一个独立脚本。在项目里建scripts/notify.sh#!/usr/bin/env bash curl -s -X POST http://www.pushplus.plus/send \ -H Content-Type: application/json \ -d { \token\: \${PUSHPLUS_TOKEN}\, \title\: \Claude 任务完成\, \content\: \任务已结束请查看终端输出。\, \template\: \txt\ }然后 settings.json 里改成{ hooks: { Stop: [ { matcher: , hooks: [ { type: command, command: bash scripts/notify.sh } ] } ] } }这样更好维护也方便你后面加日志、加时间戳、加任务名。记得给脚本执行权限chmod x scripts/notify.sh。关于 matcher 字段Stop 事件一般留空字符串就行表示匹配所有停止场景。如果你只想在特定条件下触发可以填匹配规则但大多数提醒场景不需要这么细。配置写完后Claude Code 下次启动会读取这个文件。如果你是在会话中途改的建议重启一下 Claude Code 让配置生效。这一步别偷懒我见过有人改完没重启以为配置没生效排查半天。4. 验证请求从任务完成到手机收到通知的完整动作配置写好了得验证整条链路真的通。分两步走先单独测 Pushplus 接口再测 Claude Code 的 Hook 触发。第一步手动发一条推送确认 token 和网络没问题curl -X POST http://www.pushplus.plus/send \ -H Content-Type: application/json \ -d {\token\:\$PUSHPLUS_TOKEN\,\title\:\测试推送\,\content\:\这是一条测试消息\,\template\:\txt\}如果返回的 JSON 里code是 200说明发送成功。这时候看手机微信里应该收到一条来自 Pushplus 服务号的消息。如果没收到先检查 token 有没有复制错再看 Pushplus 后台的「一对一消息」页面有没有发送记录。第二步触发 Claude Code 的 Stop Hook。最简单的办法是让 Claude 跑一个短任务比如「列出当前目录的文件」。任务结束后Hook 应该自动执行你手机就会收到「Claude 任务完成」的通知。如果你想确认 Hook 到底有没有执行可以在脚本里加一行日志echo $(date %Y-%m-%d %H:%M:%S) notify triggered /tmp/claude-notify.log跑完任务后cat /tmp/claude-notify.log有记录说明 Hook 触发了没记录说明配置没被读取。这一步能快速定位问题出在 Hook 层还是推送层。实测下来从任务结束到手机收到消息延迟大概在一到三秒取决于网络状况。这个延迟对提醒场景完全够用你不需要秒级响应只要别让你干等就行。验证通过后你可以把通知内容做得更丰富一点比如带上任务耗时、当前目录、甚至 Claude 最后一段输出。Pushplus 的 content 支持 HTML 模板你可以用template: html然后拼一段带样式的消息。不过对提醒来说纯文本最稳不容易因为格式问题发送失败。5. 常见报错排查401、local proxy failed、reading choices配这条链路最容易踩的坑集中在几个报错上我按出现频率排一下。401 错误Pushplus 返回 401 通常是 token 无效或没传。检查$PUSHPLUS_TOKEN环境变量在当前 shell 里能不能读到echo $PUSHPLUS_TOKEN输出为空就说明没 export 成功。还有一种情况是 token 复制时带了空格用echo $PUSHPLUS_TOKEN | tr -d 清理一下。如果是 TaoToken 那边返回 401那就是 API Key 的问题去 console 重新生成一个确认 Base URL 是https://taotoken.net/api没有多余路径。local proxy failed这个报错一般出现在 Claude Code 请求模型接口时说明网络层有问题。先确认你的 Base URL 配置正确再检查本地有没有奇怪的代理设置干扰。如果你在 settings.json 里配了env字段确认ANTHROPIC_BASE_URL指向的是https://taotoken.net/api。这个报错和 Pushplus 无关是模型接入层的问题但会导致任务根本跑不起来自然也不会有完成通知。reading choices 报错这个通常出现在解析模型返回时说明返回结构不符合预期。常见原因是 Model ID 填错了或者 Base URL 指向了一个不兼容的端点。检查你的 Model ID 是否和 TaoToken 文档里列的一致Base URL 有没有多写或少写/api。修好这个任务能正常跑完Hook 才有机会触发。Hook 不触发如果手动 curl 能收到消息但任务跑完没通知问题在 Hook 配置。检查 settings.json 的 JSON 格式是否合法可以用python -m json.tool .claude/settings.json验证。再确认文件路径对不对项目级是.claude/settings.json用户级是~/.claude/settings.json。还有一点Stop Hook 只在 Claude 正常结束任务时触发如果你手动 CtrlC 中断可能不会触发。消息发送成功但手机没收到去 Pushplus 后台看发送记录如果显示成功但微信没消息检查是不是关注了服务号、有没有被折叠到「服务通知」里。有时候消息在服务号会话里不在聊天列表容易漏看。排查顺序建议先手动 curl 测推送再测 Hook 触发最后测完整链路。这样能快速定位是哪一层的问题不用瞎猜。6. 把通知链路用起来接入文档与 Coding Plan 的选择链路跑通之后你可以按自己的使用习惯做扩展。比如给不同项目配不同的通知标题跑测试的时候标题写「测试完成」跑构建的时候写「构建结束」这样手机上一眼就能区分是哪个任务。再比如在通知内容里带上任务耗时用date %s在脚本开头和结尾各取一次时间戳相减就是秒数。如果你经常跑长任务可以考虑把 Coding Plan 用起来它更适合长期编码和 Agent 场景配合通知链路能形成「提交任务 → 去干别的 → 收到提醒 → 回来看结果」的闭环。接入文档在 doc 页面里面有完整的 Base URL、Key、Model ID 配置说明照着填就行。需要生成新 Key 或者管理多个项目的 Key去 api-keys 页面操作。每个项目用独立的 Key方便追踪用量也方便某个 Key 泄露时单独吊销。最后说一个我踩过的坑Pushplus 的免费额度对个人使用完全够但如果你把通知频率调得特别高比如每个小步骤都推一条可能会触发限流。建议只在任务真正完成时推别做成进度条式推送那样手机响个不停反而烦。整条链路的核心就三件事环境变量存好 tokensettings.json 配好 Hook脚本里调对接口。这三步任何一步出错都会导致收不到通知按第 5 节的排查顺序走一遍基本都能解决。配好之后你就可以放心让 Claude 跑长任务手机响了再回来看不用再盯着终端发呆了。