Commit Graph

14 Commits

Author SHA1 Message Date
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