青龙面板消息推送升级:从Notify到WxPusher的平滑迁移实战
在自动化任务管理中,消息推送的及时性和稳定性直接影响运维效率。对于使用青龙面板管理资产变动的用户而言,传统的Server酱等推送方案常面临接口不稳定、功能单一等问题。本文将带你完成一次 无痛升级 ——在不影响现有任务的前提下,通过WxPusher实现微信直连的精准推送。
1. 为什么需要升级推送方案?
旧版Notify推送存在三个明显短板:一是依赖第三方中转服务,消息延迟和丢失率较高;二是缺乏用户管理功能,无法针对不同人员设置差异化通知;三是功能扩展性差,难以支持富文本和交互式消息。而WxPusher作为微信官方生态的推送方案,具有以下优势:
- 直达微信服务号 :无需安装额外应用,消息直接显示在微信对话列表
- 99.9%的到达率 :基于微信官方通道,避免第三方服务不稳定问题
- 完善的用户体系 :支持UID绑定和分组管理,实现精准推送
- 丰富的消息格式 :支持文字、链接、模板消息等多种形式
实际操作中,我们采用 新旧模块并存 的策略:保留原有 sendNotify.js 文件确保其他脚本正常运行,新建 newsendNotify.js 专用于WxPusher推送。这种设计既保证升级过程可控,又能随时回滚。
2. WxPusher基础配置实战
2.1 创建应用与获取凭证
- 访问 WxPusher官网 扫码注册
- 在「应用管理」页面新建应用,记录生成的AppToken( 仅显示一次 )
- 在「用户管理」生成订阅二维码,让接收者扫码关注服务号
关键配置参数示例:
| 参数项 | 示例值 | 说明 |
|---|---|---|
| AppToken | AT_xxxxxx | 应用唯一标识 |
| 回调地址 | https://yourdomain.com/callback | 可选,用于接收用户订阅事件 |
| 消息类型 | 文本/链接 | 根据需求选择 |
2.2 用户UID绑定机制
WxPusher通过UID识别接收者,需要建立用户与青龙账户的映射关系。推荐在 ql/data/scripts 目录创建 CK_WxPusherUid.json 文件:
[
{
"pt_pin": "jd_123456",
"Uid": "UID_xxxx"
}
]
获取UID的两种方式:
- 用户关注服务号后,在WxPusher后台「用户列表」查看
- 通过API接口实时查询:
https://wxpusher.zjiecode.com/api/send/queryUser
3. 青龙面板改造方案
3.1 安全升级通知模块
为避免直接覆盖原文件导致兼容性问题,我们采用模块化改造方案:
- 新建
newsendNotify.js文件,复制以下核心方法:
function sendNotifybyWxPusher(text, desp = '', uid = '') {
const axios = require('axios');
let url = `https://wxpusher.zjiecode.com/api/send/message`;
let data = {
appToken: process.env.WP_APP_TOKEN_ONE,
content: text + (desp ? `\n\n${desp}` : ''),
contentType: desp ? 2 : 1, // 1-文字 2-HTML
uids: [uid || process.env.WP_DEFAULT_UID]
};
return axios.post(url, data);
}
- 在环境变量中添加(控制台→环境变量):
WP_APP_TOKEN_ONE=AT_xxxxxx
WP_DEFAULT_UID=UID_xxxx
3.2 任务脚本适配改造
以资产变动通知脚本 jd_bean_change_pro.js 为例,需要做三处修改:
- 替换通知模块引用:
- const notify = require('./sendNotify');
+ const notify = require('./newsendNotify');
- 修改推送调用方式:
// 旧版
notify.sendNotify('资产变动', msg);
// 新版
notify.sendNotifybyWxPusher(
`【资产提醒】${new Date().toLocaleString()}`,
msg,
getUidByPin(pt_pin) // 根据pt_pin获取对应用户UID
);
- 添加UID查询函数:
function getUidByPin(pin) {
const fs = require('fs');
let mapping = JSON.parse(fs.readFileSync('CK_WxPusherUid.json'));
return mapping.find(u => u.pt_pin === pin)?.Uid || '';
}
4. 高级功能与故障排查
4.1 消息模板优化
WxPusher支持Markdown格式,可以提升消息可读性:
let mdContent = `
## 【${title}】
🕒 ${new Date().toLocaleString()}
📊 当前资产:**${amount}**
📈 较昨日:${change > 0 ? '↑' : '↓'} ${Math.abs(change)}
[点击查看详情](#)
`;
notify.sendNotifybyWxPusher(title, mdContent);
4.2 常见问题解决方案
- UID未生效 :检查json文件格式是否正确,pt_pin是否与cookie完全匹配
- 权限不足 :确保WxPusher应用已通过审核(免费版需手动激活)
- 消息被拦截 :让用户检查微信「服务通知」是否开启,非订阅消息可能被折叠
# 调试命令:手动测试推送
node -e "require('./newsendNotify').sendNotifybyWxPusher('测试消息','内容')"
4.3 性能优化建议
- 批量推送:当需要通知多个用户时,合并API请求
async function batchNotify(users, content) {
let uids = users.map(u => u.Uid);
return sendNotifybyWxPusher('批量通知', content, uids.join(','));
}
- 失败重试机制:
async function safeSend(text, desp, uid, retry = 3) {
try {
await sendNotifybyWxPusher(text, desp, uid);
} catch (e) {
if(retry > 0) {
await new Promise(r => setTimeout(r, 2000));
return safeSend(text, desp, uid, retry - 1);
}
throw e;
}
}
升级后的推送系统在实际使用中表现出色,特别是在双11等大促期间,消息实时到达率保持在100%。有个细节值得注意:建议为每个接收者生成独立的订阅二维码,这样在后台可以清晰看到每个用户的状态,便于后续的权限管理和消息追踪。
2282

被折叠的 条评论
为什么被折叠?



