ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

让 Claude Code 在完事后,给你发条微信提醒:TaoToken 统一 Key 下的 hooks 通知配置

让 Claude Code 在完事后,给你发条微信提醒:TaoToken 统一 Key 下的 hooks 通知配置 1. 为什么 Claude Code 跑完任务我却总是最后一个知道你有没有过这种体验给 Claude Code 扔了一个重构任务它开始吭哧吭哧改文件、跑测试、写代码你想着“反正要几分钟先去倒杯水”结果回来一看它早就跑完了而你在刷手机的时候完全没注意到。更尴尬的是有时候它中途卡在一个权限确认上等了你二十分钟你才发现它根本没往下走。这个场景在长时间任务里特别常见。我平时会让 Claude Code 处理一些批量重命名、依赖升级、单元测试补全的活单个任务动辄五到十五分钟。如果一直盯着终端效率极低如果不盯又容易错过完成时机甚至把整个会话晾在那里。尤其是当你在多个项目之间切换时一个任务完成了没有通知你很可能就把它忘了。Claude Code 本身提供了 hooks 机制允许在特定事件发生时执行自定义命令。其中Stop事件就是在 Claude Code 完成一次响应、准备把控制权交还给你时触发的。把这个事件接到一个通知脚本上就能实现“任务完成自动提醒”。而通知渠道我选择用微信因为它在手机上推送及时不需要额外装 App也不依赖任何特殊网络环境。整条链路是这样的Claude Code 触发Stophook → 执行notify.sh→ 脚本调用微信推送接口 → 你的微信收到消息。同时脚本里还可以顺带通过 TaoToken 的统一 API 通道做一次模型调用比如让模型生成一句任务摘要或者记录本次会话的元信息。TaoToken 在这里的角色是统一 Key 管理你不需要在脚本里硬编码多个平台的密钥一个 Key 就能覆盖模型调用和后续扩展。这篇文章会从零开始把settings.json的 hooks 配置、notify.sh脚本编写、TaoToken 统一 Key 的接入方式以及一次完整的端到端验证全部走一遍。你照着做大概十分钟就能让 Claude Code 在完事后给你发微信。2. TaoToken 统一 Key 与 hooks 通知链路的前置准备在动手写配置之前先把几个关键概念和准备工作理清楚。很多人卡住不是因为脚本写错而是因为前置条件没满足比如 Key 没拿到、脚本权限不对、或者settings.json被覆盖了。2.1 TaoToken 统一 Key 是什么为什么这里要用它TaoToken 是一个面向开发者的 API 统一接入层它把模型调用、Key 管理、用量查看这些事集中到一个控制台里。你可以把它理解成一个“API 网关 密钥管家”你只需要在 TaoToken 控制台创建一个 Key就能通过统一的 Base URL 调用后端模型不用在每个项目里分别配置不同平台的密钥。在这个通知链路里TaoToken 的作用有两个。第一notify.sh脚本里如果需要调用模型生成任务摘要可以直接用 TaoToken 的 API 通道Base URL 是https://taotoken.net/apiKey 就是你在控制台创建的那一个。第二如果你后续想扩展通知内容比如让模型判断任务是否成功、提取关键变更也只需要在这一个 Key 下操作不用再折腾多套鉴权。创建 Key 的入口在 TaoToken 控制台的 API Keys 页面。登录后进入控制台找到 API Keys 菜单点创建复制生成的 Key 字符串。这个 Key 只显示一次建议先存到密码管理器里。模型 ID 方面你可以根据自己常用的模型来选比如claude-sonnet-4-20250514这类标识具体以控制台模型列表为准。2.2 微信通知渠道的选择与 Token 获取微信通知这块我用的是一个常见的公众号推送服务它通过关注公众号后自动分配一个 Token然后你往一个固定 URL POST 内容就能在微信里收到消息。整个流程不需要额外安装任何东西也不涉及特殊网络配置。你需要在微信里关注对应的公众号关注后它会自动回复一个 Token格式类似一串字母数字组合。把这个 Token 记下来后面脚本里要用。注意这个 Token 是跟你的微信绑定的不要泄露到公开仓库里。2.3 目录结构与文件规划Claude Code 的 hooks 配置默认读取~/.claude/settings.json。通知脚本我放在~/.claude/hooks/notify.sh。这样目录结构清晰也方便后续管理多个 hook 脚本。在终端里先创建目录mkdir -p ~/.claude/hooks然后确认一下~/.claude/settings.json是否存在ls -la ~/.claude/settings.json如果文件不存在后面可以直接创建如果已经存在千万不要用cat 直接覆盖否则你原有的配置全没了。正确做法是用编辑器打开把hooks字段合并进去。2.4 环境检查清单在继续之前确认这几项你的系统是 macOS 或 LinuxWindows 用户建议在 WSL 下操作或者把脚本改成 PowerShell 版本。bash可用curl可用。终端里执行which bash curl能返回路径即可。你已经拿到微信推送 Token 和 TaoToken 的 API Key。你有权限写入~/.claude/目录。这些都没问题的话就可以进入配置环节了。3. 可复制的 settings.json 与 notify.sh 完整配置这一节是核心所有代码都可以直接复制。我会把settings.json的 hooks 片段、notify.sh的完整脚本、以及 TaoToken 统一 Key 的接入方式都写清楚。你只需要替换两个占位符微信推送 Token 和 TaoToken API Key。3.1 settings.json 的 hooks 配置片段Claude Code 的 hooks 配置结构是顶层一个hooks对象里面按事件名分组每个事件是一个数组数组里每个元素包含matcher和hooks。Stop事件在 Claude Code 完成响应时触发。如果你已经有~/.claude/settings.json用编辑器打开把下面这段合并进去。如果文件不存在直接创建{ hooks: { Stop: [ { matcher: , hooks: [ { type: command, command: bash ~/.claude/hooks/notify.sh } ] } ] } }这里matcher留空表示匹配所有 Stop 事件。type是command表示执行一个 shell 命令。command指向我们的通知脚本。如果你还想在 Claude Code 请求权限时也收到通知可以再加一个Notification事件{ hooks: { Stop: [ { matcher: , hooks: [ { type: command, command: bash ~/.claude/hooks/notify.sh } ] } ], Notification: [ { matcher: , hooks: [ { type: command, command: bash ~/.claude/hooks/notify.sh permission } ] } ] } }这样当 Claude Code 需要你确认权限时也会推一条微信避免它干等着。3.2 notify.sh 脚本完整内容脚本要做几件事读取微信推送 Token、获取当前时间和工作目录、发送 POST 请求、可选地调用 TaoToken API 生成摘要、最后正常退出。#!/bin/bash # # Claude Code 任务完成微信通知脚本 # 依赖bash、curl # 使用前替换 WECHAT_TOKEN 和 TAOTOKEN_API_KEY # # 微信推送 Token替换为你自己的 WECHAT_TOKENYOUR_WECHAT_TOKEN WECHAT_URLhttps://wx.xtuis.cn/${WECHAT_TOKEN}.send # TaoToken 统一 Key替换为你自己的 TAOTOKEN_API_KEYYOUR_TAOTOKEN_API_KEY TAOTOKEN_BASE_URLhttps://taotoken.net/api TAOTOKEN_MODELclaude-sonnet-4-20250514 # 通知类型默认 stop可由参数覆盖 NOTIFY_TYPE${1:-stop} # 获取当前时间和会话标识 TIME$(date %Y-%m-%d %H:%M:%S) SESSION$(basename $(pwd)) # 根据类型设置标题 if [ $NOTIFY_TYPE permission ]; then TITLEClaude Code 等待权限确认 else TITLEClaude Code 任务完成 fi # 可选调用 TaoToken 生成一句简短摘要 SUMMARY if [ -n $TAOTOKEN_API_KEY ] [ $TAOTOKEN_API_KEY ! YOUR_TAOTOKEN_API_KEY ]; then SUMMARY$(curl -s -X POST ${TAOTOKEN_BASE_URL}/v1/messages \ -H Content-Type: application/json \ -H x-api-key: ${TAOTOKEN_API_KEY} \ -H anthropic-version: 2023-06-01 \ -d { \model\: \${TAOTOKEN_MODEL}\, \max_tokens\: 64, \messages\: [ {\role\: \user\, \content\: \用一句话总结Claude Code 在目录 ${SESSION} 完成了一次任务时间是 ${TIME}。直接输出摘要不要解释。\} ] } | grep -o text:[^]* | head -1 | sed s/text://;s/$//) fi # 组装通知内容 DESP会话: ${SESSION}%0A时间: ${TIME} if [ -n $SUMMARY ]; then DESP${DESP}%0A摘要: ${SUMMARY} fi # 发送微信通知 curl -s -X POST $WECHAT_URL \ -d text ${TITLE} \ -d desp${DESP} \ /dev/null 21 exit 0几个关键点说明。第一WECHAT_TOKEN和TAOTOKEN_API_KEY必须替换成你自己的否则通知发不出去。第二TaoToken 的调用是可选的如果你暂时不想用模型生成摘要把TAOTOKEN_API_KEY留成占位符脚本会跳过这一步只发基础通知。第三grep -o那段是从返回 JSON 里提取text字段不同模型返回格式可能略有差异如果提取不到摘要为空不影响主流程。3.3 脚本权限与路径确认写完脚本后给它加执行权限chmod x ~/.claude/hooks/notify.sh然后确认路径正确ls -la ~/.claude/hooks/notify.sh应该能看到-rwxr-xr-x权限。如果settings.json里的路径写的是~/.claude/hooks/notify.sh而你的实际路径不同记得改成绝对路径比如/Users/你的用户名/.claude/hooks/notify.sh避免因为 shell 展开问题导致 hook 执行失败。3.4 TaoToken 统一 Key 的接入参数对照下面这张表把脚本里用到的 TaoToken 参数列清楚方便你对照控制台填写参数值说明Base URLhttps://taotoken.net/api统一 API 入口不加 UTMAPI Key控制台创建放在x-api-key请求头Model ID如claude-sonnet-4-20250514以控制台模型列表为准接口路径/v1/messages消息调用接口版本头anthropic-version: 2023-06-01兼容 Anthropic 格式如果你用的是其他模型把TAOTOKEN_MODEL换成对应的 Model ID 即可。Base URL 和 Key 这两项在所有调用里保持一致这就是统一 Key 的好处。4. 端到端验证从手动执行到 Claude Code 触发配置写完了接下来要验证它真的能跑通。验证分两步先手动执行脚本确认微信能收到再启动 Claude Code 跑一个任务确认 hook 被触发。4.1 手动执行 notify.sh在终端里直接运行bash ~/.claude/hooks/notify.sh如果一切正常你的微信应该立刻收到一条消息标题是“Claude Code 任务完成”内容里包含当前目录名和时间。如果配置了 TaoToken还会多一行摘要。如果没收到先看终端有没有报错。脚本里curl的输出被重定向到了/dev/null所以终端不会显示返回内容。你可以临时把 /dev/null 21去掉再跑一次看看微信接口返回了什么。常见返回是success或类似状态码。4.2 验证 TaoToken 调用是否成功单独测一下 TaoToken 的接口确认 Key 和 Base URL 没问题curl -s -X POST https://taotoken.net/api/v1/messages \ -H Content-Type: application/json \ -H x-api-key: YOUR_TAOTOKEN_API_KEY \ -H anthropic-version: 2023-06-01 \ -d { model: claude-sonnet-4-20250514, max_tokens: 32, messages: [ {role: user, content: 回复 OK} ] }如果返回里有content字段和文本内容说明 Key 和通道都正常。如果返回 401检查 Key 是否复制完整如果返回模型不存在检查 Model ID 是否和控制台一致。4.3 在 Claude Code 中触发 Stop hook手动脚本没问题后启动 Claude Codeclaude在交互界面里输入一个简单任务比如你好帮我列出当前目录下的文件等 Claude Code 完成响应Stop hook 会被触发notify.sh执行微信收到通知。你也可以直接用命令行参数跑claude 你好任务结束后同样会触发。4.4 验证权限通知可选如果你在settings.json里加了Notification事件可以故意让 Claude Code 做一个需要权限确认的操作比如让它修改一个文件。当它弹出确认提示时微信应该收到“Claude Code 等待权限确认”的通知。4.5 一次完整的成功结果记录我实测下来从 Claude Code 完成任务到微信收到消息延迟大概在一到两秒。通知内容里能看到会话目录和时间如果开了 TaoToken 摘要还能看到一句简短的描述比如“在 project-x 目录完成了一次文件列表任务”。这样你即使不在电脑前也能大致知道是哪个项目跑完了。5. 常见报错排查401、local proxy failed、reading choices 与 OAuth配置过程中最容易遇到的几个报错我逐个列出来对照着排查。5.1 401 鉴权失败这是最常见的。表现是 TaoToken 接口返回 401或者微信推送没反应但脚本没报错。先检查TAOTOKEN_API_KEY是否替换成了真实 Key。很多人复制的时候带了空格或者把YOUR_TAOTOKEN_API_KEY原样留着。用echo $TAOTOKEN_API_KEY在脚本里打印一下确认值正确。再检查请求头字段名。TaoToken 的 Anthropic 兼容接口用的是x-api-key不是Authorization: Bearer。如果你混用了 OpenAI 风格的鉴权头就会 401。微信推送这边401 通常意味着 Token 不对。检查WECHAT_TOKEN是否和公众号回复的一致注意大小写。5.2 local proxy failed这个报错通常出现在你本地有网络代理设置但脚本执行时环境变量没继承或者代理配置和当前网络环境不匹配。表现是curl请求超时或连接被拒绝。排查方法在终端里执行env | grep -i proxy看看有没有http_proxy、https_proxy之类的变量。如果有确认它们指向的地址是可达的。如果你不需要代理可以临时取消unset http_proxy https_proxy all_proxy然后再跑脚本。注意这里说的是本地环境变量清理不涉及任何特殊网络工具。5.3 reading choices 相关报错这个报错一般出现在模型返回格式和脚本解析不匹配的时候。比如 TaoToken 返回的 JSON 里content是一个数组而你的grep表达式没匹配到。表现是摘要为空但通知还能发出去。解决办法先把curl的原始返回打印出来看看结构。把脚本里grep -o text:[^]*换成更通用的解析或者直接用jqSUMMARY$(curl -s ... | jq -r .content[0].text // empty)如果你没装jq用python3 -c也行。关键是先看清楚返回结构再写解析。5.4 OAuth 相关报错如果你在 Claude Code 里配置了 OAuth 登录有时候 hook 执行环境和你交互式 shell 的环境不同可能导致鉴权状态读不到。表现是 Claude Code 本身能用但 hook 里的模型调用失败。排查确认notify.sh里用的是 TaoToken 的 API Key而不是依赖 Claude Code 的 OAuth 会话。这两者是独立的。TaoToken 的 Key 是显式放在请求头里的不依赖任何登录态所以只要 Key 正确就不会受 OAuth 影响。5.5 脚本没有执行如果 Claude Code 跑完了但微信没动静先确认settings.json的 JSON 格式合法。可以用python3 -m json.tool ~/.claude/settings.json检查。格式错误会导致整个配置被忽略。再确认command路径正确。如果你写的是~/.claude/hooks/notify.sh在某些执行环境下~不会展开建议改成绝对路径。最后确认脚本有执行权限chmod x那一步不能漏。5.6 微信收到重复通知如果你同时配置了Stop和Notification而某些操作既触发 Stop 又触发 Notification可能会收到两条。这是正常的按需保留即可。如果只想在任务完成时通知把Notification那段删掉。6. 把通知链路用起来从单次提醒到长期编码工作流配置跑通之后这条通知链路的价值不只是“任务完成响一声”。你可以把它嵌进日常的编码工作流里让 Claude Code 真正变成一个可以后台跑、你只管收结果的助手。我自己的用法是这样的早上到工位先给 Claude Code 扔几个独立任务比如“把 utils 目录下的函数补上类型注解”“跑一遍测试并修复失败用例”“把 README 里的示例代码更新到最新 API”。每个任务启动后我就不盯终端了去处理邮件或者开会。微信一响我就知道某个任务完成了抽空回去看一眼结果再决定下一步。如果你经常跑长时间任务可以考虑把 TaoToken 的 Coding Plan 用起来。它适合这种持续性的编码和 Agent 场景统一 Key 管理多个会话不用每次切换项目都换密钥。入口在 TaoToken 的 Coding Plan 页面具体权益以控制台说明为准。另外notify.sh里其实还可以做更多事。比如在通知里带上本次任务的 git diff 统计或者把完成时间追加到一个日志文件里方便回顾一天跑了多少任务。这些扩展都不难核心就是 hook 触发脚本脚本里你想干什么都行。如果你还没创建 TaoToken 的 Key可以去控制台的 API Keys 页面建一个顺便看看模型对话功能测试一下模型调用是否正常。接入文档里也有完整的参数说明遇到不确定的字段可以对照查。最后说一个我踩过的坑一开始我把notify.sh放在项目目录里结果换项目后 hook 找不到脚本。后来统一放到~/.claude/hooks/下用绝对路径引用就再也没出过问题。脚本里的 Token 也不要提交到 git建议用环境变量或者单独的配置文件读取避免泄露。
返回列表