个人微信消息推送双通道方案

目标:服务器脚本与 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"

企业微信侧配置

  1. 管理后台新建自建应用,记下 AgentId,手机扫码查看 Secret
  2. 应用详情页 → 企业可信 IP → 填服务器公网 IP(2022 年后建的应用必填)
  3. 可见范围选接收成员
  4. 我的企业 → 微信插件 → 个人微信扫码关注 → 勾选"允许成员在微信插件中接收和回复聊天消息"
  5. 手机企业微信 App:消息 → 设置 → 消息通知 → 其他 → "仅在企业微信中接受消息"下的"会话消息""应用消息"全部关闭。不关则消息只到企业微信 App,不下发微信。

app.py 关键点

  • CORP_ID / KF_SECRET / TO_USER_ID / AGENT_ID / WEBHOOK_TOKEN 全部环境变量化,禁止 hardcode
  • access_token 内存缓存(有效期 7200 秒,提前 300 秒刷新),勿每次请求重取
  • requests 必须设 timeout
  • 启动时校验环境变量,缺失直接报错
  • 文本消息上限 2048 字节,超长截断

排错

现象原因
空回包 / 连接超时云防火墙未放行端口
301002token 所属应用与 agentid 不是同一个应用
81013 invaliduserTO_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 公众号推送通道已失效,第三方通道不采用。

标签: none

添加新评论