Files
ql-scripts/xuequ/switch.js
zhuhjay 625a6ea2f9 feat(xuequ): 添加携趣白名单切换脚本
- 新增 switch.js 脚本,用于自动切换携趣代理的白名单IP
- 支持多账户和多IP配置,通过环境变量 XQ_ACCOUNTS 和 XQ_WHITELIST 设置
- 实现获取当前白名单、删除所有白名单、选择剩余次数最多的账户并添加新白名单的功能
- 集成定时任务,可通过 cron 表达式设置执行时间
- 添加详细的日志输出和错误处理机制
2025-11-02 17:16:09 +08:00

83 lines
2.9 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* cron: 0 12 * * *
*
* 携趣白名单切换(多个携趣多个IP多个IP选中一个合适的携趣进行切换)
*/
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();
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(`删除 name: ${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(`添加 name: ${change.info.comment} 白名单`);
}
}
})()
.catch((e) => {
$.logErr(e);
})
.finally(() => {
$.done();
});