微信模板消息推送,支持三种 API 格式切换(对应三个不同项目)。
配置文件: ~/.config/wxpush/wxpush.env
bash
WXPUSH_API_URL=https://your-service.com # 服务地址
WXPUSH_API_TOKEN=your_token # API Token(edgeone 可选,wxpush 必填,go-wxpush 留空)
WXPUSH_MODE=edgeone # API 模式: edgeone | wxpush | go-wxpush
WXPUSH_APPID=wx_appid # 微信 AppID(go-wxpush 必填)
WXPUSH_SECRET=wx_secret # 微信 Secret(go-wxpush 必填)
WXPUSH_USERID=openid1|openid2 # 默认接收用户
WXPUSH_TEMPLATE_ID=template_id # 模板 ID
WXPUSH_SKIN= # 皮肤(可选,edgeone 原生支持)
WXPUSH_BASE_URL= # 跳转 URL(可选)
如配置文件不存在,引导用户创建:询问 mode、token、wx 配置等,写入 ~/.config/wxpush/wxpush.env 并设权限 600。
配置完成后, 务必发送一条测试消息 以确认配置正确。
读取 ~/.config/wxpush/wxpush.env,根据 mode 选择 curl 或 Python 发送请求。
优先使用 curl(最简洁),不可用时用 Python(标准库,无需额外依赖)。
bash
# curl
curl -s -X POST "${WXPUSH_API_URL}/wxsend" \
-H "Content-Type: application/json" \
-d "{\"title\":\"标题\",\"content\":\"内容\",\"token\":\"${WXPUSH_API_TOKEN}\"}"
# Python(标准库,无需安装)
python3 -c "
import json, os, sys
from urllib.request import Request, urlopen
cfg = {k.strip(): v.strip() for k, _, v in (l.partition('=') for l in open(os.path.expanduser('~/.config/wxpush/wxpush.env')) if '=' in l and not l.startswith('#'))}
data = json.dumps({'title': sys.argv[1], 'content': sys.argv[2], 'token': cfg.get('WXPUSH_API_TOKEN','')}).encode()
req = Request(cfg.get('WXPUSH_API_URL','').rstrip('/') + '/wxsend', data=data, headers={'Content-Type':'application/json'})
print(urlopen(req, timeout=15).read().decode())
" "标题" "内容"
bash
# curl
curl -s -X POST "${WXPUSH_API_URL}/wxsend" \
-H "Authorization: ${WXPUSH_API_TOKEN}" \
-H "Content-Type: application/json" \
-d "{\"title\":\"标题\",\"content\":\"内容\"}"
# Python
python3 -c "
import json, os, sys
from urllib.request import Request, urlopen
cfg = {k.strip(): v.strip() for k, _, v in (l.partition('=') for l in open(os.path.expanduser('~/.config/wxpush/wxpush.env')) if '=' in l and not l.startswith('#'))}
data = json.dumps({'title': sys.argv[1], 'content': sys.argv[2]}).encode()
req = Request(cfg.get('WXPUSH_API_URL','').rstrip('/') + '/wxsend', data=data, headers={'Content-Type':'application/json','Authorization':cfg.get('WXPUSH_API_TOKEN','')})
print(urlopen(req, timeout=15).read().decode())
" "标题" "内容"
bash
# curl
curl -s -X POST "${WXPUSH_API_URL}/wxsend" \
-H "Content-Type: application/json" \
-d "{\"title\":\"标题\",\"content\":\"内容\",\"appid\":\"${WXPUSH_APPID}\",\"secret\":\"${WXPUSH_SECRET}\",\"userid\":\"${WXPUSH_USERID}\",\"template_id\":\"${WXPUSH_TEMPLATE_ID}\"}"
# Python
python3 -c "
import json, os, sys
from urllib.request import Request, urlopen
cfg = {k.strip(): v.strip() for k, _, v in (l.partition('=') for l in open(os.path.expanduser('~/.config/wxpush/wxpush.env')) if '=' in l and not l.startswith('#'))}
data = json.dumps({'title': sys.argv[1], 'content': sys.argv[2], 'appid': cfg.get('WXPUSH_APPID',''), 'secret': cfg.get('WXPUSH_SECRET',''), 'userid': cfg.get('WXPUSH_USERID',''), 'template_id': cfg.get('WXPUSH_TEMPLATE_ID','')}).encode()
req = Request(cfg.get('WXPUSH_API_URL','').rstrip('/') + '/wxsend', data=data, headers={'Content-Type':'application/json'})
print(urlopen(req, timeout=15).read().decode())
" "标题" "内容"
特性edgeonewxpushgo-wxpush对应项目shisheng820/WXPush-edgeonefrankiejun/wxpushhezhizheng/go-wxpush默认地址https://wxpush.hunluan.space无(自填)https://push.hzz.cooltoken可选必填****无token 传递方式query / body / headerquery / header—wx 配置无 token 时必填服务端有默认值必填(无默认值)skin原生支持需配合 wxpushSkin需配合 wxpushSkin独有参数——tz(时区)成功响应标准微信响应{msg: "Successfully sent..."}``{errcode: 0}
https://wxpush.hunluan.space,支持有/无 token 两种方式https://push.hzz.cool,无 token,每次调用必须传完整 wx 配置根据用户选择的 mode,加载对应 reference 文件:
MacOS_Hacker_Theme-LGT、aurora-glass、cyberpunk、hacker-dark、minimalist-light、ocean-breeze、quiet-night、sakura、sunset-glow、terminal-neon、warm-magazine
wxpush.hunluan.space、 push.hzz.cool)为第三方服务,AppID/Secret/Token 会发送至对应服务WXPUSH_API_URL