|
|
f5c9ca6fa1
|
feat(qqmusic): 标题带结论 + 首行放摘要,折叠状态也能看关键信息
用户截图确认:pushplus 的微信卡片只显示「标题 QQ音乐签到 + 正文第一行」,
后面的明细全折叠。查 pushplus 官方文档,这是平台默认行为 ——
服务号模板消息默认不展示具体内容,必须点「查看详情」。
三条官方解法都要额外成本(发「激活消息」24h 内限 5 条 / 开会员 /
绑定自己认证的服务号每年 300 元),所以不改通道,改信息密度:
- 标题从固定的「QQ音乐签到」改成三态:QQ音乐签到 ✅ / 🟡 / ⚠️
- 正文第一行从「✅ QQ音乐签到 · 全部完成」改成带数字的摘要:
「✅ 全部完成 · 成长值 +35」「✅ 已完成 · 成长值 +15 · 1 项待处理」
- 引入三态结论 state:done / warn(有 △ 但无 ✗,仍算完成)/ fail
- 调用 sendNotify 时第四参传空串,去掉尾部「本通知 By:github.com/...」
标题不放数字的理由:平台抑制指纹是 sha256(kind|credId|title去数字),
数字本来就被 titleKeyOf 剥掉,带 +35 / +15 算同一指纹,抑制不会失效。
顺带修 main 里的累加:blocks 从数组改成 {body,total,warn},
成长值合计与待处理项数在拼装前算好,摘要行才能直接用。
验证:node --check / 签名对拍 6 组 PASS / 5 个场景
(全好、有遗留、有失败、登录失效、双账号)的 state+标题+首行逐字比对 PASS /
_probe_meta 四文件 PASS
|
2026-11-05 20:43:22 +08:00 |
|
|
|
3ce29ebee2
|
docs(notify): 诊断补第 5b 节,指向平台侧的转发检查
用户实跑结果:sendNotify 加载正常、WEBHOOK 三项前置条件全过、
直打平台两次都 204(含换行/中文/emoji 的完整正文也收下了)。
但 PUSH_PLUS_TOKEN 未设 —— 青龙根本不发 pushplus,所以收到的那条
pushplus 一定来自平台转发,不是脚本自己发的。
补第 5b 节把这条推理写进输出:
- 204 只证明平台收下了,收到 ≠ 转发
- 中间还有两道门:事件要匹配到账号、账号下要有 enabled+active 的
pushplus 目标
- 给出两个 curl 判据(/api/notify-targets 与 /api/events?category=notify)
以及 deliveries=N 的读法
- 第 5 节在 PUSH_PLUS_TOKEN 未设时不再只是「跳过」,而是说明
这条消息必然是平台转发来的
|
2026-11-05 20:21:02 +08:00 |
|
|
|
3a711d0a47
|
fix(notify): 平台回 204 被误判为失败 + 诊断工具改名 scrip_
三个改动:
1) sendNotify.js 的 webhook 判据从 statusCode !== 200 改成 2xx 一律成功。
平台 /api/hooks/ql 按设计回 204(表示已接收且不写 event_logs),
原判据把 204 当失败 → 每轮日志都打「自定义发送通知消息失败!!」,
而投递其实成功了。这是纯假警报,也是这次误判的根因。
同时把状态码打进日志,真失败时能直接看出是 401/403/400/429。
2) _diag_notify.js → scrip_diag_notify.js。
订阅白名单是 scrip_,不带前缀的文件拉不下来,工具等于不存在。
加 // cron: 0 0 1 1 * 与 // name:,避免青龙自动建任务时落随机 cron。
正文补到六段:sendNotify 加载 / env / webhook 三前置条件与 body+headers
解析复刻 / 直打平台按状态码定位 / pushplus txt-vs-html 模板对比 /
完整 sendNotify 对照。
3) 文档补齐平台侧的两道硬校验:来源 IP 必须 127.0.0.1 或 172.16/12
(走公网域名会变成反代地址 → 403),回环带 XFF 一律 403。
给出指向平台的完整 env 写法(WEBHOOK_BODY 必须多行,单行 JSON
会被 parseString 整段吞掉 —— 已实测解析结果为 0 个 key)。
验证:node --check(sendNotify + 诊断)/ 5 个 mock 状态码用例
(204/401/403/400/429)全部被正确识别 / _probe_meta 四文件 PASS
|
2026-11-05 09:34:06 +08:00 |
|
|
|
483bc29424
|
fix(qqmusic): 通知发送失败不再静默 + 新增通知诊断工具
现象:青龙日志里「自定义发送通知消息失败!!」,pushplus 只收到一行标题。
根因排查(三处,都已实测复现):
1) 脚本里 require('../sendNotify') 是 catch{} 静默吞掉 —— 容器缺 got 时
一条通知都发不出去且日志无痕,只能靠猜。改成打印一行原因。
2) sendNotify 的 parseString 用 /(\w+):\s*((?:(?!\n\w+:).)*)/g 解析
WEBHOOK_BODY,靠「换行 + \w+:」断值。单行 JSON 没有换行,整个 body
被吞掉 —— 实测 '{"title":"$title",...}' 解析结果为 {}(0 个 key)。
畸形 body → 对方返回非 200 → 正是「自定义发送通知消息失败」的来源。
3) webhookNotify 有三个前置条件,缺一个就静默 resolve(不发也不报错):
URL/BODY 至少一个含 $title、WEBHOOK_METHOD 必须显式设、body 能被解析。
新增 _diag_notify.js(仓库根,与 sendNotify.js 同级):
- 查 sendNotify 能否加载、通知 env 是否读到(token 脱敏)
- 复刻 parseString,直接告出 WEBHOOK_BODY 会解析成什么
- 直连 pushplus 发 txt 与 html 两条,对比哪个模板正文完整
- 最后走一遍完整 sendNotify,与直连结果对照
用来区分「通道没发」和「微信侧展示折叠」两件事。
验证:node --check / 签名对拍 6 组 PASS / 加载失败时日志文案实测输出
/ _probe_meta 三元数据 PASS
|
2026-11-05 08:54:26 +08:00 |
|
|
|
2d29abb440
|
feat(qqmusic): 通知改成逐项明细 + 结论标题
之前通知只有一行「本次新增成长值 N」,看不出这轮到底做了什么、
哪些没做成、要不要人工介入。
改动:
- QMClient 新增 steps 数组与 step(name,status,detail) 记录点,
status 四态:done=做到 / warn=部分完成留待下次 / fail=失败 /
skip=无需处理(今日已完成或未开放)
- verdict() 汇总:有 fail→fail,有 warn→warn,其余 done
- 每个动作补上 step():任务中心签到、挂件、装扮、听书行为、
节目开始标记、四项领奖、福利站签到/礼券/旅程激励/月里程碑/
月度好礼/臻享抽奖、分享卡
- 新增 renderAccount():done 逐行列,warn/fail 逐行列,skip 折叠成
一行(避免十几个「今日已完成」淹没有效信息),分享卡链接单独一行
- 通知标题按结论给:✅ 全部完成 / ⚠️ 有未完成项
- 登录态失效保持 🔴 单列并直接给处理指引,不进明细列表
设计取舍:skip 折叠而不是省略 —— 折叠能看出「今天该做的都做了」,
省略会让人怀疑是不是漏跑了。done/warn/fail 永不折叠。
验证:node --check / 签名对拍 6 组 PASS / verdict 三态用例 /
渲染两例(含卡片链接与不含)输出符合预期 / _probe_meta 三元数据 PASS
|
2026-11-05 00:00:44 +08:00 |
|
|
|
c7c341e10a
|
feat(qqmusic): 取卡结果回传平台(QM_CARD_CALLBACK)
手动取卡目前要「登青龙 → 点运行 → 翻日志复制链接」。加一条可选回传:
脚本跑完把结果 POST 回平台,由平台转发到微信,手机上直接收到链接。
实现(脚本侧,零依赖 Node 内置 https):
- QM_CARD_CALLBACK 回传地址(如 https://<平台域名>/api/hooks/card)
- QM_CARD_TOKEN 鉴权 token,缺省回落 QL_HOOK_TOKEN
- 回传体只有 {cards:[{uin, ok, url|reason}], at},**不含 cookie/key** —— 走公网不泄凭证
- 回传失败只记日志,绝不让取卡本身算失败(卡已建出、链接已在日志里)
- 未配 QM_CARD_CALLBACK 时完全跳过,行为与之前一致
- 顺带把 pushCardResult 加进 module.exports,供单测直接调用
验证:node --check / 签名对拍 6 组 PASS / 4 个回传用例(未配跳过、正常 POST
含 token 头与 body 结构、URL 非法跳过、服务端 500 不抛)全 PASS /
_probe_meta 三元数据 PASS
|
2026-11-04 23:31:43 +08:00 |
|
|
|
656442e4d6
|
feat(qqmusic): 手动取卡模式 + 复用本月未领完的卡
两件事:
1) 手动取卡入口(给好友送卡用,点一次就出链接):
task qqmusic/scrip_qqmusic_checkin.js -- card
或 QM_CARD=1。青龙 task 的 -- 之后是脚本参数,经 shell/task.sh 的
format_params 收进 script_params、otask.sh 的 run_task_command 原样透传给
node(已读青龙 shell 源码确认,不是猜的)。手动模式只跑取卡,不跑签到。
2) 复用优先(照抄落地页行为):
体验券落地页的按钮逻辑是 createCard(d ? cardId : ) —— 已有卡就复用那张,
没有才建新的。原实现只会 CreatCard,会不断堆废卡。现在先扫本月卡列表,
对每张调 CheckCard 拿 cardInfo.left,>0 就直接吐那张的链接,绝不重复建卡;
全部领完且配额有剩才 CreatCard。
同时纠正三处口径:
- 输出文案「已送出」→「已被领」:reciveUinList 是好友领走记录,不是主动送出
- 区分三个数:sum=本月配额 / reciveUinList.length=已被领 / cardInfo.left=单张卡
剩余可领次数(一张卡可被多人领)。「还能送几张」= sum - 已被领
- CheckCard 顺带校验 ownerUin 是自己(自己领不了自己的卡,能确认卡还有效)
验证:node --check / 签名对拍 6 组 PASS / 空 env 与 -- card 与 QM_CARD=1 三种
入口均优雅跳过 / 7 个 mock 用例(复用/多卡择一/新建/配额用完/无卡直建/只读/
单卡过期跳过)全 PASS / _probe_meta 三元数据 PASS
|
2026-11-04 22:57:49 +08:00 |
|
|
|
2bfddc7e04
|
feat(qqmusic): VIP 体验券(分享卡)配额查询与建卡
从体验券落地页 y.qq.com/m/vip/experience_card/dist/index.html 的
index.036b2e716.js 逆出 music.vip.VipFreeCardSvr 全部 7 个 method,
并在 u6 网关实测路由(GetCanNumConf 用假 key 也返回真实配额表
{1:1,2:1,3:2,4:3,5:3,6:5,7:5,8:7,9:10,10:15},说明该 method 不校验登录;
CreatCard / CheckCurrentCardList 返回 1000=未登录,确认需要登录态)。
语义(官方特权页):有效期内的豪华绿钻每 31 天可按等级赠送不同非会员
好友 3 天体验券,LV1-2 各 1 张、LV3 2 张、LV4-5 各 3 张、LV6-7 各 5 张、
LV8 7 张。卡只能送人,自己领不了自己的(CheckCard 的 ownerUin 判定);
好友非会员自然月限领 1 张。
实现:
- 新增 QMClient.shareCard(),接在 vipStation 之后,失败不拖垮主流程
(QmDead 照常上抛,其他异常只记日志)
- 默认只读:报「本月配额 N 张 / 已送 M 张 / 剩余 K 张」,不 CreatCard
- QM_SHARE_CARD=on 才在 remain>0 时 CreatCard,输出 cardid 分享链接
- 配额来源:本月卡 sum 优先;本月无卡时取 confInfo 最大档位作上限参考
(不拿 confInfo[0] 兜底 —— 表里没有 0 号档,会取到 undefined 让 remain 恒 0)
- run() 返回值新增 cardUrl,汇总与通知里带分享链接
验证:node --check 通过 / 签名对拍 6 组 PASS / 空 env 优雅跳过 /
5 个 mock 用例(只读/用完/建卡/无卡兜底)输出符合预期 /
_probe_meta 三元数据 PASS
|
2026-11-04 22:43:06 +08:00 |
|
|
|
87debf37a9
|
chore(meta): 三个脚本统一青龙元数据注解,新增 _probe_meta.js 自检
继 3531437 修好 qqmusic 之后,把同一问题在另两个脚本上一并清掉 ——
它们原本都没写 name 注解(任务名会退回文件名),且 jd 脚本的 cron 写在块注释里
用了 */ 转义,青龙会把反斜杠一起提取出去。
改动(三个脚本统一成同一形态:文件最前面两行行注释):
// cron: <表达式>
// name: <中文任务名>
- jd/scrip_moving_env_enhance.js: 补 name 注解;cron 从块注释移到行注释
(原来写的 \*/ 转义会产出非法表达式)
- xiequ/scrip_switch.js: 补 name 注解;正文两处日志里的「name: xxx」改成「账号 xxx」
(青龙的任务名正则不锚定行首、取全文第一个命中,正文命中会盖掉注解)
- qqmusic/scrip_qqmusic_checkin.js: 注解从块注释改成行注释,与另两个统一
- 新增 _probe_meta.js: 扫描所有 scrip_*.js,复刻旧版(/name:\s*(.+)/ 不锚定)
与新版(cli/src/internal/subscription 的 cronMetadata)两条提取逻辑,
断言任务名不是代码片段、cron 是合法表达式。不带 scrip_ 前缀,订阅不会拉取
验证:_probe_meta.js RESULT: PASS(3 个文件,两个版本青龙提取都正确)/
三个脚本 node --check 全过 / qqmusic 签名对拍 6 组 PASS / 空 env 优雅跳过
|
2026-11-04 21:22:38 +08:00 |
|
|
|
3531437898
|
fix(qqmusic): 修正青龙自动建任务的元数据,任务名与 cron 不再被误提取
真机故障(2026-11-04):青龙订阅勾「自动添加定时任务」后,任务被建成
名称 = u.hostname, (应为 QQ音乐自动签到)
cron = 18 21 * * * (应为 1 0,6 * * *)
根因是青龙从脚本正文正则提取元数据,两条正则都不锚定行首:
1) 任务名 /name:\s*(.+)/ —— 全文第一个命中即采用。脚本里 https.request 的
选项对象写了 hostname: u.hostname,其中的 name 段被当成任务名。
2) cron /\bcron:\s*([^\r\n]+)/ —— 必须带冒号。原写法是注释里的
「定时: cron 1 0,6 * * *」,冒号在「定时」后面,cron 后面没有冒号 → 匹配不到,
落到随机 fallback(randomInt 生成 18 21 * * *)。
修法:
- 脚本第 3 行显式写 name 注解(独占一行,内容为「QQ音乐自动签到」)
- cron 注解改成「cron: 1 0,6 * * *」独占一行,注释挪到下一行
- https.request 选项 hostname -> host(Node 的别名,语义等价,实测 u6.y.qq.com
返回 404 而非连接失败),彻底消除全文唯一的 name+冒号连写
- README 补「青龙自动建任务的元数据约定」小节,记录两条正则与兜底行为
验证:node --check 通过 / 签名对拍 6 组 PASS / 空 env 优雅跳过 /
复刻青龙两条正则做提取断言,name=QQ音乐自动签到、cron=1 0,6 * * *;
新版青龙(cli/src/internal/subscription/subscriptionRunner.ts 的 cronMetadata)
同样提取正确
|
2026-11-04 21:13:34 +08:00 |
|
|
|
68721d1abb
|
refactor(qqmusic): 脚本改名 scrip_qqmusic_checkin.js 以匹配订阅白名单
订阅规则 ql repo 的 whitelist 参数是 "scrip_",只有文件名带该前缀的才会被拉取。
原文件名 qqmusic_checkin.js 不在白名单内,青龙订阅拉不到。
- qqmusic/qqmusic_checkin.js -> qqmusic/scrip_qqmusic_checkin.js(git mv 保留历史)
- test_sign_run.js 的 require 路径同步
- qqmusic/README.md 与根 README.md 更新文件名与白名单约定说明
- 根 README 补 QQ音乐条目(环境变量 SH_QQMUSIC_KEY / cron 1 0,6 * * *)
依赖拉取不受影响:订阅命令的 dependence 参数 sendNotify|common 会额外拉这两个文件,
脚本的 require('../sendNotify') 仍指向青龙内置/仓库根的 sendNotify.js。
验证:node --check 通过 / 签名对拍 6 组向量全 PASS / 空 env 优雅跳过 /
单账号与 & 多账号解析正确 / 整串 cookie 形态解析正确
|
2026-11-04 20:49:54 +08:00 |
|
|
|
89afcd1e60
|
feat(qqmusic): QQ音乐会员成长值+福利站自动签到(zzc签名对拍验证)
- u6.y.qq.com 协议底座: zzc/time33 与 LDP924/auto-checkin qmcommon.py 逐字节对拍 PASS(6向量)
- 续期闭环: QQLogin 换新 key + openid/access_token 二级救活, 缓存存 /ql/data/qqmusic_cache(订阅git免疫)
- 任务中心三态机: 签到/挂件/装扮/听书/节目, Y零请求/W直领/N动作, 10006写锁即停
- 福利站全量: 每日签到/礼券/旅程激励/月里程碑/月度好礼/臻享抽奖, 先探后做
- env: SH_QQMUSIC_KEY 多账号(uin#key / cookie串 / 混排), code 1000/2000 归一失效语义
- 播放上报(任务20完整+10)默认关闭, 定时 1 0,6 * * * 双轮
|
2026-11-04 00:38:19 +08:00 |
|
|
|
21f4d40a0c
|
fix(api): 移除多余的日志输出
- 移除了api剩余数量检查时的冗余日志输出
- 保持api使用数量计算逻辑不变
|
2026-01-05 18:58:52 +08:00 |
|
|
|
960e2ecc0e
|
fix(api): 修复API使用数量获取异常问题
- 添加数据有效性检查,防止空数据导致的错误
- 增加日志输出显示API剩余数量状态
- 当数据为空时返回默认值0避免程序崩溃
- 确保API数量计算逻辑的稳定性
|
2026-01-05 18:54:19 +08:00 |
|
|
|
b9b407737a
|
docs(readme): 更新脚本列表信息
- 新增京东Cookie辅助脚本说明
- 新增携趣白名单切换脚本说明- 补充脚本定时规则与环境变量配置
- 调整文档结构便于查阅chore(scripts): 更新携趣切换脚本定时规则
- 将执行时间从 0 12 * * * 调整为 38 2,8,14,20 * * *
- 优化脚本执行频率以提高效率
|
2025-11-02 18:38:50 +08:00 |
|
|
|
90f9ad9a5d
|
chore(config): 更新开发脚本和文档说明
- 更新 README 中的快速开始指南,使用 ql repo 命令替代手动克隆步骤
- 移除旧的环境配置说明
- 添加新的订阅方式说明
|
2025-11-02 18:14:49 +08:00 |
|
|
|
6d5e28bcf3
|
feat(jd): 添加京东CK重排序脚本
- 实现了京东Cookie的自动重排序功能
- 通过QL面板API获取并操作环境变量
- 支持将指定CK移动到指定位置
- 添加了对CK状态的过滤处理
- 集成了错误处理和日志记录机制
- 配置了定时执行的cron表达式
|
2025-11-02 17:41:47 +08:00 |
|
|
|
232afeb7f7
|
chore(scripts): 更新开发脚本路径
- 将 dev 脚本中的 xuequ 目录更正为 xiequ 目录
- 保持其他脚本配置不变
|
2025-11-02 17:17:03 +08:00 |
|
|
|
625a6ea2f9
|
feat(xuequ): 添加携趣白名单切换脚本
- 新增 switch.js 脚本,用于自动切换携趣代理的白名单IP
- 支持多账户和多IP配置,通过环境变量 XQ_ACCOUNTS 和 XQ_WHITELIST 设置
- 实现获取当前白名单、删除所有白名单、选择剩余次数最多的账户并添加新白名单的功能
- 集成定时任务,可通过 cron 表达式设置执行时间
- 添加详细的日志输出和错误处理机制
|
2025-11-02 17:16:09 +08:00 |
|