6a64a7de6f823fdfe8fb077a11d1bbc3d77e33f4
真机定位(2026-11-07):仓库里的 sendNotify.js 每轮都被覆盖,改它不生效。
青龙 shell/update.sh 的 gen_list_repo 复制顺序是三步,后一步盖前一步:
407: cp -f $file_notify_js "${dir_scripts}/${uniq_path}" 面板自带的 sendNotify.js
415: cp -f $_file "${dir_scripts}/${uniq_path}/${file_path}" 仓库的(覆盖①)
421: cp -rf $dir_dep/* "${dir_scripts}/${uniq_path}" /ql/data/deps/*(再覆盖②)
而 share.sh:228 在初始化时把面板自带的 sample/notify.js 拷成了 /ql/data/deps/sendNotify.js。
③ 排在最后 → 最终文件永远是面板自带那份,204 修复永远不生效。
改为脚本内联实现 notify(),零依赖(只用内置 http/https):
- httpPost / parseHookHeaders / buildHookBody / notify 四个函数,约 90 行
- 2xx 一律算成功(204 不再误判)
- buildHookBody 对 application/json 先试 JSON.parse,不合法就 JSON.stringify 重建,
内容里带引号/换行/反斜杠都安全(青龙 parseString 那个坑绕开了)
- 双通道:webhook + pushplus 直发,任一路成功即 ok
- 两路都没配时打一行明确提示,不再静默
main() 里删掉 require('../sendNotify'),改成 await notify('QQ音乐签到', desp)。
第四参 author 的追加逻辑也一并没了,正文不再带「本通知 By:github.com/whyour/qinglong」。
新增 test_notify.js:38 条断言
- parseHookHeaders 八种输入(含字面量 \n 不切开)
- buildHookBody 三种特殊字符(双引号/反斜杠/制表符)
- notify 六种状态码(200/204/201 通过,401/403/400/429 失败)
- 无配置、双通道部分失败
端到端已验证:mock 服务收到的 content 与原始 desp 逐字相同(10 行完整),
title 正确,header 带 token,HTTP 204 判为成功。
README 重写「通知发不出去怎么查」:坑 0 改成 deps 覆盖(附验证命令),
坑 1-3 保留但标注为「若又接回 sendNotify 才需注意」,新增 pushplus 展示限制的
三种官方解法与代价对照。
青龙面板脚本库
这是一个专为青龙面板设计的脚本库,包含各种自动化脚本和工具。
简介
青龙面板是一个支持 Python3、JavaScript、Shell、Typescript 的定时任务管理平台。本仓库提供了一系列实用的脚本,帮助用户更好地使用青龙面板进行自动化任务管理。
功能特性
- 📦 丰富的脚本库
- 🔧 易于配置和使用
- 📝 详细的文档说明
- 🚀 持续更新维护
脚本列表
| 脚本名称 | 文件路径 | 功能描述 | 环境变量 | 定时规则 |
|---|---|---|---|---|
| 京东Cookie辅助脚本 | jd/scrip_moving_env_enhance.js |
将JD CK进行重排序,保证所有账号都有助力与被助力的机会 | 需要修改脚本内域名(对应ql的域名) | 59 23 */3 * * |
| 携趣白名单切换 | xiequ/scrip_switch.js |
多个携趣账号,多个IP,自动选择合适的携趣进行白名单切换 | XQ_ACCOUNTSXQ_WHITELIST |
38 2,8,14,20 * * * |
| QQ音乐自动签到 | qqmusic/scrip_qqmusic_checkin.js |
QQ音乐会员成长值任务 + 会员福利站自动签到(签到/挂件/装扮/听书/节目/礼券/月里程碑/抽奖) | SH_QQMUSIC_KEY(多账号同名多条,格式 <uin>#<qm_keyst>) |
1 0,6 * * * |
| 通知链路诊断 | scrip_diag_notify.js |
排查「通知只收到标题」「自定义发送通知消息失败」:查 sendNotify 加载、env、webhook 前置条件、body 解析、直打平台、pushplus 模板对比 | 无(读现有通知 env) | 0 0 1 1 *(等于不自动跑,手动执行) |
文件名约定:订阅白名单是
scrip_,所有脚本文件必须带该前缀才会被拉取。 详见各目录下的 README。
安装使用
环境要求
- Node.js >= 14.0.0
- 青龙面板 >= 2.10.0
快速开始
- 订阅
ql repo https://gitea.zhuhjay.cn/zhuhjay/ql-scripts.git "scrip_" "" "sendNotify|common" "js"
青龙自动建任务的元数据约定(必读)
订阅勾了「自动添加定时任务」时,青龙从脚本正文正则提取任务名与 cron。 两条正则都不锚定行首、取全文第一个命中(2026-11-04 真机踩坑实录):
| 项 | 青龙的提取规则 | 必须怎么写 |
|---|---|---|
| 任务名 | /name:\s*(.+)/ |
文件最前面写一行 // name: 中文任务名。全文任何位置都不能再出现「name + 冒号」的连写 —— https.request({ hostname: u.hostname }) 会被抓成任务名 u.hostname,(已复现) |
| cron | /\bcron:\s*([^\r\n]+)/,必须带冒号 |
写 // cron: 1 0,6 * * *,独占一行、后面不跟任何注释(同一行剩余文字会被一起吞进 schedule) |
两个都抓不到时的兜底:任务名 = 文件名;cron = 随机 M H * * *(这就是那次任务被建成 18 21 * * * 的原因)。
自检:
node _probe_meta.js # 扫描所有 scrip_*.js,复刻两个版本青龙的正则,验证提取结果
_probe_meta.js 是开发期工具,不带 scrip_ 前缀,不会被订阅拉取。
新增脚本后跑一次,全 PASS 再提交。
各脚本的注解写法
// cron: <表达式>
// name: <中文任务名>
/** 说明文字写这里,注意别写 "name:" 连写 */
用行注释而不是块注释:块注释里 cron 的 */ 会提前闭合注释,必须写成 *\/,
而青龙会把反斜杠一起提取出去导致 cron 非法。
脚本说明
使用方法
每个脚本都有详细的使用说明,请查看对应的文档或脚本内的注释。
注意事项
- 请确保脚本符合青龙面板的规范
- 使用前请仔细阅读脚本说明
- 定期更新脚本以获得最新功能
免责声明
本项目仅供学习交流使用,请勿用于非法用途。使用本项目所产生的一切后果由使用者自行承担。
⭐ 如果这个项目对你有帮助,请给个 Star 支持一下!
Description
Languages
JavaScript
84.9%
Python
15.1%