个人微信消息推送双通道方案
个人微信消息推送双通道方案
目标:服务器脚本与 Muse 的通知直达个人微信,全程自有基础设施,不依赖第三方推送服务。
通道一:企业应用消息(zwechat-adapter)
链路:调用方 → https://zwmessage.755855.xyz/webhook → Caddy → zwechat-adapter 容器 → 企业微信自建应用 API → 应用消息 → 成员手机(企业微信 App / 微信)
服务端部署
- 位置:云服务器
/data/zwechat,podman,znet 网络 - Dockerfile:
python:3.10-alpine+fastapi uvicorn requests,8000 端口跑 uvicorn - 构建:
podman build -t localhost/zwechat-adapter:v1 . - 运行:
podman run -d --name myz --network znet -p 8000:8000 -m 50m \
-e CORP_ID="..." -e KF_SECRET="..." -e TO_USER_ID="..." \
-e AGENT_ID="..." -e WEBHOOK_TOKEN="..." \
localhost/zwechat-adapter:v1- Caddy 反代:
zwmessage.755855.xyz {
reverse_proxy myz:8000
}- DNS:Cloudflare 托管,A 记录指服务器,小黄云可开,SSL 模式用"完全(严格)"
- 通后关闭 8000 公网规则,只留 80/443
调用方法
GET https://zwmessage.755855.xyz/webhook?token=xxx&msg=xxx返回 {"status":"success"} 即成功;token 不对返回 403。
测试方法
curl -G "https://zwmessage.755855.xyz/webhook?token=xxx" --data-urlencode "msg=ceshi"企业微信侧配置
- 管理后台新建自建应用,记下 AgentId,手机扫码查看 Secret
- 应用详情页 → 企业可信 IP → 填服务器公网 IP(2022 年后建的应用必填)
- 可见范围选接收成员
- 我的企业 → 微信插件 → 个人微信扫码关注 → 勾选"允许成员在微信插件中接收和回复聊天消息"
- 手机企业微信 App:消息 → 设置 → 消息通知 → 其他 → "仅在企业微信中接受消息"下的"会话消息""应用消息"全部关闭。不关则消息只到企业微信 App,不下发微信。
app.py 关键点
- CORP_ID / KF_SECRET / TO_USER_ID / AGENT_ID / WEBHOOK_TOKEN 全部环境变量化,禁止 hardcode
- access_token 内存缓存(有效期 7200 秒,提前 300 秒刷新),勿每次请求重取
- requests 必须设 timeout
- 启动时校验环境变量,缺失直接报错
- 文本消息上限 2048 字节,超长截断
排错
| 现象 | 原因 |
|---|---|
| 空回包 / 连接超时 | 云防火墙未放行端口 |
| 301002 | token 所属应用与 agentid 不是同一个应用 |
| 81013 invaliduser | TO_USER_ID 有误,以通讯录"账号"栏为准,不是姓名 |
| 403 token 无效 | WEBHOOK_TOKEN 与传入值不一致 |
| 企业微信收到、微信收不到 | 查手机端"仅在企业微信中接受消息"是否已关闭 |
通道二:群机器人 webhook
链路:调用方 → 群机器人 webhook → 企业微信内部群 → 微信插件 → 微信
调用方法
POST https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx
Content-Type: application/json
{"msgtype":"text","text":{"content":"消息内容"}}返回 {"errcode":0} 即成功。实测群聊消息经微信插件可达个人微信。
术语约定(与 Muse 协同)
- "发企业应用消息" = 调通道一
- "企业机器人" = 调通道二
结论
双通道均双端(企业微信 App + 个人微信)可达。2026-10 实测 WxPusher 公众号推送通道已失效,第三方通道不采用。