继 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 优雅跳过
90 lines
3.3 KiB
JavaScript
90 lines
3.3 KiB
JavaScript
// cron: 38 2,8,14,20 * * *
|
||
// name: 携趣白名单切换
|
||
/**
|
||
* 携趣白名单切换(多个携趣,多个IP,多个IP选中一个合适的携趣进行切换)
|
||
*
|
||
* 上面两行是青龙订阅自动建任务用的元数据注解,格式约定见仓库根 README。
|
||
* 本文件已把正文日志里的「name 加冒号」字样改成「账号」,避免青龙的提取正则
|
||
* (不锚定行首、取全文第一个命中)抓到正文。
|
||
*/
|
||
const { Env } = require('../common');
|
||
const $ = new Env('携趣小助手-白名单切换');
|
||
const fetch = require('node-fetch');
|
||
|
||
/** 环境变量
|
||
* XQ_ACCOUNTS: uid1;ukey1@备注 -》 多个则使用 & 分隔
|
||
* XQ_WHITELIST: ip1 -》 多个则使用 & 分隔
|
||
*/
|
||
const accounts = process.env['XQ_ACCOUNTS'];
|
||
const whitelist = process.env['XQ_WHITELIST'];
|
||
|
||
const apiTpl = {
|
||
// 查看当前哪些 IP 在白名单中
|
||
get: info => `http://op.xiequ.cn/IpWhiteList.aspx?uid=${info.uid}&ukey=${info.ukey}&act=get`,
|
||
add: (info, ip) => `http://op.xiequ.cn/IpWhiteList.aspx?uid=${info.uid}&ukey=${info.ukey}&act=add&ip=${ip}`,
|
||
delOne: (info, ip) => `http://op.xiequ.cn/IpWhiteList.aspx?uid=${info.uid}&ukey=${info.ukey}&act=del&ip=${ip}`,
|
||
delAll: info => `http://op.xiequ.cn/IpWhiteList.aspx?uid=${info.uid}&ukey=${info.ukey}&act=del&ip=all`,
|
||
// 获取 API 使用情况
|
||
apiUse: info => `http://op.xiequ.cn/ApiUser.aspx?act=suitdt&uid=${info.uid}&ukey=${info.ukey}`
|
||
}
|
||
|
||
!(async () => {
|
||
if (!accounts || !whitelist) {
|
||
$.log('请填写环境变量 XQ_ACCOUNTS & XQ_WHITELIST');
|
||
return;
|
||
}
|
||
let tmp = [];
|
||
let accs = accounts.split('&');
|
||
let ips = whitelist.split('&');
|
||
|
||
// 解析参数 & 获取信息
|
||
for (let content of accs) {
|
||
let [acc, comment] = content.split('@');
|
||
let [uid, ukey] = acc.split(';');
|
||
if (!uid || !ukey) {
|
||
$.log('请填写正确的环境变量 XQ_ACCOUNTS');
|
||
return;
|
||
}
|
||
let info = { uid: uid.trim(), ukey: ukey.trim(), comment: comment || `[uid:${uid}]` };
|
||
let item = {
|
||
info: info,
|
||
res: await (await fetch(apiTpl.get(info))).text(),
|
||
count: await (async function () {
|
||
let { data } = await (await fetch(apiTpl.apiUse(info))).json();
|
||
if (!data || !data[0]) {
|
||
return 0;
|
||
}
|
||
return +data[0].num - +data[0].use;
|
||
}())
|
||
};
|
||
tmp.push(item)
|
||
$.log(`[INFO] ${item.info.comment} 剩余数: ${item.count}`);
|
||
}
|
||
|
||
// 删除所有白名单
|
||
$.log('\n--- 删除白名单 --- \n');
|
||
for (let tmpElement of tmp) {
|
||
if (tmpElement?.res) {
|
||
await fetch(apiTpl.delAll(tmpElement.info));
|
||
$.log(`删除账号 ${tmpElement.info.comment} 下的所有白名单 -> `, tmpElement.res);
|
||
}
|
||
}
|
||
|
||
await $.wait(520);
|
||
// 选中一个数量最多的 API
|
||
let change = tmp.sort((a, b) => b.count - a.count)[0];
|
||
$.log('\n--- 切换白名单 --- \n');
|
||
if (change) {
|
||
for (const ip of ips) {
|
||
await fetch(apiTpl.add(change.info, ip));
|
||
$.log(`添加账号 ${change.info.comment} 白名单`);
|
||
}
|
||
}
|
||
})()
|
||
.catch((e) => {
|
||
$.logErr(e);
|
||
})
|
||
.finally(() => {
|
||
$.done();
|
||
});
|