- 新增 switch.js 脚本,用于自动切换携趣代理的白名单IP - 支持多账户和多IP配置,通过环境变量 XQ_ACCOUNTS 和 XQ_WHITELIST 设置 - 实现获取当前白名单、删除所有白名单、选择剩余次数最多的账户并添加新白名单的功能 - 集成定时任务,可通过 cron 表达式设置执行时间 - 添加详细的日志输出和错误处理机制
83 lines
2.9 KiB
JavaScript
83 lines
2.9 KiB
JavaScript
/**
|
||
* 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();
|
||
});
|