You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
550 lines
34 KiB
550 lines
34 KiB
/*
|
|
腾讯自选股V2
|
|
|
|
更新了一下脚本,精简了需要的CK,多账户用换行(\n)或者@或者#隔开,尽量用换行隔开因为我没测试其他
|
|
一天跑两次就够了,10点到13点之间运行一次猜涨跌做任务,16点半之后运行一次领猜涨跌奖励
|
|
提现设置:默认提现5元,需要改的话自己设置TxStockCash变量,0代表不提现,1代表提现1元,5代表提现5元
|
|
新手任务设置:默认不做新手任务,需要做的话设置TxStockNewbie为1
|
|
分享任务设置:默认会做互助任务,需要多账号,黑号也能完成分享任务。不想做的话设置TxStockHelp为0
|
|
可以设置某些号只助力别的号不做任务(没资格的小号可以助力大号),在对应的ck后面加&task=0
|
|
没有捉到微信CK的也可以跑脚本,删掉wzq_qlskey和wzq_qluin就行,会尝试用APP的CK去完成微信任务,出现做任务失败是正常现象
|
|
|
|
青龙捉包,需要捉APP和公众号里面的小程序
|
|
1. 打开APP,捉wzq.tenpay.com包,把url里的openid和fskey用&连起来填到TxStockCookie
|
|
2. 公众号 腾讯自选股微信版->右下角好福利->福利中心,捉wzq.tenpay.com包,把Cookie里的wzq_qlskey和wzq_qluin用&连起来填到TxStockCookie
|
|
格式如下:
|
|
export TxStockCookie='openid=xx&fskey=yy&wzq_qlskey=zz&wzq_qluin=aa'
|
|
|
|
V2P,圈X重写:
|
|
打开APP和小程序自动获取
|
|
小程序入口:公众号 腾讯自选股微信版->右下角好福利->福利中心
|
|
[task_local]
|
|
#腾讯自选股
|
|
35 11,16 * * * https://raw.githubusercontent.com/leafxcy/JavaScript/main/txstockV2.js, tag=腾讯自选股, enabled=true
|
|
[rewrite_local]
|
|
https://wzq.tenpay.com/cgi-bin/.*user.*.fcgi url script-request-header https://raw.githubusercontent.com/leafxcy/JavaScript/main/txstockV2.js
|
|
[MITM]
|
|
hostname = wzq.tenpay.com
|
|
*/
|
|
const jsname = '腾讯自选股V2兑换'
|
|
const $ = new Env(jsname);
|
|
|
|
const notifyFlag = 1; //0为关闭通知,1为打开通知,默认为1
|
|
let notifyStr = ''
|
|
|
|
let envSplitor = ['\n','@','#']
|
|
let httpResult //global buffer
|
|
|
|
let withdrawCash = ($.isNode() ? (process.env.TxStockCash) : ($.getval('TxStockCash'))) || 5; //0为不自动提现,1为自动提现1元,5为自动提现5元
|
|
let helpFlag = ($.isNode() ? (process.env.TxStockHelp) : ($.getval('TxStockHelp'))) || 1; //0为不做分享助力任务,1为多用户互相分享助力
|
|
let newbieFlag = ($.isNode() ? (process.env.TxStockNewbie) : ($.getval('TxStockNewbie'))) || 0; //0为不做新手任务,1为自动做新手任务
|
|
let userCookie = ($.isNode() ? process.env.TxStockCookie : $.getdata('TxStockCookie')) || '';
|
|
let userList = []
|
|
|
|
|
|
let userIdx = 0
|
|
let userCount = 0
|
|
|
|
let TASK_WAITTIME = 1000
|
|
let BULL_WAITTIME = 5000
|
|
|
|
let test_taskList = []
|
|
let todayDate = formatDateTime();
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////
|
|
class UserInfo {
|
|
constructor(str) {
|
|
this.index = ++userIdx
|
|
this.name = this.index
|
|
this.canRun = true
|
|
this.hasWxCookie = true
|
|
this.valid = false
|
|
this.coin = -1
|
|
this.shareCodes = {task:{}, newbie:{}, bull:{}, guess:{}}
|
|
this.bullStatusFlag = false
|
|
|
|
let info = str2json(str)
|
|
this.openid = info['openid'] || ''
|
|
this.fskey = info['fskey'] || ''
|
|
this.wzq_qlskey = info['wzq_qlskey'] || ''
|
|
this.wzq_qluin = info['wzq_qluin'] || ''
|
|
this.task = info['task'] || 1
|
|
this.cookie = `wzq_qlskey=${this.wzq_qlskey}; wzq_qluin=${this.wzq_qluin}; zxg_openid=${this.openid};`
|
|
|
|
let checkParam = ['openid','fskey','wzq_qlskey','wzq_qluin']
|
|
let missEnv = []
|
|
for(let param of checkParam) {
|
|
if(!this[param]) missEnv.push(param);
|
|
}
|
|
if(missEnv.length > 0) {
|
|
let missStr = missEnv.join(', ')
|
|
let notiStr = `账号[${this.index}]缺少参数:${missStr}`
|
|
if(missStr.indexOf('openid') > -1 || missStr.indexOf('fskey') > -1 ) {
|
|
notiStr += ',无法运行脚本'
|
|
this.canRun = false
|
|
} else if(missStr.indexOf('wzq_qlskey') > -1 || missStr.indexOf('wzq_qluin') > -1) {
|
|
notiStr += ',尝试用APP的CK去完成微信任务和助力,可能出现失败情况'
|
|
this.hasWxCookie = false
|
|
}
|
|
console.log(notiStr)
|
|
}
|
|
}
|
|
|
|
async getUserName() {
|
|
try {
|
|
let url = `https://proxy.finance.qq.com/group/newstockgroup/RssService/getSightByUser2?g_openid=${this.openid}&openid=${this.openid}&fskey=${this.fskey}`
|
|
let body = `g_openid=${this.openid}&search_openid=${this.openid}`
|
|
let urlObject = populateUrlObject(url,this.cookie,body)
|
|
await httpRequest('post',urlObject)
|
|
let result = httpResult;
|
|
if(!result) return
|
|
//console.log(result)
|
|
if(result.code==0) {
|
|
this.name = result.data.user_name
|
|
} else {
|
|
console.log(`账号[${this.name}]查询账户昵称失败: ${result.msg}`)
|
|
}
|
|
} catch(e) {
|
|
console.log(e)
|
|
} finally {}
|
|
}
|
|
|
|
async getUserInfo(isWithdraw=false) {
|
|
try {
|
|
let url = `https://wzq.tenpay.com/cgi-bin/shop.fcgi?action=home_v2&type=2&openid=${this.openid}&fskey=${this.fskey}&channel=1`
|
|
let body = ``
|
|
let urlObject = populateUrlObject(url,this.cookie,body)
|
|
await httpRequest('get',urlObject)
|
|
let result = httpResult;
|
|
if(!result) return
|
|
//console.log(result)
|
|
if(result.retcode==0) {
|
|
this.valid = true
|
|
let lastCoin = this.coin
|
|
this.coin = result.shop_asset ? result.shop_asset.amount : 0
|
|
if(lastCoin > -1) {
|
|
logAndNotify(`账号[${this.name}]金币余额:${this.coin},本次运行共获得${this.coin-lastCoin}金币`)
|
|
} else {
|
|
console.log(`账号[${this.name}]金币余额:${this.coin}`)
|
|
}
|
|
|
|
if(isWithdraw && withdrawCash > 0) {
|
|
if(result.all_rights && result.all_rights.length > 0) {
|
|
let cashStr = `京东E卡${withdrawCash}元`
|
|
for(let cashItem of result.all_rights) {
|
|
if(cashItem.item_desc == cashStr){
|
|
if(parseInt(this.coin) >= parseInt(cashItem.coins)){
|
|
logAndNotify(`账号[${this.name}]金币余额多于${cashItem.coins},开始兑换${cashStr}`);
|
|
await $.wait(TASK_WAITTIME);
|
|
await this.getWithdrawTicket(cashItem.item_id);
|
|
} else {
|
|
console.log(`账号[${this.name}]金币余额不足${cashItem.coins},不兑换`);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
console.log(`账号[${this.name}]查询账户余额失败: ${result.retmsg}`)
|
|
}
|
|
} catch(e) {
|
|
console.log(e)
|
|
} finally {}
|
|
}
|
|
|
|
async getWithdrawTicket(item_id) {
|
|
try {
|
|
let url = `https://zqact03.tenpay.com/cgi-bin/shop.fcgi?action=order_ticket&type=2&openid=${this.openid}&fskey=${this.fskey}&channel=1`
|
|
let body = ``
|
|
let urlObject = populateUrlObject(url,this.cookie,body)
|
|
await httpRequest('get',urlObject)
|
|
let result = httpResult;
|
|
if(!result) return
|
|
//console.log(result)
|
|
if(result.retcode==0) {
|
|
if(result.ticket) {
|
|
await $.wait(TASK_WAITTIME);
|
|
await this.withdraw(result.ticket,item_id);
|
|
} else {
|
|
console.log(`申请提现票据失败`);
|
|
}
|
|
} else {
|
|
console.log(`申请提现票据失败: ${result.retmsg}`)
|
|
}
|
|
} catch(e) {
|
|
console.log(e)
|
|
} finally {}
|
|
}
|
|
async withdraw(ticket,item_id) {
|
|
try {
|
|
let url = `https://zqact03.tenpay.com/cgi-bin/shop.fcgi?action=order&type=2&ticket=${ticket}&item_id=${item_id}&openid=${this.openid}&fskey=${this.fskey}&channel=1`
|
|
let body = ``
|
|
let urlObject = populateUrlObject(url,this.cookie,body)
|
|
await httpRequest('get',urlObject)
|
|
let result = httpResult;
|
|
if(!result) return
|
|
//console.log(result)
|
|
if(result.retcode==0) {
|
|
console.log(`提现订单号:${result.order_no}`);
|
|
await $.wait(TASK_WAITTIME);
|
|
await this.withdraw2(result.order_no);
|
|
} else {
|
|
logAndNotify(`提现失败:${result.retmsg}`);
|
|
}
|
|
} catch(e) {
|
|
console.log(e)
|
|
} finally {}
|
|
}
|
|
//https://zqact03.tenpay.com/cgi-bin/shop.fcgi?action=order_info&type=2&order_no=1000030587202208031730483f640390&_=1659519053080&openid=oA0Gbjkoq2IOQkpykXMxFmElgDto&fskey=v0ba829662462ea3fac8c195835070d5&channel=1&access_token=&_appName=ios&_appver=9.10.0&_osVer=12.0&_devId=6fd7c34655c74a15b7ede7f263741b70fae2c7d8
|
|
async withdraw2(order_no) {
|
|
try {
|
|
let url = `https://zqact03.tenpay.com/cgi-bin/shop.fcgi?action=order_info&type=2&order_no=${order_no}&openid=${this.openid}&fskey=${this.fskey}&channel=1`
|
|
let body = ``
|
|
let urlObject = populateUrlObject(url,this.cookie,body)
|
|
await httpRequest('get',urlObject)
|
|
let result = httpResult;
|
|
if(!result) return
|
|
//console.log(result)
|
|
if(result.retcode==0) {
|
|
if (result.order && result.order.status==1){
|
|
logAndNotify(`card_number:${result.order.card_number}\ncard_pwd:${result.order.card_pwd}`);
|
|
} else {
|
|
console.log(`兑换未获取到卡密`);
|
|
await $.wait(TASK_WAITTIME);
|
|
await this.withdraw2(order_no);
|
|
}
|
|
}else console.log(`获取兑换信息失败`)
|
|
} catch(e) {
|
|
console.log(e)
|
|
} finally {}
|
|
}
|
|
async gethistory() {
|
|
try {
|
|
let url = `https://zqact03.tenpay.com/cgi-bin/shop.fcgi?action=rights_history&type=2&offset=0&limit=10&openid=${this.openid}&fskey=${this.fskey}&channel=1`
|
|
let body = ``
|
|
let urlObject = populateUrlObject(url,this.cookie,body)
|
|
await httpRequest('get',urlObject)
|
|
let result = httpResult;
|
|
if(!result) return
|
|
//console.log(result)
|
|
if(result.retcode==0) {
|
|
if(result.rights && result.rights.length>0) {
|
|
let i=0
|
|
for (let item of result.rights){
|
|
console.log(item.order_no)
|
|
console.log(item.name)
|
|
if (i<1) await this.withdraw2(item.order_no);
|
|
i+=1
|
|
}
|
|
|
|
} else {
|
|
console.log(`权益记录为空`);
|
|
}
|
|
} else {
|
|
console.log(`查看权益记录失败: ${result.retmsg}`)
|
|
}
|
|
} catch(e) {
|
|
console.log(e)
|
|
} finally {}
|
|
}
|
|
}
|
|
|
|
!(async () => {
|
|
if (typeof $request !== "undefined") {
|
|
await GetRewrite()
|
|
}else {
|
|
console.log('\n变量填写格式,多账号用换行(\\n)或者@或者#隔开:\nopenid=xx&fskey=yy&wzq_qlskey=zz&wzq_qluin=aa\n')
|
|
if(!(await checkEnv())) return;
|
|
|
|
console.log('\n=================== 用户信息 ===================')
|
|
for(let user of userList.filter(x => x.canRun)) {
|
|
await user.getUserName();
|
|
await $.wait(TASK_WAITTIME);
|
|
await user.getUserInfo();
|
|
await $.wait(TASK_WAITTIME);
|
|
}
|
|
|
|
let validUserList = userList.filter(x => x.valid)
|
|
if(validUserList.length == 0) return;
|
|
let validUserCount = validUserList.length;
|
|
|
|
console.log('\n===================账号${user.index}[${user.name}] 提现 ===================')
|
|
for(let user of validUserList) {
|
|
if(user.task == 1) {
|
|
await user.getUserInfo(true);
|
|
await $.wait(TASK_WAITTIME);
|
|
console.log(`\n===========查询权益记录============`)
|
|
await user.gethistory()
|
|
}
|
|
}
|
|
|
|
await showmsg();
|
|
}
|
|
})()
|
|
.catch((e) => $.logErr(e))
|
|
.finally(() => $.done())
|
|
|
|
///////////////////////////////////////////////////////////////////
|
|
async function GetRewrite() {
|
|
if($request.url.indexOf(`cgi-bin/userinfo.fcgi`) > -1 && $request.headers.Cookie) {
|
|
let openid = $request.headers.Cookie.match(/zxg_(openid=[\w\-]+)/)[1]
|
|
if(openid == 'openid=anonymous') return;
|
|
let fskey = 'fskey='
|
|
let qlskey = $request.headers.Cookie.match(/(wzq_qlskey=[\w\-]+)/)[1]
|
|
let qluin = $request.headers.Cookie.match(/(wzq_qluin=[\w\-]+)/)[1]
|
|
let ck = `${openid}&${fskey}&${qlskey}&${qluin}`
|
|
|
|
if(userCookie) {
|
|
if(userCookie.indexOf(openid) == -1) {
|
|
userCookie = userCookie + '\n' + ck
|
|
$.setdata(userCookie, 'TxStockCookie');
|
|
let ckList = userCookie.split('\n')
|
|
$.msg(jsname+` 获取第${ckList.length}个ck成功: ${ck}`)
|
|
} else {
|
|
if(userCookie.indexOf(openid) > -1 && userCookie.indexOf(qlskey) > -1 && userCookie.indexOf(qluin) > -1) return;
|
|
let ckList = userCookie.split('\n')
|
|
let idx = 0
|
|
for(idx in ckList) {
|
|
if(ckList[idx].indexOf(openid) > -1) {
|
|
fskey = ckList[idx].match(/(fskey=[\w-]*)/)[1]
|
|
ck = `${openid}&${fskey}&${qlskey}&${qluin}`
|
|
ckList[idx] = ck
|
|
break;
|
|
}
|
|
}
|
|
userCookie = ckList.join('\n')
|
|
$.setdata(userCookie, 'TxStockCookie');
|
|
$.msg(jsname+` 更新第${parseInt(idx)+1}个ck成功: ${ck}`)
|
|
}
|
|
} else {
|
|
$.setdata(ck, 'TxStockCookie');
|
|
$.msg(jsname+` 获取第1个ck成功: ${ck}`)
|
|
}
|
|
} else if($request.url.indexOf(`cgi-bin/activity_usercenter.fcgi`) > -1) {
|
|
let openid = $request.url.match(/(openid=[\w\-]*)/)[1]
|
|
if(openid == 'openid=anonymous') return;
|
|
let fskey = $request.url.match(/(fskey=[\w\-]*)/)[1]
|
|
let qlskey = 'wzq_qlskey='
|
|
let qluin = 'wzq_qluin='
|
|
let ck = `${openid}&${fskey}&${qlskey}&${qluin}`
|
|
|
|
if(userCookie) {
|
|
if(userCookie.indexOf(openid) == -1) {
|
|
userCookie = userCookie + '\n' + ck
|
|
$.setdata(userCookie, 'TxStockCookie');
|
|
let ckList = userCookie.split('\n')
|
|
$.msg(jsname+` 获取第${ckList.length}个ck成功: ${ck}`)
|
|
} else {
|
|
if(userCookie.indexOf(openid) > -1 && userCookie.indexOf(fskey) > -1) return;
|
|
let ckList = userCookie.split('\n')
|
|
let idx = 0
|
|
for(idx in ckList) {
|
|
if(ckList[idx].indexOf(openid) > -1) {
|
|
qlskey = ckList[idx].match(/(wzq_qlskey=[\w-]*)/)[1]
|
|
qluin = ckList[idx].match(/(wzq_qluin=[\w-]*)/)[1]
|
|
ck = `${openid}&${fskey}&${qlskey}&${qluin}`
|
|
ckList[idx] = ck
|
|
break;
|
|
}
|
|
}
|
|
userCookie = ckList.join('\n')
|
|
$.setdata(userCookie, 'TxStockCookie');
|
|
$.msg(jsname+` 更新第${parseInt(idx)+1}个ck成功: ${ck}`)
|
|
}
|
|
} else {
|
|
$.setdata(ck, 'TxStockCookie');
|
|
$.msg(jsname+` 获取第1个ck成功: ${ck}`)
|
|
}
|
|
}
|
|
}
|
|
|
|
async function checkEnv() {
|
|
if(userCookie) {
|
|
let splitor = envSplitor[0];
|
|
for(let sp of envSplitor) {
|
|
if(userCookie.indexOf(sp) > -1) {
|
|
splitor = sp;
|
|
break;
|
|
}
|
|
}
|
|
for(let userCookies of userCookie.split(splitor)) {
|
|
if(userCookies) userList.push(new UserInfo(userCookies))
|
|
}
|
|
userCount = userList.filter(x => x.canRun).length
|
|
} else {
|
|
console.log('未找到CK')
|
|
return;
|
|
}
|
|
|
|
console.log(`共找到${userCount}个有效账号`)
|
|
return true
|
|
}
|
|
|
|
//通知
|
|
async function showmsg() {
|
|
if(!notifyStr) return;
|
|
notifyBody = jsname + "运行通知\n\n" + notifyStr
|
|
if (notifyFlag > 0) {
|
|
if($.isNode()){
|
|
var notify = require('./sendNotify');
|
|
await notify.sendNotify($.name, notifyBody );
|
|
} else {
|
|
$.msg(notifyBody);
|
|
}
|
|
} else {
|
|
console.log('\n'+notifyBody);
|
|
}
|
|
}
|
|
|
|
function formatDateTime() {
|
|
var date = new Date();
|
|
var y = date.getFullYear();
|
|
var m = padStr(date.getMonth()+1,2);
|
|
var d = padStr(date.getDate(),2);
|
|
return `${y}${m}${d}`;
|
|
};
|
|
|
|
function logAndNotify(str) {
|
|
console.log(str)
|
|
notifyStr += str
|
|
notifyStr += '\n'
|
|
}
|
|
|
|
//pushDear
|
|
async function pushDear(str) {
|
|
if(!PushDearKey) return;
|
|
if(!str) return;
|
|
|
|
console.log('\n============= PushDear 通知 =============\n')
|
|
console.log(str)
|
|
let urlObject = {
|
|
url: `https://api2.pushdeer.com/message/push?pushkey=${PushDearKey}&text=${encodeURIComponent(str)}`,
|
|
headers: {},
|
|
};
|
|
await httpRequest('get',urlObject)
|
|
let result = httpResult;
|
|
let retStr = result.content.result==false ? '失败' : '成功'
|
|
console.log(`\n========== PushDear 通知发送${retStr} ==========\n`)
|
|
}
|
|
////////////////////////////////////////////////////////////////////
|
|
function populateUrlObject(url,cookie,body=''){
|
|
let host = url.replace('//','/').split('/')[1]
|
|
let urlObject = {
|
|
url: url,
|
|
headers: {
|
|
'Host': host,
|
|
'Cookie': cookie,
|
|
'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 15_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.16(0x18001028) NetType/WIFI Language/zh_CN',
|
|
'Connection': 'keep-alive',
|
|
},
|
|
}
|
|
if(body) {
|
|
urlObject.body = body
|
|
urlObject.headers['Content-Type'] = 'application/x-www-form-urlencoded'
|
|
urlObject.headers['Content-Length'] = urlObject.body ? urlObject.body.length : 0
|
|
}
|
|
return urlObject;
|
|
}
|
|
|
|
async function httpRequest(method,url,timeout=5000) {
|
|
httpResult = null
|
|
return new Promise((resolve) => {
|
|
$[method](url, async (err, resp, data) => {
|
|
try {
|
|
if (err) {
|
|
console.log(`${method}请求失败`);
|
|
console.log(JSON.stringify(err));
|
|
$.logErr(err);
|
|
} else {
|
|
if (safeGet(data)) {
|
|
httpResult = JSON.parse(data);
|
|
} else {
|
|
httpResult = resp;
|
|
}
|
|
}
|
|
} catch (e) {
|
|
$.logErr(e, resp);
|
|
} finally {
|
|
resolve();
|
|
}
|
|
},timeout);
|
|
});
|
|
}
|
|
|
|
function safeGet(data) {
|
|
try {
|
|
if (typeof JSON.parse(data) == "object") {
|
|
return true;
|
|
} else {
|
|
console.log(data)
|
|
return false;
|
|
}
|
|
} catch (e) {
|
|
//console.log(e);
|
|
//console.log(`服务器访问数据为空,请检查自身设备网络情况`);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
function getMin(a,b){
|
|
return ((a<b) ? a : b)
|
|
}
|
|
|
|
function getMax(a,b){
|
|
return ((a<b) ? b : a)
|
|
}
|
|
|
|
function padStr(num,length,padding='0') {
|
|
let numStr = String(num)
|
|
let numPad = (length>numStr.length) ? (length-numStr.length) : 0
|
|
let retStr = ''
|
|
for(let i=0; i<numPad; i++) {
|
|
retStr += padding
|
|
}
|
|
retStr += numStr
|
|
return retStr;
|
|
}
|
|
|
|
function json2str(obj,encodeUrl=false) {
|
|
let ret = []
|
|
for(let keys of Object.keys(obj).sort()) {
|
|
let v = obj[keys]
|
|
if(v && encodeUrl) v = encodeURIComponent(v)
|
|
ret.push(keys+'='+v)
|
|
}
|
|
return ret.join('&');
|
|
}
|
|
|
|
function str2json(str,decodeUrl=false) {
|
|
let ret = {}
|
|
for(let item of str.split('&')) {
|
|
if(!item) continue;
|
|
let kv = item.split('=')
|
|
if(kv.length < 2) continue;
|
|
if(decodeUrl) {
|
|
ret[kv[0]] = decodeURIComponent(kv[1])
|
|
} else {
|
|
ret[kv[0]] = kv[1]
|
|
}
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
function randomString(len=12) {
|
|
let chars = 'abcdef0123456789';
|
|
let maxLen = chars.length;
|
|
let str = '';
|
|
for (i = 0; i < len; i++) {
|
|
str += chars.charAt(Math.floor(Math.random()*maxLen));
|
|
}
|
|
return str;
|
|
}
|
|
|
|
var Base64={_keyStr:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",encode:function(e){var t="";var n,r,i,s,o,u,a;var f=0;e=Base64._utf8_encode(e);while(f<e.length){n=e.charCodeAt(f++);r=e.charCodeAt(f++);i=e.charCodeAt(f++);s=n>>2;o=(n&3)<<4|r>>4;u=(r&15)<<2|i>>6;a=i&63;if(isNaN(r)){u=a=64}else if(isNaN(i)){a=64}t=t+this._keyStr.charAt(s)+this._keyStr.charAt(o)+this._keyStr.charAt(u)+this._keyStr.charAt(a)}return t},decode:function(e){var t="";var n,r,i;var s,o,u,a;var f=0;e=e.replace(/[^A-Za-z0-9+/=]/g,"");while(f<e.length){s=this._keyStr.indexOf(e.charAt(f++));o=this._keyStr.indexOf(e.charAt(f++));u=this._keyStr.indexOf(e.charAt(f++));a=this._keyStr.indexOf(e.charAt(f++));n=s<<2|o>>4;r=(o&15)<<4|u>>2;i=(u&3)<<6|a;t=t+String.fromCharCode(n);if(u!=64){t=t+String.fromCharCode(r)}if(a!=64){t=t+String.fromCharCode(i)}}t=Base64._utf8_decode(t);return t},_utf8_encode:function(e){e=e.replace(/rn/g,"n");var t="";for(var n=0;n<e.length;n++){var r=e.charCodeAt(n);if(r<128){t+=String.fromCharCode(r)}else if(r>127&&r<2048){t+=String.fromCharCode(r>>6|192);t+=String.fromCharCode(r&63|128)}else{t+=String.fromCharCode(r>>12|224);t+=String.fromCharCode(r>>6&63|128);t+=String.fromCharCode(r&63|128)}}return t},_utf8_decode:function(e){var t="";var n=0;var r=c1=c2=0;while(n<e.length){r=e.charCodeAt(n);if(r<128){t+=String.fromCharCode(r);n++}else if(r>191&&r<224){c2=e.charCodeAt(n+1);t+=String.fromCharCode((r&31)<<6|c2&63);n+=2}else{c2=e.charCodeAt(n+1);c3=e.charCodeAt(n+2);t+=String.fromCharCode((r&15)<<12|(c2&63)<<6|c3&63);n+=3}}return t}}
|
|
|
|
function MD5Encrypt(a){function b(a,b){return a<<b|a>>>32-b}function c(a,b){var c,d,e,f,g;return e=2147483648&a,f=2147483648&b,c=1073741824&a,d=1073741824&b,g=(1073741823&a)+(1073741823&b),c&d?2147483648^g^e^f:c|d?1073741824&g?3221225472^g^e^f:1073741824^g^e^f:g^e^f}function d(a,b,c){return a&b|~a&c}function e(a,b,c){return a&c|b&~c}function f(a,b,c){return a^b^c}function g(a,b,c){return b^(a|~c)}function h(a,e,f,g,h,i,j){return a=c(a,c(c(d(e,f,g),h),j)),c(b(a,i),e)}function i(a,d,f,g,h,i,j){return a=c(a,c(c(e(d,f,g),h),j)),c(b(a,i),d)}function j(a,d,e,g,h,i,j){return a=c(a,c(c(f(d,e,g),h),j)),c(b(a,i),d)}function k(a,d,e,f,h,i,j){return a=c(a,c(c(g(d,e,f),h),j)),c(b(a,i),d)}function l(a){for(var b,c=a.length,d=c+8,e=(d-d%64)/64,f=16*(e+1),g=new Array(f-1),h=0,i=0;c>i;)b=(i-i%4)/4,h=i%4*8,g[b]=g[b]|a.charCodeAt(i)<<h,i++;return b=(i-i%4)/4,h=i%4*8,g[b]=g[b]|128<<h,g[f-2]=c<<3,g[f-1]=c>>>29,g}function m(a){var b,c,d="",e="";for(c=0;3>=c;c++)b=a>>>8*c&255,e="0"+b.toString(16),d+=e.substr(e.length-2,2);return d}function n(a){a=a.replace(/\r\n/g,"\n");for(var b="",c=0;c<a.length;c++){var d=a.charCodeAt(c);128>d?b+=String.fromCharCode(d):d>127&&2048>d?(b+=String.fromCharCode(d>>6|192),b+=String.fromCharCode(63&d|128)):(b+=String.fromCharCode(d>>12|224),b+=String.fromCharCode(d>>6&63|128),b+=String.fromCharCode(63&d|128))}return b}var o,p,q,r,s,t,u,v,w,x=[],y=7,z=12,A=17,B=22,C=5,D=9,E=14,F=20,G=4,H=11,I=16,J=23,K=6,L=10,M=15,N=21;for(a=n(a),x=l(a),t=1732584193,u=4023233417,v=2562383102,w=271733878,o=0;o<x.length;o+=16)p=t,q=u,r=v,s=w,t=h(t,u,v,w,x[o+0],y,3614090360),w=h(w,t,u,v,x[o+1],z,3905402710),v=h(v,w,t,u,x[o+2],A,606105819),u=h(u,v,w,t,x[o+3],B,3250441966),t=h(t,u,v,w,x[o+4],y,4118548399),w=h(w,t,u,v,x[o+5],z,1200080426),v=h(v,w,t,u,x[o+6],A,2821735955),u=h(u,v,w,t,x[o+7],B,4249261313),t=h(t,u,v,w,x[o+8],y,1770035416),w=h(w,t,u,v,x[o+9],z,2336552879),v=h(v,w,t,u,x[o+10],A,4294925233),u=h(u,v,w,t,x[o+11],B,2304563134),t=h(t,u,v,w,x[o+12],y,1804603682),w=h(w,t,u,v,x[o+13],z,4254626195),v=h(v,w,t,u,x[o+14],A,2792965006),u=h(u,v,w,t,x[o+15],B,1236535329),t=i(t,u,v,w,x[o+1],C,4129170786),w=i(w,t,u,v,x[o+6],D,3225465664),v=i(v,w,t,u,x[o+11],E,643717713),u=i(u,v,w,t,x[o+0],F,3921069994),t=i(t,u,v,w,x[o+5],C,3593408605),w=i(w,t,u,v,x[o+10],D,38016083),v=i(v,w,t,u,x[o+15],E,3634488961),u=i(u,v,w,t,x[o+4],F,3889429448),t=i(t,u,v,w,x[o+9],C,568446438),w=i(w,t,u,v,x[o+14],D,3275163606),v=i(v,w,t,u,x[o+3],E,4107603335),u=i(u,v,w,t,x[o+8],F,1163531501),t=i(t,u,v,w,x[o+13],C,2850285829),w=i(w,t,u,v,x[o+2],D,4243563512),v=i(v,w,t,u,x[o+7],E,1735328473),u=i(u,v,w,t,x[o+12],F,2368359562),t=j(t,u,v,w,x[o+5],G,4294588738),w=j(w,t,u,v,x[o+8],H,2272392833),v=j(v,w,t,u,x[o+11],I,1839030562),u=j(u,v,w,t,x[o+14],J,4259657740),t=j(t,u,v,w,x[o+1],G,2763975236),w=j(w,t,u,v,x[o+4],H,1272893353),v=j(v,w,t,u,x[o+7],I,4139469664),u=j(u,v,w,t,x[o+10],J,3200236656),t=j(t,u,v,w,x[o+13],G,681279174),w=j(w,t,u,v,x[o+0],H,3936430074),v=j(v,w,t,u,x[o+3],I,3572445317),u=j(u,v,w,t,x[o+6],J,76029189),t=j(t,u,v,w,x[o+9],G,3654602809),w=j(w,t,u,v,x[o+12],H,3873151461),v=j(v,w,t,u,x[o+15],I,530742520),u=j(u,v,w,t,x[o+2],J,3299628645),t=k(t,u,v,w,x[o+0],K,4096336452),w=k(w,t,u,v,x[o+7],L,1126891415),v=k(v,w,t,u,x[o+14],M,2878612391),u=k(u,v,w,t,x[o+5],N,4237533241),t=k(t,u,v,w,x[o+12],K,1700485571),w=k(w,t,u,v,x[o+3],L,2399980690),v=k(v,w,t,u,x[o+10],M,4293915773),u=k(u,v,w,t,x[o+1],N,2240044497),t=k(t,u,v,w,x[o+8],K,1873313359),w=k(w,t,u,v,x[o+15],L,4264355552),v=k(v,w,t,u,x[o+6],M,2734768916),u=k(u,v,w,t,x[o+13],N,1309151649),t=k(t,u,v,w,x[o+4],K,4149444226),w=k(w,t,u,v,x[o+11],L,3174756917),v=k(v,w,t,u,x[o+2],M,718787259),u=k(u,v,w,t,x[o+9],N,3951481745),t=c(t,p),u=c(u,q),v=c(v,r),w=c(w,s);var O=m(t)+m(u)+m(v)+m(w);return O.toLowerCase()}
|
|
|
|
function Env(t,e){"undefined"!=typeof process&&JSON.stringify(process.env).indexOf("GITHUB")>-1&&process.exit(0);class s{constructor(t){this.env=t}send(t,e="GET"){t="string"==typeof t?{url:t}:t;let s=this.get;return"POST"===e&&(s=this.post),"PUT"===e&&(s=this.put),new Promise((e,i)=>{s.call(this,t,(t,s,r)=>{t?i(t):e(s)})})}get(t){return this.send.call(this.env,t)}post(t){return this.send.call(this.env,t,"POST")}put(t){return this.send.call(this.env,t,"PUT")}}return new class{constructor(t,e){this.name=t,this.http=new s(this),this.data=null,this.dataFile="box.dat",this.logs=[],this.isMute=!1,this.isNeedRewrite=!1,this.logSeparator="\n",this.startTime=(new Date).getTime(),Object.assign(this,e),this.log("",`\ud83d\udd14${this.name}, \u5f00\u59cb!`)}isNode(){return"undefined"!=typeof module&&!!module.exports}isQuanX(){return"undefined"!=typeof $task}isSurge(){return"undefined"!=typeof $httpClient&&"undefined"==typeof $loon}isLoon(){return"undefined"!=typeof $loon}toObj(t,e=null){try{return JSON.parse(t)}catch{return e}}toStr(t,e=null){try{return JSON.stringify(t)}catch{return e}}getjson(t,e){let s=e;const i=this.getdata(t);if(i)try{s=JSON.parse(this.getdata(t))}catch{}return s}setjson(t,e){try{return this.setdata(JSON.stringify(t),e)}catch{return!1}}getScript(t){return new Promise(e=>{this.get({url:t},(t,s,i)=>e(i))})}runScript(t,e){return new Promise(s=>{let i=this.getdata("@chavy_boxjs_userCfgs.httpapi");i=i?i.replace(/\n/g,"").trim():i;let r=this.getdata("@chavy_boxjs_userCfgs.httpapi_timeout");r=r?1*r:20,r=e&&e.timeout?e.timeout:r;const[o,h]=i.split("@"),a={url:`http://${h}/v1/scripting/evaluate`,body:{script_text:t,mock_type:"cron",timeout:r},headers:{"X-Key":o,Accept:"*/*"}};this.post(a,(t,e,i)=>s(i))}).catch(t=>this.logErr(t))}loaddata(){if(!this.isNode())return{};{this.fs=this.fs?this.fs:require("fs"),this.path=this.path?this.path:require("path");const t=this.path.resolve(this.dataFile),e=this.path.resolve(process.cwd(),this.dataFile),s=this.fs.existsSync(t),i=!s&&this.fs.existsSync(e);if(!s&&!i)return{};{const i=s?t:e;try{return JSON.parse(this.fs.readFileSync(i))}catch(t){return{}}}}}writedata(){if(this.isNode()){this.fs=this.fs?this.fs:require("fs"),this.path=this.path?this.path:require("path");const t=this.path.resolve(this.dataFile),e=this.path.resolve(process.cwd(),this.dataFile),s=this.fs.existsSync(t),i=!s&&this.fs.existsSync(e),r=JSON.stringify(this.data);s?this.fs.writeFileSync(t,r):i?this.fs.writeFileSync(e,r):this.fs.writeFileSync(t,r)}}lodash_get(t,e,s){const i=e.replace(/\[(\d+)\]/g,".$1").split(".");let r=t;for(const t of i)if(r=Object(r)[t],void 0===r)return s;return r}lodash_set(t,e,s){return Object(t)!==t?t:(Array.isArray(e)||(e=e.toString().match(/[^.[\]]+/g)||[]),e.slice(0,-1).reduce((t,s,i)=>Object(t[s])===t[s]?t[s]:t[s]=Math.abs(e[i+1])>>0==+e[i+1]?[]:{},t)[e[e.length-1]]=s,t)}getdata(t){let e=this.getval(t);if(/^@/.test(t)){const[,s,i]=/^@(.*?)\.(.*?)$/.exec(t),r=s?this.getval(s):"";if(r)try{const t=JSON.parse(r);e=t?this.lodash_get(t,i,""):e}catch(t){e=""}}return e}setdata(t,e){let s=!1;if(/^@/.test(e)){const[,i,r]=/^@(.*?)\.(.*?)$/.exec(e),o=this.getval(i),h=i?"null"===o?null:o||"{}":"{}";try{const e=JSON.parse(h);this.lodash_set(e,r,t),s=this.setval(JSON.stringify(e),i)}catch(e){const o={};this.lodash_set(o,r,t),s=this.setval(JSON.stringify(o),i)}}else s=this.setval(t,e);return s}getval(t){return this.isSurge()||this.isLoon()?$persistentStore.read(t):this.isQuanX()?$prefs.valueForKey(t):this.isNode()?(this.data=this.loaddata(),this.data[t]):this.data&&this.data[t]||null}setval(t,e){return this.isSurge()||this.isLoon()?$persistentStore.write(t,e):this.isQuanX()?$prefs.setValueForKey(t,e):this.isNode()?(this.data=this.loaddata(),this.data[e]=t,this.writedata(),!0):this.data&&this.data[e]||null}initGotEnv(t){this.got=this.got?this.got:require("got"),this.cktough=this.cktough?this.cktough:require("tough-cookie"),this.ckjar=this.ckjar?this.ckjar:new this.cktough.CookieJar,t&&(t.headers=t.headers?t.headers:{},void 0===t.headers.Cookie&&void 0===t.cookieJar&&(t.cookieJar=this.ckjar))}get(t,e=(()=>{})){t.headers&&(delete t.headers["Content-Type"],delete t.headers["Content-Length"]),this.isSurge()||this.isLoon()?(this.isSurge()&&this.isNeedRewrite&&(t.headers=t.headers||{},Object.assign(t.headers,{"X-Surge-Skip-Scripting":!1})),$httpClient.get(t,(t,s,i)=>{!t&&s&&(s.body=i,s.statusCode=s.status),e(t,s,i)})):this.isQuanX()?(this.isNeedRewrite&&(t.opts=t.opts||{},Object.assign(t.opts,{hints:!1})),$task.fetch(t).then(t=>{const{statusCode:s,statusCode:i,headers:r,body:o}=t;e(null,{status:s,statusCode:i,headers:r,body:o},o)},t=>e(t))):this.isNode()&&(this.initGotEnv(t),this.got(t).on("redirect",(t,e)=>{try{if(t.headers["set-cookie"]){const s=t.headers["set-cookie"].map(this.cktough.Cookie.parse).toString();this.ckjar.setCookieSync(s,null),e.cookieJar=this.ckjar}}catch(t){this.logErr(t)}}).then(t=>{const{statusCode:s,statusCode:i,headers:r,body:o}=t;e(null,{status:s,statusCode:i,headers:r,body:o},o)},t=>{const{message:s,response:i}=t;e(s,i,i&&i.body)}))}post(t,e=(()=>{})){if(t.body&&t.headers&&!t.headers["Content-Type"]&&(t.headers["Content-Type"]="application/x-www-form-urlencoded"),t.headers&&delete t.headers["Content-Length"],this.isSurge()||this.isLoon())this.isSurge()&&this.isNeedRewrite&&(t.headers=t.headers||{},Object.assign(t.headers,{"X-Surge-Skip-Scripting":!1})),$httpClient.post(t,(t,s,i)=>{!t&&s&&(s.body=i,s.statusCode=s.status),e(t,s,i)});else if(this.isQuanX())t.method="POST",this.isNeedRewrite&&(t.opts=t.opts||{},Object.assign(t.opts,{hints:!1})),$task.fetch(t).then(t=>{const{statusCode:s,statusCode:i,headers:r,body:o}=t;e(null,{status:s,statusCode:i,headers:r,body:o},o)},t=>e(t));else if(this.isNode()){this.initGotEnv(t);const{url:s,...i}=t;this.got.post(s,i).then(t=>{const{statusCode:s,statusCode:i,headers:r,body:o}=t;e(null,{status:s,statusCode:i,headers:r,body:o},o)},t=>{const{message:s,response:i}=t;e(s,i,i&&i.body)})}}put(t,e=(()=>{})){if(t.body&&t.headers&&!t.headers["Content-Type"]&&(t.headers["Content-Type"]="application/x-www-form-urlencoded"),t.headers&&delete t.headers["Content-Length"],this.isSurge()||this.isLoon())this.isSurge()&&this.isNeedRewrite&&(t.headers=t.headers||{},Object.assign(t.headers,{"X-Surge-Skip-Scripting":!1})),$httpClient.put(t,(t,s,i)=>{!t&&s&&(s.body=i,s.statusCode=s.status),e(t,s,i)});else if(this.isQuanX())t.method="PUT",this.isNeedRewrite&&(t.opts=t.opts||{},Object.assign(t.opts,{hints:!1})),$task.fetch(t).then(t=>{const{statusCode:s,statusCode:i,headers:r,body:o}=t;e(null,{status:s,statusCode:i,headers:r,body:o},o)},t=>e(t));else if(this.isNode()){this.initGotEnv(t);const{url:s,...i}=t;this.got.put(s,i).then(t=>{const{statusCode:s,statusCode:i,headers:r,body:o}=t;e(null,{status:s,statusCode:i,headers:r,body:o},o)},t=>{const{message:s,response:i}=t;e(s,i,i&&i.body)})}}time(t){let e={"M+":(new Date).getMonth()+1,"d+":(new Date).getDate(),"H+":(new Date).getHours(),"m+":(new Date).getMinutes(),"s+":(new Date).getSeconds(),"q+":Math.floor(((new Date).getMonth()+3)/3),S:(new Date).getMilliseconds()};/(y+)/.test(t)&&(t=t.replace(RegExp.$1,((new Date).getFullYear()+"").substr(4-RegExp.$1.length)));for(let s in e)new RegExp("("+s+")").test(t)&&(t=t.replace(RegExp.$1,1==RegExp.$1.length?e[s]:("00"+e[s]).substr((""+e[s]).length)));return t}msg(e=t,s="",i="",r){const o=t=>{if(!t)return t;if("string"==typeof t)return this.isLoon()?t:this.isQuanX()?{"open-url":t}:this.isSurge()?{url:t}:void 0;if("object"==typeof t){if(this.isLoon()){let e=t.openUrl||t.url||t["open-url"],s=t.mediaUrl||t["media-url"];return{openUrl:e,mediaUrl:s}}if(this.isQuanX()){let e=t["open-url"]||t.url||t.openUrl,s=t["media-url"]||t.mediaUrl;return{"open-url":e,"media-url":s}}if(this.isSurge()){let e=t.url||t.openUrl||t["open-url"];return{url:e}}}};this.isMute||(this.isSurge()||this.isLoon()?$notification.post(e,s,i,o(r)):this.isQuanX()&&$notify(e,s,i,o(r)));let h=["","==============\ud83d\udce3\u7cfb\u7edf\u901a\u77e5\ud83d\udce3=============="];h.push(e),s&&h.push(s),i&&h.push(i),console.log(h.join("\n")),this.logs=this.logs.concat(h)}log(...t){t.length>0&&(this.logs=[...this.logs,...t]),console.log(t.join(this.logSeparator))}logErr(t,e){const s=!this.isSurge()&&!this.isQuanX()&&!this.isLoon();s?this.log("",`\u2757\ufe0f${this.name}, \u9519\u8bef!`,t.stack):this.log("",`\u2757\ufe0f${this.name}, \u9519\u8bef!`,t)}wait(t){return new Promise(e=>setTimeout(e,t))}done(t={}){const e=(new Date).getTime(),s=(e-this.startTime)/1e3;this.log("",`\ud83d\udd14${this.name}, \u7ed3\u675f! \ud83d\udd5b ${s} \u79d2`),this.log(),(this.isSurge()||this.isQuanX()||this.isLoon())&&$done(t)}}(t,e)}
|