diff --git a/jd_cleancart.js b/jd_cleancart.js index 013ae02..f5e692b 100644 --- a/jd_cleancart.js +++ b/jd_cleancart.js @@ -85,7 +85,9 @@ if ($.isNode()) { $.keywordsNum = 0 if ($.beforeRemove !== "0") { await cartFilter_xh(venderCart); + $.retry = 0; if (parseInt($.beforeRemove) !== $.keywordsNum) await removeCart(); + if($.retry = 2) break; else { console.log('\n由于购物车内的商品均包含关键字,本次执行将不删除购物车数据') break; @@ -194,6 +196,7 @@ function removeCart() { console.log('删除失败') console.log(data.errMsg) $.error = true; + $.retry++; } } catch (e) { $.logErr(e, resp); diff --git a/jd_dpqd.js b/jd_dpqd.js index 81314b2..8ca3ff0 100644 --- a/jd_dpqd.js +++ b/jd_dpqd.js @@ -25,31 +25,34 @@ let vender='' let num=0 let shopname='' const token = [ - "E7C2D644F989BBA3ADB563A682E591C6", - "1BF7556DFA8680BBCDD2F57937830BB7", + "156E859B3A314171CA34B780C19CB215", + "35BA76ED53A953E03F77EE5379C28BE5", "4BE1B58FE1360409A5967CAD1127B5A8", - "34864F266AFC02DDB7EEAD5A2AF9B4F7", - "7166EF6ED03BA34C3DBBA1ADB27E56C1", - "C031053EDBD2C047C072C53F80D82577", - "18FB7E1DE514D5E40D880585D4145DEC", - "CACEC89AD3A20309748FEC03B0B0C50C", - "E7C2D644F989BBA3ADB563A682E591C6", - "6359776E10B514A773610D94579BFA3B", "B30FC91ED327EE2E1C7C8B2214D8751A", - "3AF4B68A4BB3BD09D371B766E6A1B721", - "273EC9E9CA27DFDD85478972A1A0ED6F", + "3119848AE10A9E0858685099EB6C28CC", "A7DDDEAE3438B27260BDC8B1A555CE6F", "3B27B2B9E70249C339D66F27B7E133F0", - "AED3C29E6DA2F0AA84C08F0F726D59C2", - "6CB820BAC6C0CD8D1F90C342F0EA1018", - "38C4871110737702A9B3E6CC452977D1", - "AED3C29E6DA2F0AA84C08F0F726D59C2", - "35BA76ED53A953E03F77EE5379C28BE5", - "038B83D1D0D374F58821C7EDC4F3B5AE", - "0EED5C32E8002D6EF892D3995A0A9AA5", - "D5A12069E47F17718EF7E7381444A5FE", - "9F64084BD36FE0EBCDE1EDC956656501", - "7516691B34E89137D3C911BBF7D86ACD" + "C031053EDBD2C047C072C53F80D82577", + "8E3DB8D17AD97471F53959CF2F2439FE", + "89425692E74B610F07E9783B75CA299B", + "98640F3DCA10BB955E8039117A1F819F", + "92E3956A3FAF71B6922B0AA8D9ED070A", + "1C963AA3BBBD0396784BD0CA527BCDF8", + "C5FD1482A207F2CC65570F8FBC492C9A", + "5CF1A3455369BDB3D1153D9FC974CAFA", + "E29627AF30D59CF7FE7B01C63BD9A975", + "5B43A702C5CC14509CD8FB6F725326FC", + "451389BCDC4E8B258DD3F21CDB827589", + "57970BD464D679B43A7A0F5585F42677", + "21CEF5FF054814ADC61753FFFF417F03", + "A47418AED7F226A649E8886FCE2E02B3", + "65604889E08858A41E2DDB76D075C3BA", + "B7F1BE70638D6747223271745CB0D505", + "21CEF5FF054814ADC61753FFFF417F03", + "B6AF39DB2F83BEA76726BF0D71CCDDD8", + "9B57C79395931A570FB01264D48E9673", + "4706B9DB78BBCC66BCB76862EB147AD2", + "85B78F013645D1EC53D5F3974528654A" ] if ($.isNode()) { diff --git a/jd_fcwb.py b/jd_fcwb.py index 4232631..6fdb3ee 100644 --- a/jd_fcwb.py +++ b/jd_fcwb.py @@ -1,18 +1,20 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- ''' -定时自定义 -35 15 27 5 * jd_fcwb.py +cron: 1 1 1 1 * new Env('发财挖宝'); -活动入口: 京东极速版>我的>发财挖宝 -脚本功能为: 挖宝,提现,没有助力功能! -当血量剩余 1 时停止挖宝,领取奖励并提现 +活动入口: 京东极速版 > 我的 > 发财挖宝 +最高可得总和为10元的微信零钱和红包 +脚本功能为: 挖宝,提现,没有助力功能,当血量剩余 1 时停止挖宝,领取奖励并提现 + +目前需要完成逛一逛任务并且下单任务才能通关,不做的话大概可得1.5~2块的微信零钱 ''' import os,json,random,time,re,string,functools,asyncio import sys sys.path.append('../../tmp') +print('\n运行本脚本之前请手动进入游戏点击一个方块\n') print('\n挖的如果都是0.01红包就是黑了,别挣扎了!\n') -print('\n当血量剩余 1 时停止挖宝,领取奖励并提现,请先跑助力\n') +print('\n默认自动领取奖励,关闭请在代码383行加上#号注释即可\n') try: import requests except Exception as e: @@ -127,7 +129,7 @@ def taskGetUrl(functionId, body, cookie): # 剩余血量 def xueliang(cookie): - body={"linkId":linkId} + body={"linkId":linkId,"round":1} res=taskGetUrl("happyDigHome", body, cookie) if not res: return @@ -155,16 +157,17 @@ def jinge(cookie,i): # 页面数据 def happyDigHome(cookie): - body={"linkId":linkId} + body={"linkId":linkId,"round":1} res=taskGetUrl("happyDigHome", body, cookie) + exit_flag = "false" if not res: return if res['code']==0: if res['success']: curRound=res['data']['curRound'] # 未知 - incep_blood=res['data']['blood'] # 剩余血量 + incep_blood=res['data']['blood'] # 剩余血量 roundList=res['data']['roundList'] # 3个总池子 - for e,roundList_n in enumerate(roundList): # 迭代每个池子 + for e,roundList_n in enumerate(roundList): # 迭代每个池子 roundid=roundList_n['round'] # 池序号 state=roundList_n['state'] rows=roundList_n['rows'] # 池规模,rows*rows @@ -174,9 +177,14 @@ def happyDigHome(cookie): chunks=roundList_n['chunks'] # 当前池详情list a=jinge(cookie,roundid) - print(f'当前池序号为 {roundid} \n当前池规模为 {rows}*{rows}') - print(f'剩余血量 {a[0]}') - print(f'当前池已得京东红包 {a[2]}\n当前池已得微信红包 {a[1]}\n') + if roundid==1: + print(f'\n开始 "入门" 难度关卡({rows}*{rows})') + elif roundid==2: + print(f'\n开始 "挑战" 难度关卡({rows}*{rows})') + elif roundid==3: + print(f'\n开始 "终极" 难度关卡({rows}*{rows})') + print(f'当前剩余血量 {a[0]}🩸') + ## print(f'当前池已得京东红包 {a[2]}\n当前池已得微信红包 {a[1]}\n') _blood=xueliang(cookie) if _blood>1 or incep_blood>=21: happyDigDo(cookie,roundid,0,0) @@ -187,35 +195,43 @@ def happyDigHome(cookie): for n in range(roundid_n): for i in range(roundid_n): _blood=xueliang(cookie) - if _blood>1 or incep_blood>=21: - print(f'当前血量为 {_blood} 健康,继续挖宝') - print(f'本次挖取坐标为 ({n},{i})') + if _blood>1 or incep_blood>=21: + ## print(f'当前血量为 {_blood}') + a=n+1 + b=i+1 + print(f'挖取坐标({a},{b})') happyDigDo(cookie,roundid,n,i) else: a=jinge(cookie,roundid) - print(f'当前血量为 {_blood} 不健康,结束该池挖宝') - print(f'当前池已得京东红包 {a[2]}\n当前池已得微信红包 {a[1]}\n') + print(f'没血了,不挖了') + exit_flag = "true" + ## print(f'当前池已得京东红包 {a[2]}\n当前池已得微信红包 {a[1]}\n') break + + if exit_flag == "true": + break + if exit_flag == "true": + break else: print(f'获取数据失败\n{res}\n') else: print(f'获取数据失败\n{res}\n') -# # 玩一玩 -# def apDoTask(cookie): -# print('开始 玩一玩') -# body={"linkId":linkId,"taskType":"BROWSE_CHANNEL","taskId":454,"channel":4,"itemId":"https%3A%2F%2Fsignfree.jd.com%2F%3FactivityId%3DPiuLvM8vamONsWzC0wqBGQ","checkVersion":False} -# res=taskGetUrl('apDoTask', body, cookie) -# if not res: -# return -# try: -# if res['success']: -# print('任务完成,获得血量 1\n') -# else: -# print(f"{res['errMsg']}\n") -# except: -# print(f"错误\n{res}\n") + # 玩一玩 +def apDoTask(cookie): + print('开始做玩一玩任务') + body={"linkId":linkId,"taskType":"BROWSE_CHANNEL","taskId":454,"channel":4,"itemId":"https%3A%2F%2Fsignfree.jd.com%2F%3FactivityId%3DPiuLvM8vamONsWzC0wqBGQ","checkVersion":False} + res=taskGetUrl('apDoTask', body, cookie) + if not res: + return + try: + if res['success']: + print('玩好了') + else: + print(f"{res['errMsg']}") + except: + print(f"错误\n{res}") # 挖宝 @@ -228,19 +244,19 @@ def happyDigDo(cookie,roundid,rowIdx,colIdx): if res['success']: typeid=res['data']['chunk']['type'] if typeid==2: - print(f"挖到京东红包 {res['data']['chunk']['value']}\n") + print(f"获得极速版红包 {res['data']['chunk']['value']} 🧧\n") elif typeid==3: - print(f"挖到微信红包 {res['data']['chunk']['value']}\n") + print(f"🎉 获得微信零钱 {res['data']['chunk']['value']} 💰\n") elif typeid==4: - print(f"挖到炸弹\n") + print(f"💥Boom💥 挖到了炸弹 💣\n") elif typeid==1: - print(f"挖到优惠券\n") + print(f"获得优惠券 🎟️\n") else: - print(f'挖到外星物品\n') + print(f'不知道挖到了什么 🎁\n') else: - print(f'挖取失败\n{res}\n') + print(f'{res}\n挖宝失败\n') else: - print(f'挖取失败\n{res}\n') + print(f'{res}\n挖宝失败\n') # # 助力码 # def inviteCode(cookie): @@ -273,10 +289,9 @@ def happyDigDo(cookie,roundid,rowIdx,colIdx): # 领取奖励 def happyDigExchange(cookie): - for n in range(0,4): + for n in range(1,4): xueliang(cookie) - - print('开始领取奖励') + print(f"\n开始领取第{n}场的奖励") body={"round":n,"linkId":linkId} res=taskGetUrl("happyDigExchange", body, cookie) if not res: @@ -284,17 +299,18 @@ def happyDigExchange(cookie): if res['code']==0: if res['success']: try: - print(f"领取到微信红包 {res['data']['wxValue']}") - except: - pass - try: - print(f"领取到京东红包 {res['data']['redValue']}\n") + print(f"已领取极速版红包 {res['data']['redValue']} 🧧") except: print('') + if res['data']['wxValue'] != "0": + try: + print(f"可提现微信零钱 {res['data']['wxValue']} 💰") + except: + pass else: - print(res['errMsg']+'\n') + print(res['errMsg']) else: - print(res['errMsg']+'\n') + print(res['errMsg']) @@ -316,14 +332,18 @@ def spring_reward_list(cookie): poolBaseId=_items['poolBaseId'] prizeGroupId=_items['prizeGroupId'] prizeBaseId=_items['prizeBaseId'] - if '红包' not in prizeDesc: - print('尝试微信提现') + if '红包' in f"{prizeDesc}": + continue + if '券' in f"{prizeDesc}": + continue + else: + print('\n去提现微信零钱 💰') time.sleep(3.2) wecat(cookie,amountid,poolBaseId,prizeGroupId,prizeBaseId) else: print(f'获取数据失败\n{res}\n') else: - print(f'获取数据失败\n{res}\n') + print(f'获取数据失败\n{res}\n') # 微信提现 def wecat(cookie,amountid,poolBaseId,prizeGroupId,prizeBaseId): @@ -379,6 +399,7 @@ def main(): for e,cookie in enumerate(cookie_list,start=1): print(f'******开始【账号 {e}】 {get_pin(cookie)} *********\n') + apDoTask(cookie) happyDigHome(cookie) spring_reward_list(cookie) diff --git a/jd_lzdz1_customized612.js b/jd_lzdz1_customized612.js new file mode 100644 index 0000000..a6290e1 --- /dev/null +++ b/jd_lzdz1_customized612.js @@ -0,0 +1,562 @@ +/* +酒水会员盛典 +7 7 7 7 7 jd_lzdz1_customized612.js +*/ +const $ = new Env("酒水会员盛典"); +const jdCookieNode = $.isNode() ? require("./jdCookie.js") : ""; +const notify = $.isNode() ? require("./sendNotify") : ""; +let cookiesArr = [], cookie = "", message = ""; +let ownCode = null; +let authorCodeList = []; +if ($.isNode()) { + Object.keys(jdCookieNode).forEach((item) => { + cookiesArr.push(jdCookieNode[item]); + }); + if (process.env.JD_DEBUG && process.env.JD_DEBUG === "false") console.log = () => {}; +} else { + let cookiesData = $.getdata("CookiesJD") || "[]"; + cookiesData = JSON.parse(cookiesData); + cookiesArr = cookiesData.map((item) => item.cookie); + cookiesArr.reverse(); + cookiesArr.push(...[$.getdata("CookieJD2"), $.getdata("CookieJD")]); + cookiesArr.reverse(); + cookiesArr = cookiesArr.filter((item) => !!item); +} +!(async () => { + $.getAuthorCodeListerr = false; + if (!cookiesArr[0]) { + $.msg($.name, "【提示】请先获取京东账号一cookie\n直接使用NobyDa的京东签到获取", "https://bean.m.jd.com/bean/signIndex.action", { "open-url": "https://bean.m.jd.com/bean/signIndex.action" }); + return; + } + authorCodeList = await getAuthorCodeList('https://raw.githubusercontent.com/okyyds/duck/master/code/lzdz1.json') + // console.log(authorCodeList) + if ($.getAuthorCodeListerr === false) { + authorCodeList = [ + 'ce70b442586945668414fde6d813ab86', + '1582a55c4a8442d79819fd90e75b2d66', + 'a3b625f7fcc14a3d84237c2543461f0c', + ] + } + for (let i = 0; i < cookiesArr.length; i++) { + if (cookiesArr[i]) { + cookie = cookiesArr[i]; + originCookie = cookiesArr[i]; + newCookie = ""; + $.UserName = decodeURIComponent(cookie.match(/pt_pin=(.+?);/) && cookie.match(/pt_pin=(.+?);/)[1]); + $.index = i + 1; + $.isLogin = true; + $.nickName = ""; + $.getFirstLZCKerr = '' + await checkCookie(); + console.log(`\n******开始【京东账号${$.index}】${$.nickName || $.UserName}*********\n`); + if (!$.isLogin) { + $.msg($.name, `【提示】cookie已失效`, `京东账号${$.index} ${$.nickName || $.UserName}\n请重新登录获取\nhttps://bean.m.jd.com/bean/signIndex.action`, { "open-url": "https://bean.m.jd.com/bean/signIndex.action" }); + // if ($.isNode()) { + // await notify.sendNotify(`${$.name}cookie已失效 - ${$.UserName}`, `京东账号${$.index} ${$.UserName}\n请重新登录获取cookie`); + // } + continue; + } + $.bean = 0; + $.ADID = getUUID("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", 1); + $.UUID = getUUID("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"); + // authorCodeList = [ + // 'ce70b442586945668414fde6d813ab86', + // // '1582a55c4a8442d79819fd90e75b2d66', + // // 'a3b625f7fcc14a3d84237c2543461f0c', + // ]; + // $.authorCode = authorCodeList[random(0, authorCodeList.length)]; + $.authorCode = ownCode ? ownCode : authorCodeList[random(0, authorCodeList.length)] + $.authorNum = `${random(1000000, 9999999)}`; + $.randomCode = random(1000000, 9999999); + $.activityId = "dz9466823d5b5e4bc589b07d35e6ac"; + $.activityShopId = "1000097168"; + $.activityUrl = `https://lzdz1-isv.isvjcloud.com/dingzhi/drinkcategory/piecetoge1/activity/${$.authorNum}?activityId=${$.activityId}&shareUuid=${encodeURIComponent($.authorCode)}&adsource=null&shareuserid4minipg=${encodeURIComponent($.secretPin)}&shopid=1000097168&lng=00.000000&lat=00.000000&sid=&un_area=`; + await member(); + if ($.getFirstLZCKerr.indexOf('493') != -1) { + break + } + await $.wait(1500); + if ($.bean > 0) { + message += `\n【京东账号${$.index}】${$.nickName || $.UserName} \n └ 获得 ${$.bean} 京豆。`; + } + } + } + if (message !== "") { + if ($.isNode()) { + await notify.sendNotify($.name, message, "", `\n`); + } else { + $.msg($.name, "有点儿收获", message); + } + } +})() + .catch((e) => { + $.log("", `❌ ${$.name}, 失败! 原因: ${e}!`, ""); + }) + .finally(() => { + $.done(); + }); + +async function member() { + $.token = null; + $.secretPin = null; + $.openCardActivityId = null; + $.doFollowShop = false + lz_cookie = {}; + await getFirstLZCK(); + await getToken(); + await task("dz/common/getSimpleActInfoVo", `activityId=${$.activityId}`, 1); + if ($.token) { + await getMyPing(); + if ($.secretPin) { + console.log("去助力 -> " + $.authorCode); + await taskaccessLog("common/accessLogWithAD", `venderId=${$.activityShopId}&code=99&pin=${encodeURIComponent($.secretPin)}&activityId=${$.activityId}&pageUrl=${$.activityUrl}&subType=app&adSource=null`, 1); + await task("wxActionCommon/getUserInfo", `pin=${encodeURIComponent($.secretPin)}`, 1); + // console.log(cookie) + if ($.index === 1) { + await task("drinkcategory/piecetoge1/activityContent", `activityId=${$.activityId}&pin=${encodeURIComponent($.secretPin)}&pinImg=&nick=${encodeURIComponent($.pin)}&cjyxPin=&cjhyPin=&shareUuid=${encodeURIComponent($.authorCode)}`, 0, 1); + } else { + await task("drinkcategory/piecetoge1/activityContent", `activityId=${$.activityId}&pin=${encodeURIComponent($.secretPin)}&pinImg=&nick=${encodeURIComponent($.pin)}&cjyxPin=&cjhyPin=&shareUuid=${encodeURIComponent($.authorCode)}`); + } + $.log("关注店铺"); + await task("drinkcategory/piecetoge1/saveTask", `activityId=${$.activityId}&actorUuid=${encodeURIComponent($.actorUuid)}&pin=${encodeURIComponent($.secretPin)}&taskType=23&taskValue=23&shareUuid=${encodeURIComponent($.authorCode)}`); + await task("taskact/common/drawContent", `activityId=${$.activityId}&pin=${encodeURIComponent($.secretPin)}`); + await task("drinkcategory/piecetoge1/initOpenCard", `pin=${encodeURIComponent($.secretPin)}&activityId=${$.activityId}&shareUuid=${encodeURIComponent($.authorCode)}`); + $.log("加入店铺会员"); + if ($.openCardList) { + taskList = []; + $.openCardList.filter((x) => { if (!x.openStatus) { taskList.push(x) } }) + for (const vo of taskList) { + // console.log(vo.openStatus) + $.log(`>>> 去加入 ${vo.venderId}`); + if (vo.openStatus === false) { + $.log(`>>> 准备加入会员`); + await getShopOpenCardInfo({ venderId: `${vo.venderId}`, channel: "401" }, vo.venderId); + await bindWithVender({ venderId: `${vo.venderId}`, bindByVerifyCodeFlag: 1, registerExtend: {}, writeChildFlag: 0, activityId: $.openCardActivityId, channel: 401 }, vo.venderId); + await $.wait(1500); + } else { + $.log(`>>> 已经是会员`); + } + } + console.log("绑定助力"); + await task("drinkcategory/piecetoge1/initOpenCard", `pin=${encodeURIComponent($.secretPin)}&activityId=${$.activityId}&shareUuid=${encodeURIComponent($.authorCode)}`); + } + + // console.log("去助力 -> " + $.authorCode); + // await task("linkgame/assist/status", `activityId=${$.activityId}&pin=${encodeURIComponent($.secretPin)}&shareUuid=${$.authorCode}`); + // await task("linkgame/assist", `activityId=${$.activityId}&pin=${encodeURIComponent($.secretPin)}&shareUuid=${$.authorCode}`); + // await task('linkgame/help/list', `pin=${encodeURIComponent($.secretPin)}&activityId=${$.activityId}`) + // await task('drinkcategory/piecetoge1/startGame', `pin=${encodeURIComponent($.secretPin)}&activityId=${$.activityId}`) + // await task('drinkcategory/piecetoge1/endGame', `pin=${encodeURIComponent($.secretPin)}&activityId=${$.activityId}&gameId=${$.gameId}&score=${$.score}`) + // console.log('任务 -> ') + // await $.wait(2000) + // await task('opencard/addCart', `activityId=${$.activityId}&pin=${encodeURIComponent($.secretPin)}`); + // await $.wait(2000) + // await task('linkgame/sendAllCoupon', `activityId=${$.activityId}&pin=${encodeURIComponent($.secretPin)}`); + // await getFirstLZCK() + // await getToken(); + // console.log('抽奖 -> ') + // await $.wait(2000) + // await task('drinkcategory/piecetoge1/draw', `activityId=${$.activityId}&pin=${encodeURIComponent($.secretPin)}`); + // await $.wait(2000) + // await task('drinkcategory/piecetoge1/draw', `activityId=${$.activityId}&pin=${encodeURIComponent($.secretPin)}`); + // await $.wait(2000) + // await task('drinkcategory/piecetoge1/draw', `activityId=${$.activityId}&pin=${encodeURIComponent($.secretPin)}`); + // await $.wait(2000) + // await task('drinkcategory/piecetoge1/draw', `activityId=${$.activityId}&pin=${encodeURIComponent($.secretPin)}`); + await $.wait(2000) + await task('drinkcategory/piecetoge1/draw', `activityId=${$.activityId}&pin=${encodeURIComponent($.secretPin)}`); + // console.log('100 -> ') + // await getFirstLZCK() + // await getToken(); + // await $.wait(2000) + // await task('linkgame/draw/record', `activityId=${$.activityId}&actorUuid=${$.actorUuid}&pin=${encodeURIComponent($.secretPin)}`); + } + } +} + +function task(function_id, body, isCommon = 0, own = 0) { + return new Promise((resolve) => { + $.post(taskUrl(function_id, body, isCommon), async (err, resp, data) => { + try { + if (err) { + $.log(err); + } else { + if (data) { + data = JSON.parse(data); + if (data.result) { + switch (function_id) { + case "dz/common/getSimpleActInfoVo": + $.jdActivityId = data.data.jdActivityId; + $.venderId = data.data.venderId; + $.activityType = data.data.activityType; + // console.log($.venderId) + break; + case "wxActionCommon/getUserInfo": + break; + case "drinkcategory/piecetoge1/activityContent": + if (!data.data.hasEnd) { + $.log(`开启【${data.data.activityName}】活动`); + $.log("-------------------"); + if ($.index === 1) { + ownCode = data.data.actorUuid; + console.log(ownCode); + } + $.actorUuid = data.data.actorUuid; + } else { + $.log("活动已经结束"); + } + break; + case "drinkcategory/piecetoge1/initOpenCard": + $.openCardList = data.data.openInfo; + $.openCardStatus = data.data.allOpenCard; + // console.log(data) + break; + case "drinkcategory/piecetoge1/saveTask": + if (data) { + console.log(data); + $.doFollowShop = true + } + break; + case "drinkcategory/piecetoge1/draw": + console.log(data); + break; + case "opencard/addCart": + if (data.data) { + console.log(data.data); + } + break; + case "linkgame/sendAllCoupon": + if (data.data) { + console.log(data.data); + } + + break; + case "interaction/write/writePersonInfo": + console.log(data); + break; + case "linkgame/draw": + console.log(data); + break; + case "linkgame/draw/record": + console.log(data.data); + break; + case "linkgame/assist/status": + $.log(JSON.stringify(data)); + break; + case "linkgame/assist": + $.log(JSON.stringify(data)); + break; + case "opencard/help/list": + $.log(JSON.stringify(data)); + break; + default: + // $.log(JSON.stringify(data)) + break; + } + } else { + // $.log(JSON.stringify(data)) + } + } else { + // $.log("京东没有返回数据") + } + } + } catch (error) { + $.log(error); + } finally { + resolve(); + } + }); + }); +} +function taskaccessLog(function_id, body, isCommon = 0) { + return new Promise((resolve) => { + $.post(taskUrl(function_id, body, isCommon), async (err, resp, data) => { + try { + if (err) { + $.log(err); + } else { + // console.log(resp); + if (resp["headers"]["set-cookie"]) { + cookie = `${originCookie};`; + for (let sk of resp["headers"]["set-cookie"]) { + lz_cookie[sk.split(";")[0].substr(0, sk.split(";")[0].indexOf("="))] = sk.split(";")[0].substr(sk.split(";")[0].indexOf("=") + 1); + } + for (const vo of Object.keys(lz_cookie)) { + cookie += vo + "=" + lz_cookie[vo] + ";"; + } + } + } + } catch (error) { + console.log(error); + } finally { + resolve(); + } + }); + }); +} + +function getAuthorCodeList(url) { + return new Promise((resolve) => { + const options = { + url: `${url}?${new Date()}`, + timeout: 10000, + headers: { + "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1 Edg/87.0.4280.88", + }, + }; + $.get(options, async (err, resp, data) => { + try { + if (err) { + // $.log(err) + $.getAuthorCodeListerr = false; + } else { + if (data) data = JSON.parse(data); + $.getAuthorCodeListerr = true; + } + } catch (e) { + $.logErr(e, resp); + data = null; + } finally { + resolve(data); + } + }); + }); +} + +function taskUrl(function_id, body, isCommon) { + return { + url: isCommon ? `https://lzdz1-isv.isvjcloud.com/${function_id}` : `https://lzdz1-isv.isvjcloud.com/dingzhi/${function_id}`, + headers: { + Host: "lzdz1-isv.isvjcloud.com", + Accept: "application/json", + "X-Requested-With": "XMLHttpRequest", + "Accept-Language": "zh-cn", + "Accept-Encoding": "gzip, deflate, br", + "Content-Type": "application/x-www-form-urlencoded", + Origin: "https://lzdz1-isv.isvjcloud.com", + "User-Agent": `jdapp;iPhone;9.5.4;13.6;${$.UUID};network/wifi;ADID/${$.ADID};model/iPhone10,3;addressid/0;appBuild/167668;jdSupportDarkMode/0;Mozilla/5.0 (iPhone; CPU iPhone OS 13_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1`, + Connection: "keep-alive", + Referer: $.activityUrl, + Cookie: $.cookie, + }, + body: body, + }; +} + +function getMyPing() { + let opt = { + url: `https://lzdz1-isv.isvjcloud.com/customer/getMyPing`, + headers: { + Host: "lzdz1-isv.isvjcloud.com", + Accept: "application/json", + "X-Requested-With": "XMLHttpRequest", + "Accept-Language": "zh-cn", + "Accept-Encoding": "gzip, deflate, br", + "Content-Type": "application/x-www-form-urlencoded", + Origin: "https://lzdz1-isv.isvjcloud.com", + "User-Agent": `jdapp;iPhone;9.5.4;13.6;${$.UUID};network/wifi;ADID/${$.ADID};model/iPhone10,3;addressid/0;appBuild/167668;jdSupportDarkMode/0;Mozilla/5.0 (iPhone; CPU iPhone OS 13_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1`, + Connection: "keep-alive", + Referer: $.activityUrl, + Cookie: cookie, + }, + body: `userId=${$.activityShopId}&token=${$.token}&fromType=APP&riskType=1`, + }; + return new Promise((resolve) => { + $.post(opt, (err, resp, data) => { + try { + if (err) { + $.log(err); + } else { + if (resp["headers"]["set-cookie"]) { + cookie = `${originCookie}`; + if ($.isNode()) { + for (let sk of resp["headers"]["set-cookie"]) { + cookie = `${cookie}${sk.split(";")[0]};`; + } + } else { + for (let ck of resp["headers"]["Set-Cookie"].split(",")) { + cookie = `${cookie}${ck.split(";")[0]};`; + } + } + } + if (resp["headers"]["Set-Cookie"]) { + cookie = `${originCookie}`; + if ($.isNode()) { + for (let sk of resp["headers"]["set-cookie"]) { + cookie = `${cookie}${sk.split(";")[0]};`; + } + } else { + for (let ck of resp["headers"]["Set-Cookie"].split(",")) { + cookie = `${cookie}${ck.split(";")[0]};`; + } + } + } + if (data) { + data = JSON.parse(data); + if (data.result) { + $.log(`你好:${data.data.nickname}`); + $.pin = data.data.nickname; + $.secretPin = data.data.secretPin; + cookie = `${cookie};AUTH_C_USER=${data.data.secretPin}`; + } else { + $.log(data.errorMessage); + } + } else { + $.log("京东返回了空数据"); + } + } + } catch (error) { + $.log(error); + } finally { + resolve(); + } + }); + }); +} +function getFirstLZCK() { + return new Promise((resolve) => { + $.get( + { + url: $.activityUrl, + headers: { + "user-agent": $.isNode() ? process.env.JD_USER_AGENT ? process.env.JD_USER_AGENT : require("./USER_AGENTS").USER_AGENT : $.getdata("JDUA") ? $.getdata("JDUA") : "jdapp;iPhone;9.4.4;14.3;network/4g;Mozilla/5.0 (iPhone; CPU iPhone OS 14_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1", + }, + }, + (err, resp, data) => { + try { + if (err) { + $.getFirstLZCKerr = err + console.log(err); + } else { + if (resp["headers"]["set-cookie"]) { + cookie = `${originCookie}`; + if ($.isNode()) { + for (let sk of resp["headers"]["set-cookie"]) { + cookie = `${cookie}${sk.split(";")[0]};`; + } + } else { + for (let ck of resp["headers"]["Set-Cookie"].split(",")) { + cookie = `${cookie}${ck.split(";")[0]};`; + } + } + } + if (resp["headers"]["Set-Cookie"]) { + cookie = `${originCookie}`; + if ($.isNode()) { + for (let sk of resp["headers"]["set-cookie"]) { + cookie = `${cookie}${sk.split(";")[0]};`; + } + } else { + for (let ck of resp["headers"]["Set-Cookie"].split(",")) { + cookie = `${cookie}${ck.split(";")[0]};`; + } + } + } + } + $.cookie = cookie + } catch (error) { + console.log(error); + } finally { + resolve(); + } + } + ); + }); +} +function getToken() { + let opt = { + url: `https://api.m.jd.com/client.action?functionId=isvObfuscator`, + headers: { + Host: "api.m.jd.com", + "Content-Type": "application/x-www-form-urlencoded", + Accept: "*/*", + Connection: "keep-alive", + Cookie: cookie, + "User-Agent": "JD4iPhone/167650 (iPhone; iOS 13.7; Scale/3.00)", + "Accept-Language": "zh-Hans-CN;q=1", + "Accept-Encoding": "gzip, deflate, br", + }, + body: `body=%7B%22url%22%3A%20%22https%3A//lzkj-isv.isvjcloud.com%22%2C%20%22id%22%3A%20%22%22%7D&uuid=hjudwgohxzVu96krv&client=apple&clientVersion=9.4.0&st=1620476162000&sv=111&sign=f9d1b7e3b943b6a136d54fe4f892af05`, + }; + return new Promise((resolve) => { + $.post(opt, (err, resp, data) => { + try { + if (err) { + $.log(err); + } else { + if (data) { + data = JSON.parse(data); + if (data.code === "0") { + $.token = data.token; + } + } else { + $.log("京东返回了空数据"); + } + } + } catch (error) { + $.log(error); + } finally { + resolve(); + } + }); + }); +} +function random(min, max) { + return Math.floor(Math.random() * (max - min)) + min; +} +function getUUID(format = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", UpperCase = 0) { + return format.replace(/[xy]/g, function (c) { + var r = (Math.random() * 16) | 0, + v = c == "x" ? r : (r & 0x3) | 0x8; + if (UpperCase) { + uuid = v.toString(36).toUpperCase(); + } else { + uuid = v.toString(36); + } + return uuid; + }); +} +function checkCookie() { + const options = { + url: "https://me-api.jd.com/user_new/info/GetJDUserInfoUnion", + headers: { + Host: "me-api.jd.com", + Accept: "*/*", + Connection: "keep-alive", + Cookie: cookie, + "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 14_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.2 Mobile/15E148 Safari/604.1", + "Accept-Language": "zh-cn", + Referer: "https://home.m.jd.com/myJd/newhome.action?sceneval=2&ufc=&", + "Accept-Encoding": "gzip, deflate, br", + }, + }; + return new Promise((resolve) => { + $.get(options, (err, resp, data) => { + try { + if (err) { + $.logErr(err); + } else { + if (data) { + data = JSON.parse(data); + if (data.retcode === "1001") { + $.isLogin = false; //cookie过期 + return; + } + if (data.retcode === "0" && data.data.hasOwnProperty("userInfo")) { + $.nickName = data.data.userInfo.baseInfo.nickname; + } + } else { + $.log("京东返回了空数据"); + } + } + } catch (e) { + $.logErr(e); + } finally { + resolve(); + } + }); + }); +} +// prettier-ignore +var _0xod7='jsjiami.com.v6',_0xod7_=['‮_0xod7'],_0x1acd=[_0xod7,'\x53\x33\x4a\x54\x56\x32\x4d\x3d','\x54\x47\x4e\x4c\x62\x6e\x6b\x3d','\x62\x47\x39\x6e','\x63\x47\x46\x79\x63\x32\x55\x3d','\x63\x33\x56\x6a\x59\x32\x56\x7a\x63\x77\x3d\x3d','\x63\x6d\x56\x7a\x64\x57\x78\x30','\x61\x57\x35\x30\x5a\x58\x4a\x6c\x63\x33\x52\x7a\x55\x6e\x56\x73\x5a\x55\x78\x70\x63\x33\x51\x3d','\x62\x33\x42\x6c\x62\x6b\x4e\x68\x63\x6d\x52\x42\x59\x33\x52\x70\x64\x6d\x6c\x30\x65\x55\x6c\x6b','\x61\x57\x35\x30\x5a\x58\x4a\x6c\x63\x33\x52\x7a\x53\x57\x35\x6d\x62\x77\x3d\x3d','\x59\x57\x4e\x30\x61\x58\x5a\x70\x64\x48\x6c\x4a\x5a\x41\x3d\x3d','\x56\x45\x56\x4a\x59\x57\x38\x3d','\x55\x6d\x78\x6d\x59\x32\x4d\x3d','\x63\x45\x39\x31\x52\x6b\x4d\x3d','\x64\x6e\x5a\x75\x57\x45\x4d\x3d','\x62\x33\x64\x32\x5a\x47\x55\x3d','\x59\x33\x70\x4b\x62\x47\x67\x3d','\x51\x55\x64\x59\x59\x30\x6b\x3d','\x54\x30\x4a\x58\x55\x45\x59\x3d','\x56\x57\x6c\x55\x51\x33\x63\x3d','\x59\x6d\x6c\x75\x5a\x46\x64\x70\x64\x47\x68\x57\x5a\x57\x35\x6b\x5a\x58\x49\x3d','\x52\x57\x52\x36\x62\x57\x67\x3d','\x55\x48\x56\x58\x62\x6b\x59\x3d','\x61\x48\x52\x30\x63\x48\x4d\x36\x4c\x79\x39\x68\x63\x47\x6b\x75\x62\x53\x35\x71\x5a\x43\x35\x6a\x62\x32\x30\x76\x59\x32\x78\x70\x5a\x57\x35\x30\x4c\x6d\x46\x6a\x64\x47\x6c\x76\x62\x6a\x38\x3d','\x52\x33\x5a\x75\x55\x6c\x55\x3d','\x52\x6c\x5a\x71\x53\x30\x55\x3d','\x56\x47\x35\x69\x63\x30\x73\x3d','\x61\x6e\x6c\x47\x54\x31\x41\x3d','\x66\x53\x5a\x6a\x61\x47\x46\x75\x62\x6d\x56\x73\x50\x54\x51\x77\x4d\x53\x5a\x79\x5a\x58\x52\x31\x63\x6d\x35\x56\x63\x6d\x77\x39','\x59\x55\x78\x36\x61\x31\x63\x3d','\x56\x6d\x74\x75\x62\x33\x51\x3d','\x54\x56\x6c\x6f\x54\x45\x4d\x3d','\x62\x58\x64\x34\x52\x47\x30\x3d','\x65\x6c\x5a\x70\x59\x57\x34\x3d','\x52\x55\x46\x4a\x51\x6b\x45\x3d','\x53\x57\x70\x7a\x59\x6b\x6f\x3d','\x56\x55\x74\x79\x61\x46\x55\x3d','\x56\x32\x74\x69\x53\x45\x77\x3d','\x54\x46\x4a\x49\x61\x6b\x77\x3d','\x54\x30\x4e\x44\x54\x6e\x63\x3d','\x56\x31\x70\x7a\x57\x56\x6f\x3d','\x56\x33\x4e\x72\x63\x48\x67\x3d','\x61\x56\x42\x6b\x5a\x58\x67\x3d','\x51\x6e\x64\x6c\x55\x31\x63\x3d','\x65\x57\x35\x5a\x63\x58\x49\x3d','\x63\x47\x74\x50\x64\x58\x4d\x3d','\x57\x6d\x56\x5a\x62\x6c\x67\x3d','\x61\x56\x68\x4e\x54\x33\x6b\x3d','\x62\x56\x5a\x33\x65\x56\x67\x3d','\x55\x47\x4a\x50\x51\x55\x49\x3d','\x54\x33\x68\x74\x56\x57\x59\x3d','\x62\x55\x31\x52\x61\x33\x59\x3d','\x53\x57\x4a\x45\x62\x56\x45\x3d','\x59\x6d\x6c\x75\x5a\x46\x64\x70\x64\x47\x68\x57\x5a\x57\x35\x6b\x5a\x58\x4a\x74\x5a\x58\x4e\x7a\x59\x57\x64\x6c','\x62\x57\x56\x7a\x63\x32\x46\x6e\x5a\x51\x3d\x3d','\x5a\x57\x35\x32','\x55\x30\x6c\x48\x54\x6c\x39\x56\x55\x6b\x77\x3d','\x59\x6d\x52\x6e\x63\x30\x30\x3d','\x57\x6b\x74\x34\x53\x6b\x34\x3d','\x59\x30\x56\x51\x63\x6d\x4d\x3d','\x65\x45\x64\x72\x54\x47\x38\x3d','\x5a\x45\x74\x57\x64\x6d\x67\x3d','\x51\x58\x68\x73\x63\x6d\x6f\x3d','\x4f\x47\x46\x6b\x5a\x6d\x49\x3d','\x61\x6d\x52\x66\x63\x32\x68\x76\x63\x46\x39\x74\x5a\x57\x31\x69\x5a\x58\x49\x3d','\x4f\x53\x34\x79\x4c\x6a\x41\x3d','\x61\x6d\x52\x7a\x61\x57\x64\x75\x4c\x6d\x4e\x6d','\x59\x58\x42\x77\x62\x47\x6c\x6a\x59\x58\x52\x70\x62\x32\x34\x76\x61\x6e\x4e\x76\x62\x67\x3d\x3d','\x64\x6c\x6c\x43\x5a\x45\x67\x3d','\x51\x6b\x31\x47\x61\x33\x6b\x3d','\x61\x58\x56\x36\x61\x31\x45\x3d','\x5a\x30\x68\x33\x52\x58\x6f\x3d','\x55\x32\x56\x4d\x52\x6e\x45\x3d','\x52\x57\x35\x59\x65\x6c\x6b\x3d','\x55\x48\x70\x34\x63\x55\x67\x3d','\x54\x6c\x52\x42\x55\x56\x41\x3d','\x61\x30\x56\x78\x65\x6e\x45\x3d','\x61\x6c\x5a\x59\x63\x48\x45\x3d','\x51\x57\x31\x4f\x63\x6b\x6b\x3d','\x63\x57\x6c\x43\x64\x32\x63\x3d','\x5a\x6d\x78\x76\x62\x33\x49\x3d','\x62\x46\x6c\x57\x65\x47\x73\x3d','\x63\x6d\x46\x75\x5a\x47\x39\x74','\x62\x47\x56\x75\x5a\x33\x52\x6f','\x61\x48\x52\x30\x63\x48\x4d\x36\x4c\x79\x39\x6a\x5a\x47\x34\x75\x62\x6e\x6f\x75\x62\x48\x55\x76\x5a\x32\x56\x30\x61\x44\x56\x7a\x64\x41\x3d\x3d','\x52\x47\x5a\x61\x62\x32\x67\x3d','\x57\x45\x4e\x36\x62\x6e\x59\x3d','\x63\x47\x39\x7a\x64\x41\x3d\x3d','\x53\x6b\x64\x4a\x53\x6b\x6f\x3d','\x59\x30\x78\x31\x57\x56\x63\x3d','\x53\x6d\x56\x74\x64\x6b\x67\x3d','\x56\x46\x4e\x6c\x59\x55\x59\x3d','\x5a\x6c\x64\x6d\x54\x31\x51\x3d','\x59\x58\x42\x77\x62\x48\x6b\x3d','\x65\x6b\x39\x49\x64\x45\x67\x3d','\x56\x46\x70\x75\x51\x6d\x6f\x3d','\x62\x47\x39\x6e\x52\x58\x4a\x79','\x61\x30\x64\x42\x55\x55\x51\x3d','\x56\x46\x6c\x48\x57\x48\x6f\x3d','\x59\x58\x42\x70\x4c\x6d\x30\x75\x61\x6d\x51\x75\x59\x32\x39\x74','\x4b\x69\x38\x71','\x61\x32\x56\x6c\x63\x43\x31\x68\x62\x47\x6c\x32\x5a\x51\x3d\x3d','\x65\x6d\x67\x74\x59\x32\x34\x3d','\x5a\x33\x70\x70\x63\x43\x77\x67\x5a\x47\x56\x6d\x62\x47\x46\x30\x5a\x53\x77\x67\x59\x6e\x49\x3d','\x61\x48\x52\x30\x63\x48\x4d\x36\x4c\x79\x39\x68\x63\x47\x6b\x75\x62\x53\x35\x71\x5a\x43\x35\x6a\x62\x32\x30\x76\x59\x32\x78\x70\x5a\x57\x35\x30\x4c\x6d\x46\x6a\x64\x47\x6c\x76\x62\x6a\x39\x68\x63\x48\x42\x70\x5a\x44\x31\x71\x5a\x46\x39\x7a\x61\x47\x39\x77\x58\x32\x31\x6c\x62\x57\x4a\x6c\x63\x69\x5a\x6d\x64\x57\x35\x6a\x64\x47\x6c\x76\x62\x6b\x6c\x6b\x50\x57\x64\x6c\x64\x46\x4e\x6f\x62\x33\x42\x50\x63\x47\x56\x75\x51\x32\x46\x79\x5a\x45\x6c\x75\x5a\x6d\x38\x6d\x59\x6d\x39\x6b\x65\x54\x30\x3d','\x65\x47\x52\x75\x51\x6c\x49\x3d','\x63\x33\x52\x79\x61\x57\x35\x6e\x61\x57\x5a\x35','\x4a\x6d\x4e\x73\x61\x57\x56\x75\x64\x44\x31\x49\x4e\x53\x5a\x6a\x62\x47\x6c\x6c\x62\x6e\x52\x57\x5a\x58\x4a\x7a\x61\x57\x39\x75\x50\x54\x6b\x75\x4d\x69\x34\x77\x4a\x6e\x56\x31\x61\x57\x51\x39\x4f\x44\x67\x34\x4f\x44\x67\x3d','\x55\x6b\x70\x46\x55\x33\x6f\x3d','\x62\x48\x5a\x6c\x64\x6e\x67\x3d','\x59\x31\x68\x71\x63\x6e\x41\x3d','\x61\x6d\x52\x68\x63\x48\x41\x37\x61\x56\x42\x6f\x62\x32\x35\x6c\x4f\x7a\x6b\x75\x4e\x53\x34\x30\x4f\x7a\x45\x7a\x4c\x6a\x59\x37','\x56\x56\x56\x4a\x52\x41\x3d\x3d','\x4f\x32\x35\x6c\x64\x48\x64\x76\x63\x6d\x73\x76\x64\x32\x6c\x6d\x61\x54\x74\x42\x52\x45\x6c\x45\x4c\x77\x3d\x3d','\x51\x55\x52\x4a\x52\x41\x3d\x3d','\x4f\x32\x31\x76\x5a\x47\x56\x73\x4c\x32\x6c\x51\x61\x47\x39\x75\x5a\x54\x45\x77\x4c\x44\x4d\x37\x59\x57\x52\x6b\x63\x6d\x56\x7a\x63\x32\x6c\x6b\x4c\x7a\x41\x37\x59\x58\x42\x77\x51\x6e\x56\x70\x62\x47\x51\x76\x4d\x54\x59\x33\x4e\x6a\x59\x34\x4f\x32\x70\x6b\x55\x33\x56\x77\x63\x47\x39\x79\x64\x45\x52\x68\x63\x6d\x74\x4e\x62\x32\x52\x6c\x4c\x7a\x41\x37\x54\x57\x39\x36\x61\x57\x78\x73\x59\x53\x38\x31\x4c\x6a\x41\x67\x4b\x47\x6c\x51\x61\x47\x39\x75\x5a\x54\x73\x67\x51\x31\x42\x56\x49\x47\x6c\x51\x61\x47\x39\x75\x5a\x53\x42\x50\x55\x79\x41\x78\x4d\x31\x38\x32\x49\x47\x78\x70\x61\x32\x55\x67\x54\x57\x46\x6a\x49\x45\x39\x54\x49\x46\x67\x70\x49\x45\x46\x77\x63\x47\x78\x6c\x56\x32\x56\x69\x53\x32\x6c\x30\x4c\x7a\x59\x77\x4e\x53\x34\x78\x4c\x6a\x45\x31\x49\x43\x68\x4c\x53\x46\x52\x4e\x54\x43\x77\x67\x62\x47\x6c\x72\x5a\x53\x42\x48\x5a\x57\x4e\x72\x62\x79\x6b\x67\x54\x57\x39\x69\x61\x57\x78\x6c\x4c\x7a\x45\x31\x52\x54\x45\x30\x4f\x44\x74\x7a\x64\x58\x42\x77\x62\x33\x4a\x30\x53\x6b\x52\x54\x53\x46\x64\x4c\x4c\x7a\x45\x3d','\x61\x57\x4a\x49\x5a\x48\x45\x3d','\x61\x48\x52\x30\x63\x48\x4d\x36\x4c\x79\x39\x7a\x61\x47\x39\x77\x62\x57\x56\x74\x59\x6d\x56\x79\x4c\x6d\x30\x75\x61\x6d\x51\x75\x59\x32\x39\x74\x4c\x33\x4e\x6f\x62\x33\x42\x6a\x59\x58\x4a\x6b\x4c\x7a\x39\x32\x5a\x57\x35\x6b\x5a\x58\x4a\x4a\x5a\x44\x30\x3d','\x66\x53\x5a\x6a\x61\x47\x46\x75\x62\x6d\x56\x73\x50\x54\x67\x77\x4d\x53\x5a\x79\x5a\x58\x52\x31\x63\x6d\x35\x56\x63\x6d\x77\x39','\x59\x57\x4e\x30\x61\x58\x5a\x70\x64\x48\x6c\x56\x63\x6d\x77\x3d','\x5a\x55\x64\x48\x65\x6e\x67\x3d','\x61\x58\x46\x34\x57\x55\x38\x3d','\x59\x56\x52\x6b\x65\x6d\x55\x3d','\x62\x56\x52\x51\x65\x55\x63\x3d','\x5a\x32\x56\x30','\x6a\x6b\x73\x6a\x45\x69\x48\x61\x6d\x69\x64\x53\x2e\x63\x54\x6f\x6d\x43\x2e\x76\x36\x68\x6c\x45\x45\x56\x50\x75\x56\x3d\x3d'];if(function(_0x47dca4,_0x2e45a0,_0x2d0d38){function _0x358c40(_0x4e0fee,_0x44d395,_0x5f1629,_0x6d2cae,_0x379df8,_0x59c1d4){_0x44d395=_0x44d395>>0x8,_0x379df8='po';var _0x24e0cd='shift',_0x197297='push',_0x59c1d4='‮';if(_0x44d395<_0x4e0fee){while(--_0x4e0fee){_0x6d2cae=_0x47dca4[_0x24e0cd]();if(_0x44d395===_0x4e0fee&&_0x59c1d4==='‮'&&_0x59c1d4['length']===0x1){_0x44d395=_0x6d2cae,_0x5f1629=_0x47dca4[_0x379df8+'p']();}else if(_0x44d395&&_0x5f1629['replace'](/[kEHdSTChlEEVPuV=]/g,'')===_0x44d395){_0x47dca4[_0x197297](_0x6d2cae);}}_0x47dca4[_0x197297](_0x47dca4[_0x24e0cd]());}return 0xdaf2e;};return _0x358c40(++_0x2e45a0,_0x2d0d38)>>_0x2e45a0^_0x2d0d38;}(_0x1acd,0x1d5,0x1d500),_0x1acd){_0xod7_=_0x1acd['length']^0x1d5;};function _0x27de(_0x4ab799,_0x2148e0){_0x4ab799=~~'0x'['concat'](_0x4ab799['slice'](0x1));var _0x38aa70=_0x1acd[_0x4ab799];if(_0x27de['HEabFd']===undefined&&'‮'['length']===0x1){(function(){var _0x48587b=function(){var _0x226fa7;try{_0x226fa7=Function('return\x20(function()\x20'+'{}.constructor(\x22return\x20this\x22)(\x20)'+');')();}catch(_0x302471){_0x226fa7=window;}return _0x226fa7;};var _0x2dcb25=_0x48587b();var _0x5d0b0e='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';_0x2dcb25['atob']||(_0x2dcb25['atob']=function(_0x41138d){var _0x37290e=String(_0x41138d)['replace'](/=+$/,'');for(var _0x1da2f9=0x0,_0x27e844,_0x496c4d,_0x55ec30=0x0,_0x46993b='';_0x496c4d=_0x37290e['charAt'](_0x55ec30++);~_0x496c4d&&(_0x27e844=_0x1da2f9%0x4?_0x27e844*0x40+_0x496c4d:_0x496c4d,_0x1da2f9++%0x4)?_0x46993b+=String['fromCharCode'](0xff&_0x27e844>>(-0x2*_0x1da2f9&0x6)):0x0){_0x496c4d=_0x5d0b0e['indexOf'](_0x496c4d);}return _0x46993b;});}());_0x27de['ciicrd']=function(_0x35e622){var _0x1ca022=atob(_0x35e622);var _0x460af0=[];for(var _0x27de2b=0x0,_0x1b5b31=_0x1ca022['length'];_0x27de2b<_0x1b5b31;_0x27de2b++){_0x460af0+='%'+('00'+_0x1ca022['charCodeAt'](_0x27de2b)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x460af0);};_0x27de['qeLOEi']={};_0x27de['HEabFd']=!![];}var _0x4e1a4f=_0x27de['qeLOEi'][_0x4ab799];if(_0x4e1a4f===undefined){_0x38aa70=_0x27de['ciicrd'](_0x38aa70);_0x27de['qeLOEi'][_0x4ab799]=_0x38aa70;}else{_0x38aa70=_0x4e1a4f;}return _0x38aa70;};function getShopOpenCardInfo(_0x2dfe13,_0x2a9c59){var _0x169e2b={'\x69\x71\x78\x59\x4f':function(_0x237960,_0x2865f7){return _0x237960===_0x2865f7;},'\x61\x54\x64\x7a\x65':_0x27de('‮0'),'\x6d\x54\x50\x79\x47':function(_0x5db734){return _0x5db734();},'\x78\x64\x6e\x42\x52':function(_0x27ef1f,_0x2696d1){return _0x27ef1f(_0x2696d1);},'\x52\x4a\x45\x53\x7a':_0x27de('‫1'),'\x6c\x76\x65\x76\x78':_0x27de('‫2'),'\x63\x58\x6a\x72\x70':_0x27de('‫3'),'\x69\x62\x48\x64\x71':_0x27de('‮4'),'\x65\x47\x47\x7a\x78':_0x27de('‫5')};let _0x4540b3={'\x75\x72\x6c':_0x27de('‮6')+_0x169e2b[_0x27de('‮7')](encodeURIComponent,JSON[_0x27de('‫8')](_0x2dfe13))+_0x27de('‮9'),'\x68\x65\x61\x64\x65\x72\x73':{'\x48\x6f\x73\x74':_0x169e2b[_0x27de('‮a')],'\x41\x63\x63\x65\x70\x74':_0x169e2b[_0x27de('‮b')],'\x43\x6f\x6e\x6e\x65\x63\x74\x69\x6f\x6e':_0x169e2b[_0x27de('‫c')],'\x43\x6f\x6f\x6b\x69\x65':cookie,'User-Agent':_0x27de('‫d')+$[_0x27de('‫e')]+_0x27de('‫f')+$[_0x27de('‫10')]+_0x27de('‫11'),'Accept-Language':_0x169e2b[_0x27de('‫12')],'\x52\x65\x66\x65\x72\x65\x72':_0x27de('‮13')+_0x2a9c59+_0x27de('‮14')+_0x169e2b[_0x27de('‮7')](encodeURIComponent,$[_0x27de('‫15')]),'Accept-Encoding':_0x169e2b[_0x27de('‮16')]}};return new Promise(_0x24d014=>{var _0x45d140={'\x4b\x72\x53\x57\x63':function(_0x564cc4,_0x316683){return _0x169e2b[_0x27de('‫17')](_0x564cc4,_0x316683);},'\x4c\x63\x4b\x6e\x79':_0x169e2b[_0x27de('‫18')],'\x54\x45\x49\x61\x6f':function(_0x32cebc){return _0x169e2b[_0x27de('‫19')](_0x32cebc);}};$[_0x27de('‫1a')](_0x4540b3,(_0x497df1,_0x18ad2f,_0x1d037c)=>{if(_0x45d140[_0x27de('‮1b')](_0x45d140[_0x27de('‮1c')],_0x45d140[_0x27de('‮1c')])){try{if(_0x497df1){console[_0x27de('‫1d')](_0x497df1);}else{res=JSON[_0x27de('‫1e')](_0x1d037c);if(res[_0x27de('‮1f')]){if(res[_0x27de('‮20')][_0x27de('‮21')]){$[_0x27de('‮22')]=res[_0x27de('‮20')][_0x27de('‮21')][0x0][_0x27de('‫23')][_0x27de('‮24')];}}}}catch(_0x487efd){console[_0x27de('‫1d')](_0x487efd);}finally{_0x45d140[_0x27de('‮25')](_0x24d014);}}else{console[_0x27de('‫1d')](_0x497df1);}});});}async function bindWithVender(_0x4bf9aa,_0x5a230c){var _0x5180ad={'\x4d\x59\x68\x4c\x43':function(_0x396660){return _0x396660();},'\x6d\x77\x78\x44\x6d':function(_0x4b2169,_0x405a0d){return _0x4b2169!==_0x405a0d;},'\x7a\x56\x69\x61\x6e':_0x27de('‫26'),'\x45\x41\x49\x42\x41':_0x27de('‫27'),'\x49\x6a\x73\x62\x4a':function(_0xcf4ea9,_0x3221b8){return _0xcf4ea9===_0x3221b8;},'\x55\x4b\x72\x68\x55':_0x27de('‫28'),'\x57\x6b\x62\x48\x4c':_0x27de('‫29'),'\x4c\x52\x48\x6a\x4c':_0x27de('‮2a'),'\x4f\x43\x43\x4e\x77':_0x27de('‫2b'),'\x57\x5a\x73\x59\x5a':_0x27de('‫2c'),'\x57\x73\x6b\x70\x78':_0x27de('‮2d'),'\x45\x64\x7a\x6d\x68':function(_0x148959,_0x176008,_0x319ba8){return _0x148959(_0x176008,_0x319ba8);},'\x50\x75\x57\x6e\x46':_0x27de('‮2e'),'\x47\x76\x6e\x52\x55':_0x27de('‫1'),'\x46\x56\x6a\x4b\x45':_0x27de('‫2'),'\x54\x6e\x62\x73\x4b':_0x27de('‫3'),'\x6a\x79\x46\x4f\x50':_0x27de('‮4'),'\x61\x4c\x7a\x6b\x57':function(_0x3768db,_0x1db8ba){return _0x3768db(_0x1db8ba);},'\x56\x6b\x6e\x6f\x74':_0x27de('‫5')};return h5st=await _0x5180ad[_0x27de('‮2f')](geth5st,_0x5180ad[_0x27de('‮30')],_0x4bf9aa),opt={'\x75\x72\x6c':_0x27de('‮31')+h5st,'\x68\x65\x61\x64\x65\x72\x73':{'\x48\x6f\x73\x74':_0x5180ad[_0x27de('‮32')],'\x41\x63\x63\x65\x70\x74':_0x5180ad[_0x27de('‫33')],'\x43\x6f\x6e\x6e\x65\x63\x74\x69\x6f\x6e':_0x5180ad[_0x27de('‮34')],'\x43\x6f\x6f\x6b\x69\x65':cookie,'User-Agent':_0x27de('‫d')+$[_0x27de('‫e')]+_0x27de('‫f')+$[_0x27de('‫10')]+_0x27de('‫11'),'Accept-Language':_0x5180ad[_0x27de('‫35')],'\x52\x65\x66\x65\x72\x65\x72':_0x27de('‮13')+_0x5a230c+_0x27de('‮36')+_0x5180ad[_0x27de('‮37')](encodeURIComponent,$[_0x27de('‫15')]),'Accept-Encoding':_0x5180ad[_0x27de('‫38')]}},new Promise(_0x2c2848=>{var _0x1f470d={'\x69\x50\x64\x65\x78':function(_0x4c0bea){return _0x5180ad[_0x27de('‫39')](_0x4c0bea);},'\x42\x77\x65\x53\x57':function(_0x240905,_0x2118e5){return _0x5180ad[_0x27de('‫3a')](_0x240905,_0x2118e5);},'\x79\x6e\x59\x71\x72':_0x5180ad[_0x27de('‫3b')],'\x70\x6b\x4f\x75\x73':_0x5180ad[_0x27de('‮3c')],'\x5a\x65\x59\x6e\x58':function(_0x2ff734,_0x50b6d9){return _0x5180ad[_0x27de('‮3d')](_0x2ff734,_0x50b6d9);},'\x69\x58\x4d\x4f\x79':_0x5180ad[_0x27de('‫3e')],'\x6d\x56\x77\x79\x58':function(_0x43cb7f,_0x5f0fa8){return _0x5180ad[_0x27de('‮3d')](_0x43cb7f,_0x5f0fa8);},'\x50\x62\x4f\x41\x42':_0x5180ad[_0x27de('‫3f')],'\x4f\x78\x6d\x55\x66':_0x5180ad[_0x27de('‫40')],'\x49\x62\x44\x6d\x51':_0x5180ad[_0x27de('‫41')],'\x62\x64\x67\x73\x4d':_0x5180ad[_0x27de('‫42')],'\x5a\x4b\x78\x4a\x4e':_0x5180ad[_0x27de('‮43')]};$[_0x27de('‫1a')](opt,(_0x311afb,_0x3b7aab,_0x4c2873)=>{var _0x53384e={'\x6d\x4d\x51\x6b\x76':function(_0x26e196){return _0x1f470d[_0x27de('‫44')](_0x26e196);}};try{if(_0x1f470d[_0x27de('‮45')](_0x1f470d[_0x27de('‫46')],_0x1f470d[_0x27de('‮47')])){if(_0x311afb){if(_0x1f470d[_0x27de('‫48')](_0x1f470d[_0x27de('‫49')],_0x1f470d[_0x27de('‫49')])){console[_0x27de('‫1d')](_0x311afb);}else{console[_0x27de('‫1d')](error);}}else{if(_0x1f470d[_0x27de('‮4a')](_0x1f470d[_0x27de('‫4b')],_0x1f470d[_0x27de('‮4c')])){_0x53384e[_0x27de('‮4d')](_0x2c2848);}else{res=JSON[_0x27de('‫1e')](_0x4c2873);if(res[_0x27de('‮1f')]){if(_0x1f470d[_0x27de('‮4a')](_0x1f470d[_0x27de('‫4e')],_0x1f470d[_0x27de('‫4e')])){console[_0x27de('‫1d')](res);$[_0x27de('‫4f')]=res[_0x27de('‮50')];}else{console[_0x27de('‫1d')](_0x311afb);}}}}}else{Host=process[_0x27de('‮51')][_0x27de('‫52')];}}catch(_0x317968){if(_0x1f470d[_0x27de('‮4a')](_0x1f470d[_0x27de('‮53')],_0x1f470d[_0x27de('‮53')])){console[_0x27de('‫1d')](_0x317968);}else{$[_0x27de('‮22')]=res[_0x27de('‮20')][_0x27de('‮21')][0x0][_0x27de('‫23')][_0x27de('‮24')];}}finally{if(_0x1f470d[_0x27de('‮45')](_0x1f470d[_0x27de('‫54')],_0x1f470d[_0x27de('‫54')])){_0x1f470d[_0x27de('‫44')](_0x2c2848);}else{_0x1f470d[_0x27de('‫44')](_0x2c2848);}}});});}function geth5st(_0x1c2dc4,_0x38bbf9){var _0xad3eae={'\x76\x59\x42\x64\x48':function(_0xb6682a,_0x1dbeb1){return _0xb6682a===_0x1dbeb1;},'\x42\x4d\x46\x6b\x79':_0x27de('‮55'),'\x69\x75\x7a\x6b\x51':function(_0x521e0c,_0x1ffbd9){return _0x521e0c!==_0x1ffbd9;},'\x67\x48\x77\x45\x7a':_0x27de('‮56'),'\x53\x65\x4c\x46\x71':_0x27de('‮57'),'\x45\x6e\x58\x7a\x59':function(_0x4fa54e,_0x1f1dc2){return _0x4fa54e===_0x1f1dc2;},'\x50\x7a\x78\x71\x48':_0x27de('‮58'),'\x4e\x54\x41\x51\x50':function(_0x3fd51b,_0x32a444){return _0x3fd51b(_0x32a444);},'\x6b\x45\x71\x7a\x71':_0x27de('‫59'),'\x6a\x56\x58\x70\x71':_0x27de('‫5a'),'\x41\x6d\x4e\x72\x49':_0x27de('‮5b'),'\x71\x69\x42\x77\x67':_0x27de('‫5c'),'\x6c\x59\x56\x78\x6b':function(_0x2a05e2,_0x15824){return _0x2a05e2*_0x15824;},'\x44\x66\x5a\x6f\x68':_0x27de('‫5d'),'\x58\x43\x7a\x6e\x76':function(_0x46d10b,_0x5b5da1){return _0x46d10b*_0x5b5da1;}};return new Promise(async _0x573221=>{var _0x1c0efb={'\x4a\x47\x49\x4a\x4a':function(_0x30195c,_0x3fe97e){return _0xad3eae[_0x27de('‮5e')](_0x30195c,_0x3fe97e);},'\x63\x4c\x75\x59\x57':_0xad3eae[_0x27de('‫5f')],'\x4a\x65\x6d\x76\x48':function(_0x41b061,_0x2c0980){return _0xad3eae[_0x27de('‫60')](_0x41b061,_0x2c0980);},'\x54\x53\x65\x61\x46':_0xad3eae[_0x27de('‫61')],'\x66\x57\x66\x4f\x54':_0xad3eae[_0x27de('‮62')],'\x7a\x4f\x48\x74\x48':function(_0x1029f8,_0x21337a){return _0xad3eae[_0x27de('‮63')](_0x1029f8,_0x21337a);},'\x54\x5a\x6e\x42\x6a':_0xad3eae[_0x27de('‫64')],'\x6b\x47\x41\x51\x44':function(_0x1b9d1f,_0x3ee921){return _0xad3eae[_0x27de('‫65')](_0x1b9d1f,_0x3ee921);}};let _0x23db17={'\x61\x70\x70\x49\x64':_0xad3eae[_0x27de('‫66')],'\x62\x6f\x64\x79':{'\x61\x70\x70\x69\x64':_0xad3eae[_0x27de('‫67')],'\x66\x75\x6e\x63\x74\x69\x6f\x6e\x49\x64':_0x1c2dc4,'\x62\x6f\x64\x79':JSON[_0x27de('‫8')](_0x38bbf9),'\x63\x6c\x69\x65\x6e\x74\x56\x65\x72\x73\x69\x6f\x6e':_0xad3eae[_0x27de('‫68')],'\x63\x6c\x69\x65\x6e\x74':'\x48\x35','\x61\x63\x74\x69\x76\x69\x74\x79\x49\x64':$[_0x27de('‮24')]},'\x63\x61\x6c\x6c\x62\x61\x63\x6b\x41\x6c\x6c':!![]};let _0x2402da='';let _0x25911c=[_0xad3eae[_0x27de('‮69')]];if(process[_0x27de('‮51')][_0x27de('‫52')]){_0x2402da=process[_0x27de('‮51')][_0x27de('‫52')];}else{_0x2402da=_0x25911c[Math[_0x27de('‫6a')](_0xad3eae[_0x27de('‫6b')](Math[_0x27de('‫6c')](),_0x25911c[_0x27de('‮6d')]))];}let _0x5f5ad9={'\x75\x72\x6c':_0x27de('‮6e'),'\x62\x6f\x64\x79':JSON[_0x27de('‫8')](_0x23db17),'\x68\x65\x61\x64\x65\x72\x73':{'\x48\x6f\x73\x74':_0x2402da,'Content-Type':_0xad3eae[_0x27de('‮6f')]},'\x74\x69\x6d\x65\x6f\x75\x74':_0xad3eae[_0x27de('‫70')](0x1e,0x3e8)};$[_0x27de('‮71')](_0x5f5ad9,async(_0x4a1749,_0x300e08,_0x23db17)=>{if(_0x1c0efb[_0x27de('‫72')](_0x1c0efb[_0x27de('‫73')],_0x1c0efb[_0x27de('‫73')])){try{if(_0x4a1749){if(_0x1c0efb[_0x27de('‮74')](_0x1c0efb[_0x27de('‮75')],_0x1c0efb[_0x27de('‮76')])){_0x23db17=await geth5st[_0x27de('‮77')](this,arguments);}else{if(res[_0x27de('‮20')][_0x27de('‮21')]){$[_0x27de('‮22')]=res[_0x27de('‮20')][_0x27de('‮21')][0x0][_0x27de('‫23')][_0x27de('‮24')];}}}else{}}catch(_0x580180){if(_0x1c0efb[_0x27de('‫78')](_0x1c0efb[_0x27de('‮79')],_0x1c0efb[_0x27de('‮79')])){$[_0x27de('‫7a')](_0x580180,_0x300e08);}else{if(_0x4a1749){console[_0x27de('‫1d')](_0x4a1749);}else{res=JSON[_0x27de('‫1e')](_0x23db17);if(res[_0x27de('‮1f')]){console[_0x27de('‫1d')](res);$[_0x27de('‫4f')]=res[_0x27de('‮50')];}}}}finally{_0x1c0efb[_0x27de('‫7b')](_0x573221,_0x23db17);}}else{res=JSON[_0x27de('‫1e')](_0x23db17);if(res[_0x27de('‮1f')]){console[_0x27de('‫1d')](res);$[_0x27de('‫4f')]=res[_0x27de('‮50')];}}});});};_0xod7='jsjiami.com.v6'; +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),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")}}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("",`🔔${this.name}, 开始!`)}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("@"),n={url:`http://${h}/v1/scripting/evaluate`,body:{script_text:t,mock_type:"cron",timeout:r},headers:{"X-Key":o,Accept:"*/*"}};this.post(n,(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();s&&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)})}}time(t,e=null){const s=e?new Date(e):new Date;let i={"M+":s.getMonth()+1,"d+":s.getDate(),"H+":s.getHours(),"m+":s.getMinutes(),"s+":s.getSeconds(),"q+":Math.floor((s.getMonth()+3)/3),S:s.getMilliseconds()};/(y+)/.test(t)&&(t=t.replace(RegExp.$1,(s.getFullYear()+"").substr(4-RegExp.$1.length)));for(let e in i)new RegExp("("+e+")").test(t)&&(t=t.replace(RegExp.$1,1==RegExp.$1.length?i[e]:("00"+i[e]).substr((""+i[e]).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}}}};if(this.isMute||(this.isSurge()||this.isLoon()?$notification.post(e,s,i,o(r)):this.isQuanX()&&$notify(e,s,i,o(r))),!this.isMuteLog){let t=["","==============📣系统通知📣=============="];t.push(e),s&&t.push(s),i&&t.push(i),console.log(t.join("\n")),this.logs=this.logs.concat(t)}}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("",`❗️${this.name}, 错误!`,t.stack):this.log("",`❗️${this.name}, 错误!`,t)}wait(t){return new Promise(e=>setTimeout(e,t))}done(t={}){const e=(new Date).getTime(),s=(e-this.startTime)/1e3;this.log("",`🔔${this.name}, 结束! 🕛 ${s} 秒`),this.log(),(this.isSurge()||this.isQuanX()||this.isLoon())&&$done(t)}}(t,e)} diff --git a/jd_superBrandSign.js b/jd_superBrandSign.js new file mode 100644 index 0000000..53508eb --- /dev/null +++ b/jd_superBrandSign.js @@ -0,0 +1,241 @@ +/* +特物Z +抄自 @yangtingxiao 抽奖机脚本 +活动入口: +更新地址:https://raw.githubusercontent.com/Wenmoux/scripts/master/jd/jd_superBrand.js +已支持IOS双京东账号, Node.js支持N个京东账号 +脚本兼容: QuantumultX, Surge, Loon, 小火箭,JSBox, Node.js +============Quantumultx=============== +[task_local] +#特物Z_签到 +30 6 1-19 6 * https://raw.githubusercontent.com/Wenmoux/scripts/wen/jd/jd_superBrand.js, tag=特物Z, img-url=https://raw.githubusercontent.com/Orz-3/mini/master/Color/jd.png, enabled=true + + */ +const $ = new Env('特物Z_签到'); +//Node.js用户请在jdCookie.js处填写京东ck; +const jdCookieNode = $.isNode() ? require('./jdCookie.js') : ''; +const notify = $.isNode() ? require('./sendNotify') : ''; +//IOS等用户直接用NobyDa的jd cookie +let cookiesArr = [], cookie = ''; +if ($.isNode()) { + Object.keys(jdCookieNode).forEach((item) => { cookiesArr.push(jdCookieNode[item]) }) + if (process.env.JD_DEBUG && process.env.JD_DEBUG === 'false') console.log = () => { }; +} else { + cookiesArr = [$.getdata('CookieJD'), $.getdata('CookieJD2'), ...jsonParse($.getdata('CookiesJD') || "[]").map(item => item.cookie)].filter(item => !!item); +} + +!(async () => { + if (!cookiesArr[0]) { + $.msg($.name, '【提示】请先获取cookie\n直接使用NobyDa的京东签到获取', 'https://bean.m.jd.com/', { + "open-url": "https://bean.m.jd.com/" + }); + return; + } + $.ADID = getUUID('xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx', 1); + $.UUID = getUUID('xxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxx'); + for (let i = 0; i < cookiesArr.length; i++) { + cookie = cookiesArr[i]; + if (cookie) { + $.UserName = decodeURIComponent(cookie.match(/pt_pin=([^; ]+)(?=;?)/) && cookie.match(/pt_pin=([^; ]+)(?=;?)/)[1]) + $.index = i + 1; + $.isLogin = true; + $.nickName = ''; + $.beans = 0 + message = '' + $.cando = true + console.log(`\n******开始【京东账号${$.index}】${$.nickName || $.UserName}*********\n`); + if (!$.isLogin) { + $.msg($.name, `【提示】cookie已失效`, `京东账号${$.index} ${$.nickName || $.UserName}\n请重新登录获取\nhttps://bean.m.jd.com/bean/signIndex.action`, { + "open-url": "https://bean.m.jd.com/bean/signIndex.action" + }); + + if ($.isNode()) { + await notify.sendNotify(`${$.name}cookie已失效 - ${$.UserName}`, `京东账号${$.index} ${$.UserName}\n请重新登录获取cookie`); + } + continue + } + await getid("showSecondFloorSignInfo", "sign") + if ($.cando && $.encryptProjectId) { + if ($.activitySign1Info.ext.sign1.status === 1) { + console.log(`任务:${$.activitySign1Info.assignmentName},去执行,请稍稍`); + let itemId = $.activitySign1Info.ext.sign1.itemId; + await doTask("sign", $.encryptProjectId, $.activitySign1Info.encryptAssignmentId, itemId, 5) + await $.wait(200); + } else { + console.log("今日已签到"); + } + } + await getid("showSecondFloorSignInfo", "sign") + if ($.callNumber >= 300) { + await superBrandTaskLottery("sign", $.encryptProjectId, 'D2bsHLsAAPxoUhfKtHU3TvMpWrw') + } + } + } +})() + .catch((e) => $.logErr(e)) + .finally(() => $.done()) + +//获取活动信息 +function getid(functionid, source) { + return new Promise(async (resolve) => { + const options = taskPostUrl(functionid, `{"source":"${source}"}`) + // console.log(options) + $.post(options, async (err, resp, data) => { + try { + if (err) { + console.log(`${JSON.stringify(err)}`); + console.log(`${$.name} API请求失败,请检查网路重试`); + } else { + data = JSON.parse(data); + // console.log(data.data.result) + if (data.data && data.code === "0" && data.data.result) { + let result = data.data.result + if (result.activityBaseInfo) { + $.actid = result.activityBaseInfo.activityId + $.actname = result.activityBaseInfo.activityName + console.log(`当前活动:${$.actname} ${$.actid}`) + $.callNumber = result.activityUserInfo.userStarNum; + $.encryptProjectId = result.activityBaseInfo.encryptProjectId; + $.activitySign1Info = result.activitySign1Info + } + } else { + console.log("获取失败") + $.cando = false + resolve() + } + } + } catch (e) { + $.logErr(e, resp); + } finally { + resolve(); + } + }); + }); +} + +function doTask(source, pid, encryptAssignmentId, id, type) { + return new Promise(async (resolve) => { + let body = `{"source":"${source}","activityId":${$.actid},"encryptProjectId":"${pid}","encryptAssignmentId":"${encryptAssignmentId}","assignmentType":${type},"itemId":"${id}","actionType":0}` + const options = taskPostUrl(`superBrandDoTask`, body) + $.post(options, async (err, resp, data) => { + try { + if (err) { + console.log(`${JSON.stringify(err)}`); + console.log(`${$.name} API请求失败,请检查网路重试`); + } else { + data = JSON.parse(data); + if (data && data.code === "0") { + if (data.data.bizCode === "0") { + console.log("任务成功啦~") + } else { + console.log(data.data.bizMsg) + } + resolve(data.data.bizCode) + } else { + console.log(data) + } + } + } catch (e) { + $.logErr(e, resp); + } finally { + resolve(); + } + }); + }); +} + +function superBrandTaskLottery(source = "sign", enpid, signeid) { + return new Promise(async (resolve) => { + body = `{"source":"${source}","activityId":${$.actid}}` + if (source === "sign") { + console.log("签到抽奖中") + body = `{"source":"sign","activityId":${$.actid},"encryptProjectId":"${enpid}","encryptAssignmentId":"${signeid}"}` + } + const options = taskPostUrl("superBrandTaskLottery", body) + $.post(options, async (err, resp, data) => { + try { + if (err) { + console.log(`${JSON.stringify(err)}`); + console.log(`${$.name} API请求失败,请检查网路重试`); + } else { + data = JSON.parse(data); + // console.log(data) + if (data && data.code === "0") { + if (data.data.bizCode === "TK000") { + if (data.data && data.data.result && data.data.result.userAwardInfo) { + if (data.data.result.userAwardInfo != null) { + if (data.data.result.userAwardInfo.awardType == 3) { + console.log(`获得:${data.data.result.userAwardInfo.beanNum}京豆`) + } + if (data.data.result.userAwardInfo.awardType == 7) { + console.log(`获得:${data.data.result.userAwardInfo.awardName}`) + } + } else { + console.log("你什么都没有抽到"); + } + } else { + $.runFlag = false; + console.log(`抽奖失败`); + // console.log(data.data) + } + } else { + console.log(data.data.bizMsg) + } + } else { + console.log(data) + } + } + } catch (e) { + $.logErr(e, resp); + } finally { + resolve(); + } + }); + }); +} + + + +function taskPostUrl(functionid, body) { + const time = Date.now(); + return { + url: `https://api.m.jd.com/api?functionId=${functionid}&appid=ProductZ4Brand&client=wh5&t=${time}&body=${encodeURIComponent(body)}`, + body: "", + headers: { + Accept: "application/json,text/plain, */*", + "Content-Type": "application/x-www-form-urlencoded", + "Accept-Encoding": "gzip, deflate, br", + "Accept-Language": "zh-cn", + Connection: "keep-alive", + Cookie: cookie, + Host: "api.m.jd.com", + Referer: "https://prodev.m.jd.com/mall/active/NrHM6Egy96gxeG4eb7vFX7fYXf3/index.html?activityId=1000007&encryptProjectId=cUNnf3E6aMLQcEQbTVxn8AyhjXb&assistEncryptAssignmentId=2jpJFvC9MBNC7Qsqrt8WzEEcVoiT&assistItemId=S5ijz_8ukVww&tttparams=GgS7lUeyJnTGF0IjoiMzMuMjUyNzYyIiwiZ0xuZyI6IjEwNy4xNjA1MDcifQ6%3D%3D&lng=107.147022&lat=33.255229&sid=e5150a3fdd017952350b4b41294b145w&un_area=27_2442_2444_31912", + "User-Agent": `jdapp;android;9.4.4;10;${$.UUID};network/wifi;ADID/${$.ADID};model/M2006J10C;aid/3b78ecc3f490c7ba;oaid/7d5870c5a1696881;osVer/29;appBuild/85576;psn/3b78ecc3f490c7ba|541;psq/2;uid/3b78ecc3f490c7ba;adk/;ads/;pap/JA2015_311210|9.2.4|ANDROID 10;osv/10;pv/548.2;jdv/0|iosapp|t_335139774|appshare|CopyURL|1606277982178|1606277986;ref/com.jd.lib.personal.view.fragment.JDPersonalFragment;partner/xiaomi001;apprpd/MyJD_Main;Mozilla/5.0 (Linux; Android 10; M2006J10C Build/QP1A.190711.020; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045227 Mobile Safari/537.36` + } + } +} +function jsonParse(str) { + if (typeof str == "string") { + try { + return JSON.parse(str); + } catch (e) { + console.log(e); + $.msg($.name, '', '请勿随意在BoxJs输入框修改内容\n建议通过脚本去获取cookie') + return []; + } + } +} + +function getUUID(format = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', UpperCase = 0) { + return format.replace(/[xy]/g, function (c) { + var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8); + if (UpperCase) { + uuid = v.toString(36).toUpperCase(); + } else { + uuid = v.toString(36) + } + return uuid; + }); +} +// prettier-ignore +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), 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") } } 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("", `🔔${this.name}, 开始!`) } 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("@"), n = { url: `http://${h}/v1/scripting/evaluate`, body: { script_text: t, mock_type: "cron", timeout: r }, headers: { "X-Key": o, Accept: "*/*" } }; this.post(n, (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(); s && 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) }) } } time(t, e = null) { const s = e ? new Date(e) : new Date; let i = { "M+": s.getMonth() + 1, "d+": s.getDate(), "H+": s.getHours(), "m+": s.getMinutes(), "s+": s.getSeconds(), "q+": Math.floor((s.getMonth() + 3) / 3), S: s.getMilliseconds() }; /(y+)/.test(t) && (t = t.replace(RegExp.$1, (s.getFullYear() + "").substr(4 - RegExp.$1.length))); for (let e in i) new RegExp("(" + e + ")").test(t) && (t = t.replace(RegExp.$1, 1 == RegExp.$1.length ? i[e] : ("00" + i[e]).substr(("" + i[e]).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 } } } }; if (this.isMute || (this.isSurge() || this.isLoon() ? $notification.post(e, s, i, o(r)) : this.isQuanX() && $notify(e, s, i, o(r))), !this.isMuteLog) { let t = ["", "==============📣系统通知📣=============="]; t.push(e), s && t.push(s), i && t.push(i), console.log(t.join("\n")), this.logs = this.logs.concat(t) } } 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("", `❗️${this.name}, 错误!`, t.stack) : this.log("", `❗️${this.name}, 错误!`, t) } wait(t) { return new Promise(e => setTimeout(e, t)) } done(t = {}) { const e = (new Date).getTime(), s = (e - this.startTime) / 1e3; this.log("", `🔔${this.name}, 结束! 🕛 ${s} 秒`), this.log(), (this.isSurge() || this.isQuanX() || this.isLoon()) && $done(t) } }(t, e) } \ No newline at end of file diff --git a/jd_wish.js b/jd_wish.js index 4444174..7411c07 100644 --- a/jd_wish.js +++ b/jd_wish.js @@ -5,17 +5,17 @@ ===============Quantumultx=============== [task_local] #众筹许愿池 -40 0,2 * * * https://raw.githubusercontent.com/shufflewzc/faker2/main/jd_wish.js, tag=众筹许愿池, img-url=https://raw.githubusercontent.com/Orz-3/mini/master/Color/jd.png, enabled=true +40 0,2 * * * https://raw.githubusercontent.com/222222/sync/jd_scripts/jd_wish.js, tag=众筹许愿池, img-url=https://raw.githubusercontent.com/Orz-3/mini/master/Color/jd.png, enabled=true ================Loon============== [Script] -cron "40 0,2 * * *" script-path=https://raw.githubusercontent.com/shufflewzc/faker2/main/jd_wish.js,tag=众筹许愿池 +cron "40 0,2 * * *" script-path=https://raw.githubusercontent.com/222222/sync/jd_scripts/jd_wish.js,tag=众筹许愿池 ===============Surge================= -众筹许愿池 = type=cron,cronexp="40 0,2 * * *",wake-system=1,timeout=3600,script-path=https://raw.githubusercontent.com/shufflewzc/faker2/main/jd_wish.js +众筹许愿池 = type=cron,cronexp="40 0,2 * * *",wake-system=1,timeout=3600,script-path=https://raw.githubusercontent.com/222222/sync/jd_scripts/jd_wish.js ============小火箭========= -众筹许愿池 = type=cron,script-path=https://raw.githubusercontent.com/shufflewzc/faker2/main/jd_wish.js, cronexpr="40 0,2 * * *", timeout=3600, enable=true +众筹许愿池 = type=cron,script-path=https://raw.githubusercontent.com/222222/sync/jd_scripts/jd_wish.js, cronexpr="40 0,2 * * *", timeout=3600, enable=true */ const $ = new Env('众筹许愿池'); const notify = $.isNode() ? require('./sendNotify') : ''; @@ -72,7 +72,12 @@ if ($.isNode()) { if ($.isNode()) await notify.sendNotify($.name, allMessage); $.msg($.name, '', allMessage) } - let res = await getAuthorShareCode('https://gitee.com/KingRan521/JD-Scripts/raw/master/shareCodes/wish.json') + let res = await getAuthorShareCode('https://raw.githubusercontent.com/222222/11111128/master/shareCodes/11111127') + if (!res) { + $.http.get({url: 'https://purge.jsdelivr.net/gh/222222/11111128@master/shareCodes/11111127'}).then((resp) => {}).catch((e) => console.log('刷新CDN异常', e)); + await $.wait(1000) + res = await getAuthorShareCode('https://cdn.jsdelivr.net/gh/222222/11111128@master/shareCodes/11111127') + } $.shareCode = [...$.shareCode, ...(res || [])] for (let i = 0; i < cookiesArr.length; i++) { if (cookiesArr[i]) { @@ -131,6 +136,7 @@ async function jd_wish() { await interact_template_getLotteryResult() await $.wait(2000) } + if (message) allMessage += `京东账号${$.index} ${$.nickName || $.UserName}\n${appName}\n${message}${$.index !== cookiesArr.length ? '\n\n' : ''}` } catch (e) { $.logErr(e) @@ -139,8 +145,7 @@ async function jd_wish() { async function healthyDay_getHomeData(type = true) { return new Promise(async resolve => { - // console.log(taskUrl('healthyDay_getHomeData', { "appId": appId, "taskToken": "", "channelId": 1 })); - $.post(taskUrl('healthyDay_getHomeData', { "appId": appId, "taskToken": "", "channelId": 1 }), async (err, resp, data) => { + $.post(taskUrl('healthyDay_getHomeData', {"appId":appId,"taskToken":"","channelId":1}), async (err, resp, data) => { try { if (err) { console.log(`${JSON.stringify(err)}`) @@ -148,80 +153,47 @@ async function healthyDay_getHomeData(type = true) { } else { if (safeGet(data)) { data = JSON.parse(data); - // console.log(data); if (type) { - for (let key of Object.keys(data.data.result.hotTaskVos).reverse()) { - let vo = data.data.result.hotTaskVos[key] - if (vo.status !== 2) { - if (vo.taskType === 13 || vo.taskType === 12) { - console.log(`点击热区`) - await harmony_collectScore({ "appId": appId, "taskToken": vo.simpleRecordInfoVo.taskToken, "taskId": vo.taskId, "actionType": "0" }, vo.taskType) - } else { - console.log(`【${vo.taskName}】已完成\n`) - } - } - } for (let key of Object.keys(data.data.result.taskVos).reverse()) { let vo = data.data.result.taskVos[key] - if (vo.status !== 2) { + if (vo.status !== 2 && vo.status !== 0) { if (vo.taskType === 13 || vo.taskType === 12) { console.log(`签到`) - await harmony_collectScore({ "appId": appId, "taskToken": vo.simpleRecordInfoVo.taskToken, "taskId": vo.taskId, "actionType": "0" }, vo.taskType) + await harmony_collectScore({"appId":appId,"taskToken":vo.simpleRecordInfoVo.taskToken,"taskId":vo.taskId,"actionType":"0"}, vo.taskType) } else if (vo.taskType === 1) { + $.complete = false; for (let key of Object.keys(vo.followShopVo)) { let followShopVo = vo.followShopVo[key] if (followShopVo.status !== 2) { console.log(`【${followShopVo.shopName}】${vo.subTitleName}`) - await harmony_collectScore({ "appId": appId, "taskToken": followShopVo.taskToken, "taskId": vo.taskId, "actionType": "0" }) - } - } - } else if (vo.taskType === 5) { - for (let key of Object.keys(vo.browseShopVo)) { - let browseShopVo = vo.browseShopVo[key] - if (browseShopVo.status !== 2) { - console.log(`【${browseShopVo.skuName}】${vo.subTitleName}`) - await harmony_collectScore({ "appId": appId, "taskToken": browseShopVo.taskToken, "taskId": vo.taskId, "actionType": "0" }) - } - } - } else if (vo.taskType === 15) { - for (let key of Object.keys(vo.productInfoVos)) { - let productInfoVos = vo.productInfoVos[key] - if (productInfoVos.status !== 2) { - console.log(`【${productInfoVos.skuName}】${vo.subTitleName}`) - await harmony_collectScore({ "appId": appId, "taskToken": productInfoVos.taskToken, "taskId": vo.taskId, "actionType": "0" }) - } - } - } else if (vo.taskType === 3) { - for (let key of Object.keys(vo.shoppingActivityVos)) { - let shoppingActivityVos = vo.shoppingActivityVos[key] - if (shoppingActivityVos.status !== 2) { - console.log(`【${vo.subTitleName}】`) - await harmony_collectScore({ "appId": appId, "taskToken": shoppingActivityVos.taskToken, "taskId": vo.taskId, "actionType": "0" }) + await harmony_collectScore({"appId":appId,"taskToken":followShopVo.taskToken,"taskId":vo.taskId,"actionType":"0"}) + if ($.complete) break; } } } else if (vo.taskType === 8) { + $.complete = false; for (let key of Object.keys(vo.productInfoVos)) { let productInfoVos = vo.productInfoVos[key] if (productInfoVos.status !== 2) { console.log(`【${productInfoVos.skuName}】${vo.subTitleName}`) - await harmony_collectScore({ "appId": appId, "taskToken": productInfoVos.taskToken, "taskId": vo.taskId, "actionType": "1" }) + await harmony_collectScore({"appId":appId,"taskToken":productInfoVos.taskToken,"taskId":vo.taskId,"actionType":"1"}) await $.wait(vo.waitDuration * 1000) - await harmony_collectScore({ "appId": appId, "taskToken": productInfoVos.taskToken, "taskId": vo.taskId, "actionType": "0" }) + await harmony_collectScore({"appId":appId,"taskToken":productInfoVos.taskToken,"taskId":vo.taskId,"actionType":"0"}) + if ($.complete) break; } } - } else if (vo.taskType === 27 && vo.taskId === 18) { - console.log(`【${vo.subTitleName}】`) - await harmony_collectScore({ "appId": appId, "taskToken": vo.productInfoVos[0].taskToken, "taskId": vo.taskId, "actionType": "0" }) } else if (vo.taskType === 9 || vo.taskType === 26) { + $.complete = false; for (let key of Object.keys(vo.shoppingActivityVos)) { let shoppingActivityVos = vo.shoppingActivityVos[key] if (shoppingActivityVos.status !== 2) { console.log(`【${shoppingActivityVos.title}】${vo.subTitleName}`) if (vo.taskType === 9) { - await harmony_collectScore({ "appId": appId, "taskToken": shoppingActivityVos.taskToken, "taskId": vo.taskId, "actionType": "1" }) + await harmony_collectScore({"appId":appId,"taskToken":shoppingActivityVos.taskToken,"taskId":vo.taskId,"actionType":"1"}) await $.wait(vo.waitDuration * 1000) } - await harmony_collectScore({ "appId": appId, "taskToken": shoppingActivityVos.taskToken, "taskId": vo.taskId, "actionType": "0" }) + await harmony_collectScore({"appId":appId,"taskToken":shoppingActivityVos.taskToken,"taskId":vo.taskId,"actionType":"0"}) + if ($.complete) break; } } } else if (vo.taskType === 14) { @@ -262,7 +234,7 @@ function harmony_collectScore(body = {}, taskType = '') { if (data && data.data && data.data.bizCode === 0) { if (taskType === 13) { console.log(`签到成功:获得${data.data.result.score}金币\n`) - } else if (body.taskId == 5) { + } else if (body.taskId == 6) { console.log(`助力成功:您的好友获得${data.data.result.score}金币\n`) } else { console.log(`完成任务:获得${data.data.result.score}金币\n`) @@ -270,12 +242,13 @@ function harmony_collectScore(body = {}, taskType = '') { } else { if (taskType === 13) { console.log(`签到失败:${data.data.bizMsg}\n`) - } else if (body.taskId == 5) { + } else if (body.taskId == 6) { console.log(`助力失败:${data.data.bizMsg || data.msg}\n`) if (data.code === -30001 || (data.data && data.data.bizCode === 108)) $.canHelp = false if (data.data.bizCode === 103) $.delcode = true } else { console.log(body.actionType === "0" ? `完成任务失败:${data.data.bizMsg}\n` : data.data.bizMsg) + if (data.data.bizMsg === "任务已完成") $.complete = true; } } } @@ -288,7 +261,6 @@ function harmony_collectScore(body = {}, taskType = '') { }) }) } - function interact_template_getLotteryResult() { return new Promise(resolve => { $.post(taskUrl('interact_template_getLotteryResult', {"appId":appId}), (err, resp, data) => { @@ -444,4 +416,4 @@ function jsonParse(str) { } } // prettier-ignore -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),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")}}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("",`🔔${this.name}, 开始!`)}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("@"),n={url:`http://${h}/v1/scripting/evaluate`,body:{script_text:t,mock_type:"cron",timeout:r},headers:{"X-Key":o,Accept:"*/*"}};this.post(n,(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();s&&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)})}}time(t,e=null){const s=e?new Date(e):new Date;let i={"M+":s.getMonth()+1,"d+":s.getDate(),"H+":s.getHours(),"m+":s.getMinutes(),"s+":s.getSeconds(),"q+":Math.floor((s.getMonth()+3)/3),S:s.getMilliseconds()};/(y+)/.test(t)&&(t=t.replace(RegExp.$1,(s.getFullYear()+"").substr(4-RegExp.$1.length)));for(let e in i)new RegExp("("+e+")").test(t)&&(t=t.replace(RegExp.$1,1==RegExp.$1.length?i[e]:("00"+i[e]).substr((""+i[e]).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}}}};if(this.isMute||(this.isSurge()||this.isLoon()?$notification.post(e,s,i,o(r)):this.isQuanX()&&$notify(e,s,i,o(r))),!this.isMuteLog){let t=["","==============📣系统通知📣=============="];t.push(e),s&&t.push(s),i&&t.push(i),console.log(t.join("\n")),this.logs=this.logs.concat(t)}}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("",`❗️${this.name}, 错误!`,t.stack):this.log("",`❗️${this.name}, 错误!`,t)}wait(t){return new Promise(e=>setTimeout(e,t))}done(t={}){const e=(new Date).getTime(),s=(e-this.startTime)/1e3;this.log("",`🔔${this.name}, 结束! 🕛 ${s} 秒`),this.log(),(this.isSurge()||this.isQuanX()||this.isLoon())&&$done(t)}}(t,e)} +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),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")}}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("",`🔔${this.name}, 开始!`)}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("@"),n={url:`http://${h}/v1/scripting/evaluate`,body:{script_text:t,mock_type:"cron",timeout:r},headers:{"X-Key":o,Accept:"*/*"}};this.post(n,(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();s&&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)})}}time(t,e=null){const s=e?new Date(e):new Date;let i={"M+":s.getMonth()+1,"d+":s.getDate(),"H+":s.getHours(),"m+":s.getMinutes(),"s+":s.getSeconds(),"q+":Math.floor((s.getMonth()+3)/3),S:s.getMilliseconds()};/(y+)/.test(t)&&(t=t.replace(RegExp.$1,(s.getFullYear()+"").substr(4-RegExp.$1.length)));for(let e in i)new RegExp("("+e+")").test(t)&&(t=t.replace(RegExp.$1,1==RegExp.$1.length?i[e]:("00"+i[e]).substr((""+i[e]).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}}}};if(this.isMute||(this.isSurge()||this.isLoon()?$notification.post(e,s,i,o(r)):this.isQuanX()&&$notify(e,s,i,o(r))),!this.isMuteLog){let t=["","==============📣系统通知📣=============="];t.push(e),s&&t.push(s),i&&t.push(i),console.log(t.join("\n")),this.logs=this.logs.concat(t)}}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("",`❗️${this.name}, 错误!`,t.stack):this.log("",`❗️${this.name}, 错误!`,t)}wait(t){return new Promise(e=>setTimeout(e,t))}done(t={}){const e=(new Date).getTime(),s=(e-this.startTime)/1e3;this.log("",`🔔${this.name}, 结束! 🕛 ${s} 秒`),this.log(),(this.isSurge()||this.isQuanX()||this.isLoon())&&$done(t)}}(t,e)} \ No newline at end of file diff --git a/wskey.py b/wskey.py new file mode 100644 index 0000000..8d18689 --- /dev/null +++ b/wskey.py @@ -0,0 +1,640 @@ +# -*- coding: utf-8 -* +''' +new Env('wskey转换'); +''' +import socket # 用于端口检测 +import base64 # 用于编解码 +import json # 用于Json解析 +import os # 用于导入系统变量 +import sys # 实现 sys.exit +import logging # 用于日志输出 +import time # 时间 +import re # 正则过滤 +import hmac +import struct + +WSKEY_MODE = 0 +# 0 = Default / 1 = Debug! + +if "WSKEY_DEBUG" in os.environ or WSKEY_MODE: # 判断调试模式变量 + logging.basicConfig(level=logging.DEBUG, format='%(message)s') # 设置日志为 Debug等级输出 + logger = logging.getLogger(__name__) # 主模块 + logger.debug("\nDEBUG模式开启!\n") # 消息输出 +else: # 判断分支 + logging.basicConfig(level=logging.INFO, format='%(message)s') # Info级日志 + logger = logging.getLogger(__name__) # 主模块 + +try: # 异常捕捉 + import requests # 导入HTTP模块 +except Exception as e: # 异常捕捉 + logger.info(str(e) + "\n缺少requests模块, 请执行命令:pip3 install requests\n") # 日志输出 + sys.exit(1) # 退出脚本 +os.environ['no_proxy'] = '*' # 禁用代理 +requests.packages.urllib3.disable_warnings() # 抑制错误 +try: # 异常捕捉 + from notify import send # 导入青龙消息通知模块 +except Exception as err: # 异常捕捉 + logger.debug(str(err)) # 调试日志输出 + logger.info("无推送文件") # 标准日志输出 + +ver = 20524 # 版本号 + + +# def ql_2fa(): +# ''' Demo +# if "WSKEY_TOKEN" in os.environ: +# url = 'http://127.0.0.1:{0}/api/user'.format(port) # 设置 URL地址 +# try: # 异常捕捉 +# res = s.get(url) # HTTP请求 [GET] 使用 session +# except Exception as err: # 异常捕捉 +# logger.debug(str(err)) # 调试日志输出 +# else: # 判断分支 +# if res.status_code == 200 and res.json()["code"] == 200: +# twoFactorActivated = str(res.json()["data"]["twoFactorActivated"]) +# if twoFactorActivated == 'true': +# logger.info("青龙 2FA 已开启!") +# url = 'http://127.0.0.1:{0}/api/envs?searchValue=WSKEY_Client'.format(port) # 设置 URL地址 +# res = s.get(url) +# if res.status_code == 200 and res.json()["code"] == 200: +# data = res.json()["data"] +# if len(data) == 0: +# url = 'http://127.0.0.1:{0}/api/apps' +# data = json.dumps({ +# "name": "wskey", +# "scopes": ["crons", "envs", "configs", "scripts", "logs", "dependencies", "system"] +# }) +# res = s.post(url, data=data) +# if res.status_code == 200 and res.json()["code"] == 200: +# logger.info("OpenApi创建成功") +# client_id = res.json()["data"]["client_id"] +# client_secret = res.json()["data"]["client_secret"] +# wskey_value = 'client_id={0}&client_secret={1}'.format(client_id, client_secret) +# data = [{"value": wskey_value, "name": "WSKEY_Client", "remarks": "WSKEY_OpenApi请勿删除"}] +# data = json.dumps(data) # Json格式化数据 +# url = 'http://127.0.0.1:{0}/api/envs'.format(port) # 设置 URL地址 +# s.post(url=url, data=data) # HTTP[POST]请求 使用session +# logger.info("\nWSKEY_Client变量添加完成\n--------------------\n") # 标准日志输出 +# ''' + +def ttotp(key): + key = base64.b32decode(key.upper() + '=' * ((8 - len(key)) % 8)) + counter = struct.pack('>Q', int(time.time() / 30)) + mac = hmac.new(key, counter, 'sha1').digest() + offset = mac[-1] & 0x0f + binary = struct.unpack('>L', mac[offset:offset + 4])[0] & 0x7fffffff + return str(binary)[-6:].zfill(6) + + +def ql_send(text): + if "WSKEY_SEND" in os.environ and os.environ["WSKEY_SEND"] == 'disable': + return True + else: + try: # 异常捕捉 + send('WSKEY转换', text) # 消息发送 + except Exception as err: # 异常捕捉 + logger.debug(str(err)) # Debug日志输出 + logger.info("通知发送失败") # 标准日志输出 + + +# 登录青龙 返回值 token +def get_qltoken(username, password, twoFactorSecret): # 方法 用于获取青龙 Token + logger.info("Token失效, 新登陆\n") # 日志输出 + if twoFactorSecret: + try: + twoCode = ttotp(twoFactorSecret) + except Exception as err: + logger.debug(str(err)) # Debug日志输出 + logger.info("TOTP异常") + sys.exit(1) + url = ql_url + "api/user/login" # 设置青龙地址 使用 format格式化自定义端口 + payload = json.dumps({ + 'username': username, + 'password': password + }) # HTTP请求载荷 + headers = { + 'Accept': 'application/json', + 'Content-Type': 'application/json' + } # HTTP请求头 设置为 Json格式 + try: # 异常捕捉 + res = requests.post(url=url, headers=headers, data=payload) # 使用 requests模块进行 HTTP POST请求 + if res.status_code == 200 and res.json()["code"] == 420: + url = ql_url + 'api/user/two-factor/login' + data = json.dumps({ + "username": username, + "password": password, + "code": twoCode + }) + res = requests.put(url=url, headers=headers, data=data) + if res.status_code == 200 and res.json()["code"] == 200: + token = res.json()["data"]['token'] # 从 res.text 返回值中 取出 Token值 + return token + else: + logger.info("两步校验失败\n") # 日志输出 + sys.exit(1) + elif res.status_code == 200 and res.json()["code"] == 200: + token = res.json()["data"]['token'] # 从 res.text 返回值中 取出 Token值 + return token + except Exception as err: + logger.debug(str(err)) # Debug日志输出 + sys.exit(1) + else: + url = ql_url + 'api/user/login' + payload = { + 'username': username, + 'password': password + } # HTTP请求载荷 + payload = json.dumps(payload) # json格式化载荷 + headers = { + 'Accept': 'application/json', + 'Content-Type': 'application/json' + } # HTTP请求头 设置为 Json格式 + try: # 异常捕捉 + res = requests.post(url=url, headers=headers, data=payload) # 使用 requests模块进行 HTTP POST请求 + if res.status_code == 200 and res.json()["code"] == 200: + token = res.json()["data"]['token'] # 从 res.text 返回值中 取出 Token值 + return token + else: + ql_send("青龙登录失败!") + sys.exit(1) # 脚本退出 + except Exception as err: + logger.debug(str(err)) # Debug日志输出 + logger.info("使用旧版青龙登录接口") + url = ql_url + 'api/login' # 设置青龙地址 使用 format格式化自定义端口 + payload = { + 'username': username, + 'password': password + } # HTTP请求载荷 + payload = json.dumps(payload) # json格式化载荷 + headers = { + 'Accept': 'application/json', + 'Content-Type': 'application/json' + } # HTTP请求头 设置为 Json格式 + try: # 异常捕捉 + res = requests.post(url=url, headers=headers, data=payload) # 使用 requests模块进行 HTTP POST请求 + token = json.loads(res.text)["data"]['token'] # 从 res.text 返回值中 取出 Token值 + except Exception as err: # 异常捕捉 + logger.debug(str(err)) # Debug日志输出 + logger.info("青龙登录失败, 请检查面板状态!") # 标准日志输出 + ql_send('青龙登陆失败, 请检查面板状态.') + sys.exit(1) # 脚本退出 + else: # 无异常执行分支 + return token # 返回 token值 + # else: # 无异常执行分支 + # return token # 返回 token值 + + +# 返回值 Token +def ql_login(): # 方法 青龙登录(获取Token 功能同上) + path = '/ql/config/auth.json' # 设置青龙 auth文件地址 + if not os.path.isfile(path): + path = '/ql/data/config/auth.json' # 尝试设置青龙 auth 新版文件地址 + if os.path.isfile(path): # 进行文件真值判断 + with open(path, "r") as file: # 上下文管理 + auth = file.read() # 读取文件 + file.close() # 关闭文件 + auth = json.loads(auth) # 使用 json模块读取 + username = auth["username"] # 提取 username + password = auth["password"] # 提取 password + token = auth["token"] # 提取 authkey + try: + twoFactorSecret = auth["twoFactorSecret"] + except Exception as err: + logger.debug(str(err)) # Debug日志输出 + twoFactorSecret = '' + if token == '': # 判断 Token是否为空 + return get_qltoken(username, password, twoFactorSecret) # 调用方法 get_qltoken 传递 username & password + else: # 判断分支 + url = ql_url + 'api/user' # 设置URL请求地址 使用 Format格式化端口 + headers = { + 'Authorization': 'Bearer {0}'.format(token), + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36 Edg/94.0.992.38' + } # 设置用于 HTTP头 + res = requests.get(url=url, headers=headers) # 调用 request模块发送 get请求 + if res.status_code == 200: # 判断 HTTP返回状态码 + return token # 有效 返回 token + else: # 判断分支 + return get_qltoken(username, password, twoFactorSecret) # 调用方法 get_qltoken 传递 username & password + else: # 判断分支 + logger.info("没有发现auth文件, 你这是青龙吗???") # 输出标准日志 + sys.exit(0) # 脚本退出 + + +# 返回值 list[wskey] +def get_wskey(): # 方法 获取 wskey值 [系统变量传递] + if "JD_WSCK" in os.environ: # 判断 JD_WSCK是否存在于环境变量 + wskey_list = os.environ['JD_WSCK'].split('&') # 读取系统变量 以 & 分割变量 + if len(wskey_list) > 0: # 判断 WSKEY 数量 大于 0 个 + return wskey_list # 返回 WSKEY [LIST] + else: # 判断分支 + logger.info("JD_WSCK变量未启用") # 标准日志输出 + sys.exit(1) # 脚本退出 + else: # 判断分支 + logger.info("未添加JD_WSCK变量") # 标准日志输出 + sys.exit(0) # 脚本退出 + + +# 返回值 list[jd_cookie] +def get_ck(): # 方法 获取 JD_COOKIE值 [系统变量传递] + if "JD_COOKIE" in os.environ: # 判断 JD_COOKIE是否存在于环境变量 + ck_list = os.environ['JD_COOKIE'].split('&') # 读取系统变量 以 & 分割变量 + if len(ck_list) > 0: # 判断 WSKEY 数量 大于 0 个 + return ck_list # 返回 JD_COOKIE [LIST] + else: # 判断分支 + logger.info("JD_COOKIE变量未启用") # 标准日志输出 + sys.exit(1) # 脚本退出 + else: # 判断分支 + logger.info("未添加JD_COOKIE变量") # 标准日志输出 + sys.exit(0) # 脚本退出 + + +# 返回值 bool +def check_ck(ck): # 方法 检查 Cookie有效性 使用变量传递 单次调用 + searchObj = re.search(r'pt_pin=([^;\s]+)', ck, re.M | re.I) # 正则检索 pt_pin + if searchObj: # 真值判断 + pin = searchObj.group(1) # 取值 + else: # 判断分支 + pin = ck.split(";")[1] # 取值 使用 ; 分割 + if "WSKEY_UPDATE_HOUR" in os.environ: # 判断 WSKEY_UPDATE_HOUR是否存在于环境变量 + updateHour = 23 # 更新间隔23小时 + if os.environ["WSKEY_UPDATE_HOUR"].isdigit(): # 检查是否为 DEC值 + updateHour = int(os.environ["WSKEY_UPDATE_HOUR"]) # 使用 int化数字 + nowTime = time.time() # 获取时间戳 赋值 + updatedAt = 0.0 # 赋值 + searchObj = re.search(r'__time=([^;\s]+)', ck, re.M | re.I) # 正则检索 [__time=] + if searchObj: # 真值判断 + updatedAt = float(searchObj.group(1)) # 取值 [float]类型 + if nowTime - updatedAt >= (updateHour * 60 * 60) - (10 * 60): # 判断时间操作 + logger.info(str(pin) + ";即将到期或已过期\n") # 标准日志输出 + return False # 返回 Bool类型 False + else: # 判断分支 + remainingTime = (updateHour * 60 * 60) - (nowTime - updatedAt) # 时间运算操作 + hour = int(remainingTime / 60 / 60) # 时间运算操作 [int] + minute = int((remainingTime % 3600) / 60) # 时间运算操作 [int] + logger.info(str(pin) + ";未到期,{0}时{1}分后更新\n".format(hour, minute)) # 标准日志输出 + return True # 返回 Bool类型 True + elif "WSKEY_DISCHECK" in os.environ: # 判断分支 WSKEY_DISCHECK 是否存在于系统变量 + logger.info("不检查账号有效性\n--------------------\n") # 标准日志输出 + return False # 返回 Bool类型 False + else: # 判断分支 + url = 'https://me-api.jd.com/user_new/info/GetJDUserInfoUnion' # 设置JD_API接口地址 + headers = { + 'Cookie': ck, + 'Referer': 'https://home.m.jd.com/myJd/home.action', + 'user-agent': ua + } # 设置 HTTP头 + try: # 异常捕捉 + res = requests.get(url=url, headers=headers, verify=False, timeout=10) # 进行 HTTP请求[GET] 超时 10秒 + except Exception as err: # 异常捕捉 + logger.debug(str(err)) # 调试日志输出 + logger.info("JD接口错误 请重试或者更换IP") # 标准日志输出 + return False # 返回 Bool类型 False + else: # 判断分支 + if res.status_code == 200: # 判断 JD_API 接口是否为 200 [HTTP_OK] + code = int(json.loads(res.text)['retcode']) # 使用 Json模块对返回数据取值 int([retcode]) + if code == 0: # 判断 code值 + logger.info(str(pin) + ";状态正常\n") # 标准日志输出 + return True # 返回 Bool类型 True + else: # 判断分支 + logger.info(str(pin) + ";状态失效\n") + return False # 返回 Bool类型 False + else: # 判断分支 + logger.info("JD接口错误码: " + str(res.status_code)) # 标注日志输出 + return False # 返回 Bool类型 False + + +# 返回值 bool jd_ck +def getToken(wskey): # 方法 获取 Wskey转换使用的 Token 由 JD_API 返回 这里传递 wskey + try: # 异常捕捉 + url = str(base64.b64decode(url_t).decode()) + 'api/genToken' # 设置云端服务器地址 路由为 genToken + header = {"User-Agent": ua} # 设置 HTTP头 + params = requests.get(url=url, headers=header, verify=False, timeout=20).json() # 设置 HTTP请求参数 超时 20秒 Json解析 + except Exception as err: # 异常捕捉 + logger.info("Params参数获取失败") # 标准日志输出 + logger.debug(str(err)) # 调试日志输出 + return False, wskey # 返回 -> False[Bool], Wskey + headers = { + 'cookie': wskey, + 'content-type': 'application/x-www-form-urlencoded; charset=UTF-8', + 'charset': 'UTF-8', + 'accept-encoding': 'br,gzip,deflate', + 'user-agent': ua + } # 设置 HTTP头 + url = 'https://api.m.jd.com/client.action' # 设置 URL地址 + data = 'body=%7B%22to%22%3A%22https%253a%252f%252fplogin.m.jd.com%252fjd-mlogin%252fstatic%252fhtml%252fappjmp_blank.html%22%7D&' # 设置 POST 载荷 + try: # 异常捕捉 + res = requests.post(url=url, params=params, headers=headers, data=data, verify=False, + timeout=10) # HTTP请求 [POST] 超时 10秒 + res_json = json.loads(res.text) # Json模块 取值 + tokenKey = res_json['tokenKey'] # 取出TokenKey + except Exception as err: # 异常捕捉 + logger.info("JD_WSKEY接口抛出错误 尝试重试 更换IP") # 标准日志输出 + logger.info(str(err)) # 标注日志输出 + return False, wskey # 返回 -> False[Bool], Wskey + else: # 判断分支 + return appjmp(wskey, tokenKey) # 传递 wskey, Tokenkey 执行方法 [appjmp] + + +# 返回值 bool jd_ck +def appjmp(wskey, tokenKey): # 方法 传递 wskey & tokenKey + wskey = "pt_" + str(wskey.split(";")[0]) # 变量组合 使用 ; 分割变量 拼接 pt_ + if tokenKey == 'xxx': # 判断 tokenKey返回值 + logger.info(str(wskey) + ";疑似IP风控等问题 默认为失效\n--------------------\n") # 标准日志输出 + return False, wskey # 返回 -> False[Bool], Wskey + headers = { + 'User-Agent': ua, + 'accept': 'accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9', + 'x-requested-with': 'com.jingdong.app.mall' + } # 设置 HTTP头 + params = { + 'tokenKey': tokenKey, + 'to': 'https://plogin.m.jd.com/jd-mlogin/static/html/appjmp_blank.html' + } # 设置 HTTP_URL 参数 + url = 'https://un.m.jd.com/cgi-bin/app/appjmp' # 设置 URL地址 + try: # 异常捕捉 + res = requests.get(url=url, headers=headers, params=params, verify=False, allow_redirects=False, + timeout=20) # HTTP请求 [GET] 阻止跳转 超时 20秒 + except Exception as err: # 异常捕捉 + logger.info("JD_appjmp 接口错误 请重试或者更换IP\n") # 标准日志输出 + logger.info(str(err)) # 标准日志输出 + return False, wskey # 返回 -> False[Bool], Wskey + else: # 判断分支 + try: # 异常捕捉 + res_set = res.cookies.get_dict() # 从res cookie取出 + pt_key = 'pt_key=' + res_set['pt_key'] # 取值 [pt_key] + pt_pin = 'pt_pin=' + res_set['pt_pin'] # 取值 [pt_pin] + if "WSKEY_UPDATE_HOUR" in os.environ: # 判断是否在系统变量中启用 WSKEY_UPDATE_HOUR + jd_ck = str(pt_key) + ';' + str(pt_pin) + ';__time=' + str(time.time()) + ';' # 拼接变量 + else: # 判断分支 + jd_ck = str(pt_key) + ';' + str(pt_pin) + ';' # 拼接变量 + except Exception as err: # 异常捕捉 + logger.info("JD_appjmp提取Cookie错误 请重试或者更换IP\n") # 标准日志输出 + logger.info(str(err)) # 标准日志输出 + return False, wskey # 返回 -> False[Bool], Wskey + else: # 判断分支 + if 'fake' in pt_key: # 判断 pt_key中 是否存在fake + logger.info(str(wskey) + ";WsKey状态失效\n") # 标准日志输出 + return False, wskey # 返回 -> False[Bool], Wskey + else: # 判断分支 + logger.info(str(wskey) + ";WsKey状态正常\n") # 标准日志输出 + return True, jd_ck # 返回 -> True[Bool], jd_ck + + +def update(): # 方法 脚本更新模块 + up_ver = int(cloud_arg['update']) # 云端参数取值 [int] + if ver >= up_ver: # 判断版本号大小 + logger.info("当前脚本版本: " + str(ver)) # 标准日志输出 + logger.info("--------------------\n") # 标准日志输出 + else: # 判断分支 + logger.info("当前脚本版本: " + str(ver) + "新版本: " + str(up_ver)) # 标准日志输出 + logger.info("存在新版本, 请更新脚本后执行") # 标准日志输出 + logger.info("--------------------\n") # 标准日志输出 + text = '当前脚本版本: {0}新版本: {1}, 请更新脚本~!'.format(ver, up_ver) # 设置发送内容 + ql_send(text) + # sys.exit(0) # 退出脚本 [未启用] + + +def ql_check(port): # 方法 检查青龙端口 + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # Socket模块初始化 + sock.settimeout(2) # 设置端口超时 + try: # 异常捕捉 + sock.connect(('127.0.0.1', port)) # 请求端口 + except Exception as err: # 捕捉异常 + logger.debug(str(err)) # 调试日志输出 + sock.close() # 端口关闭 + return False # 返回 -> False[Bool] + else: # 分支判断 + sock.close() # 关闭端口 + return True # 返回 -> True[Bool] + + +def serch_ck(pin): # 方法 搜索 Pin + for i in range(len(envlist)): # For循环 变量[envlist]的数量 + if "name" not in envlist[i] or envlist[i]["name"] != "JD_COOKIE": # 判断 envlist内容 + continue # 继续循环 + if pin in envlist[i]['value']: # 判断envlist取值['value'] + value = envlist[i]['value'] # 取值['value'] + id = envlist[i][ql_id] # 取值 [ql_id](变量) + logger.info(str(pin) + "检索成功\n") # 标准日志输出 + return True, value, id # 返回 -> True[Bool], value, id + else: # 判断分支 + continue # 继续循环 + logger.info(str(pin) + "检索失败\n") # 标准日志输出 + return False, 1 # 返回 -> False[Bool], 1 + + +def get_env(): # 方法 读取变量 + url = ql_url + 'api/envs' + try: # 异常捕捉 + res = s.get(url) # HTTP请求 [GET] 使用 session + except Exception as err: # 异常捕捉 + logger.debug(str(err)) # 调试日志输出 + logger.info("\n青龙环境接口错误") # 标准日志输出 + sys.exit(1) # 脚本退出 + else: # 判断分支 + data = json.loads(res.text)['data'] # 使用Json模块提取值[data] + return data # 返回 -> data + + +def check_id(): # 方法 兼容青龙老版本与新版本 id & _id的问题 + url = ql_url + 'api/envs' + try: # 异常捕捉 + res = s.get(url).json() # HTTP[GET] 请求 使用 session + except Exception as err: # 异常捕捉 + logger.debug(str(err)) # 调试日志输出 + logger.info("\n青龙环境接口错误") # 标准日志输出 + sys.exit(1) # 脚本退出 + else: # 判断分支 + if '_id' in res['data'][0]: # 判断 [_id] + logger.info("使用 _id 键值") # 标准日志输出 + return '_id' # 返回 -> '_id' + else: # 判断分支 + logger.info("使用 id 键值") # 标准日志输出 + return 'id' # 返回 -> 'id' + + +def ql_update(e_id, n_ck): # 方法 青龙更新变量 传递 id cookie + url = ql_url + 'api/envs' + data = { + "name": "JD_COOKIE", + "value": n_ck, + ql_id: e_id + } # 设置 HTTP POST 载荷 + data = json.dumps(data) # json模块格式化 + s.put(url=url, data=data) # HTTP [PUT] 请求 使用 session + ql_enable(eid) # 调用方法 ql_enable 传递 eid + + +def ql_enable(e_id): # 方法 青龙变量启用 传递值 eid + url = ql_url + 'api/envs/enable' + data = '["{0}"]'.format(e_id) # 格式化 POST 载荷 + res = json.loads(s.put(url=url, data=data).text) # json模块读取 HTTP[PUT] 的返回值 + if res['code'] == 200: # 判断返回值为 200 + logger.info("\n账号启用\n--------------------\n") # 标准日志输出 + return True # 返回 ->True + else: # 判断分支 + logger.info("\n账号启用失败\n--------------------\n") # 标准日志输出 + return False # 返回 -> Fasle + + +def ql_disable(e_id): # 方法 青龙变量禁用 传递 eid + url = ql_url + 'api/envs/disable' + data = '["{0}"]'.format(e_id) # 格式化 POST 载荷 + res = json.loads(s.put(url=url, data=data).text) # json模块读取 HTTP[PUT] 的返回值 + if res['code'] == 200: # 判断返回值为 200 + logger.info("\n账号禁用成功\n--------------------\n") # 标准日志输出 + return True # 返回 ->True + else: # 判断分支 + logger.info("\n账号禁用失败\n--------------------\n") # 标准日志输出 + return False # 返回 -> Fasle + + +def ql_insert(i_ck): # 方法 插入新变量 + data = [{"value": i_ck, "name": "JD_COOKIE"}] # POST数据载荷组合 + data = json.dumps(data) # Json格式化数据 + url = ql_url + 'api/envs' + s.post(url=url, data=data) # HTTP[POST]请求 使用session + logger.info("\n账号添加完成\n--------------------\n") # 标准日志输出 + + +def cloud_info(): # 方法 云端信息 + url = str(base64.b64decode(url_t).decode()) + 'api/check_api' # 设置 URL地址 路由 [check_api] + for i in range(3): # For循环 3次 + try: # 异常捕捉 + headers = {"authorization": "Bearer Shizuku"} # 设置 HTTP头 + res = requests.get(url=url, verify=False, headers=headers, timeout=20).text # HTTP[GET] 请求 超时 20秒 + except requests.exceptions.ConnectTimeout: # 异常捕捉 + logger.info("\n获取云端参数超时, 正在重试!" + str(i)) # 标准日志输出 + time.sleep(1) # 休眠 1秒 + continue # 循环继续 + except requests.exceptions.ReadTimeout: # 异常捕捉 + logger.info("\n获取云端参数超时, 正在重试!" + str(i)) # 标准日志输出 + time.sleep(1) # 休眠 1秒 + continue # 循环继续 + except Exception as err: # 异常捕捉 + logger.info("\n未知错误云端, 退出脚本!") # 标准日志输出 + logger.debug(str(err)) # 调试日志输出 + sys.exit(1) # 脚本退出 + else: # 分支判断 + try: # 异常捕捉 + c_info = json.loads(res) # json读取参数 + except Exception as err: # 异常捕捉 + logger.info("云端参数解析失败") # 标准日志输出 + logger.debug(str(err)) # 调试日志输出 + sys.exit(1) # 脚本退出 + else: # 分支判断 + return c_info # 返回 -> c_info + + +def check_cloud(): # 方法 云端地址检查 + url_list = ['aHR0cDovL2FwaS5tb21vZS5tbC8=', 'aHR0cHM6Ly9hcGkubW9tb2UubWwv', + 'aHR0cHM6Ly9hcGkuaWxpeWEuY2Yv'] # URL list Encode + for i in url_list: # for循环 url_list + url = str(base64.b64decode(i).decode()) # 设置 url地址 [str] + try: # 异常捕捉 + requests.get(url=url, verify=False, timeout=10) # HTTP[GET]请求 超时 10秒 + except Exception as err: # 异常捕捉 + logger.debug(str(err)) # 调试日志输出 + continue # 循环继续 + else: # 分支判断 + info = ['HTTP', 'HTTPS', 'CloudFlare'] # 输出信息[List] + logger.info(str(info[url_list.index(i)]) + " Server Check OK\n--------------------\n") # 标准日志输出 + return i # 返回 ->i + logger.info("\n云端地址全部失效, 请检查网络!") # 标准日志输出 + ql_send('云端地址失效. 请联系作者或者检查网络.') # 推送消息 + sys.exit(1) # 脚本退出 + + +def check_port(): # 方法 检查变量传递端口 + logger.info("\n--------------------\n") # 标准日志输出 + if "QL_PORT" in os.environ: # 判断 系统变量是否存在[QL_PORT] + try: # 异常捕捉 + port = int(os.environ['QL_PORT']) # 取值 [int] + except Exception as err: # 异常捕捉 + logger.debug(str(err)) # 调试日志输出 + logger.info("变量格式有问题...\n格式: export QL_PORT=\"端口号\"") # 标准日志输出 + logger.info("使用默认端口5700") # 标准日志输出 + return 5700 # 返回端口 5700 + else: # 判断分支 + port = 5700 # 默认5700端口 + if not ql_check(port): # 调用方法 [ql_check] 传递 [port] + logger.info(str(port) + "端口检查失败, 如果改过端口, 请在变量中声明端口 \n在config.sh中加入 export QL_PORT=\"端口号\"") # 标准日志输出 + logger.info("\n如果你很确定端口没错, 还是无法执行, 在GitHub给我发issus\n--------------------\n") # 标准日志输出 + sys.exit(1) # 脚本退出 + else: # 判断分支 + logger.info(str(port) + "端口检查通过") # 标准日志输出 + return port # 返回->port + + +if __name__ == '__main__': # Python主函数执行入口 + port = check_port() # 调用方法 [check_port] 并赋值 [port] + ql_url = 'http://127.0.0.1:{0}/'.format(port) + token = ql_login() # 调用方法 [ql_login] 并赋值 [token] + s = requests.session() # 设置 request session方法 + s.headers.update({"authorization": "Bearer " + str(token)}) # 增加 HTTP头认证 + s.headers.update({"Content-Type": "application/json;charset=UTF-8"}) # 增加 HTTP头 json 类型 + ql_id = check_id() # 调用方法 [check_id] 并赋值 [ql_id] + url_t = check_cloud() # 调用方法 [check_cloud] 并赋值 [url_t] + cloud_arg = cloud_info() # 调用方法 [cloud_info] 并赋值 [cloud_arg] + update() # 调用方法 [update] + ua = cloud_arg['User-Agent'] # 设置全局变量 UA + wslist = get_wskey() # 调用方法 [get_wskey] 并赋值 [wslist] + envlist = get_env() # 调用方法 [get_env] 并赋值 [envlist] + if "WSKEY_SLEEP" in os.environ and str(os.environ["WSKEY_SLEEP"]).isdigit(): # 判断变量[WSKEY_SLEEP]是否为数字类型 + sleepTime = int(os.environ["WSKEY_SLEEP"]) # 获取变量 [int] + else: # 判断分支 + sleepTime = 10 # 默认休眠时间 10秒 + for ws in wslist: # wslist变量 for循环 [wslist -> ws] + wspin = ws.split(";")[0] # 变量分割 ; + if "pin" in wspin: # 判断 pin 是否存在于 [wspin] + wspin = "pt_" + wspin + ";" # 封闭变量 + return_serch = serch_ck(wspin) # 变量 pt_pin 搜索获取 key eid + if return_serch[0]: # bool: True 搜索到账号 + jck = str(return_serch[1]) # 拿到 JD_COOKIE + if not check_ck(jck): # bool: False 判定 JD_COOKIE 有效性 + tryCount = 1 # 重试次数 1次 + if "WSKEY_TRY_COUNT" in os.environ: # 判断 [WSKEY_TRY_COUNT] 是否存在于系统变量 + if os.environ["WSKEY_TRY_COUNT"].isdigit(): # 判断 [WSKEY_TRY_COUNT] 是否为数字 + tryCount = int(os.environ["WSKEY_TRY_COUNT"]) # 设置 [tryCount] int + for count in range(tryCount): # for循环 [tryCount] + count += 1 # 自增 + return_ws = getToken(ws) # 使用 WSKEY 请求获取 JD_COOKIE bool jd_ck + if return_ws[0]: # 判断 [return_ws]返回值 Bool类型 + break # 中断循环 + if count < tryCount: # 判断循环次 + logger.info("{0} 秒后重试,剩余次数:{1}\n".format(sleepTime, tryCount - count)) # 标准日志输出 + time.sleep(sleepTime) # 脚本休眠 使用变量 [sleepTime] + if return_ws[0]: # 判断 [return_ws]返回值 Bool类型 + nt_key = str(return_ws[1]) # 从 return_ws[1] 取出 -> nt_key + # logger.info("wskey转pt_key成功", nt_key) # 标准日志输出 [未启用] + logger.info("wskey转换成功") # 标准日志输出 + eid = return_serch[2] # 从 return_serch 拿到 eid + ql_update(eid, nt_key) # 函数 ql_update 参数 eid JD_COOKIE + else: # 判断分支 + if "WSKEY_AUTO_DISABLE" in os.environ: # 从系统变量中获取 WSKEY_AUTO_DISABLE + logger.info(str(wspin) + "账号失效") # 标准日志输出 + text = "账号: {0} WsKey疑似失效".format(wspin) # 设置推送内容 + else: # 判断分支 + eid = return_serch[2] # 读取 return_serch[2] -> eid + logger.info(str(wspin) + "账号禁用") # 标准日志输出 + ql_disable(eid) # 执行方法[ql_disable] 传递 eid + text = "账号: {0} WsKey疑似失效, 已禁用Cookie".format(wspin) # 设置推送内容 + ql_send(text) + else: # 判断分支 + logger.info(str(wspin) + "账号有效") # 标准日志输出 + eid = return_serch[2] # 读取 return_serch[2] -> eid + ql_enable(eid) # 执行方法[ql_enable] 传递 eid + logger.info("--------------------\n") # 标准日志输出 + else: # 判断分支 + logger.info("\n新wskey\n") # 标准日志分支 + return_ws = getToken(ws) # 使用 WSKEY 请求获取 JD_COOKIE bool jd_ck + if return_ws[0]: # 判断 (return_ws[0]) 类型: [Bool] + nt_key = str(return_ws[1]) # return_ws[1] -> nt_key + logger.info("wskey转换成功\n") # 标准日志输出 + ql_insert(nt_key) # 调用方法 [ql_insert] + logger.info("暂停{0}秒\n".format(sleepTime)) # 标准日志输出 + time.sleep(sleepTime) # 脚本休眠 + else: # 判断分支 + logger.info("WSKEY格式错误\n--------------------\n") # 标准日志输出 + logger.info("执行完成\n--------------------") # 标准日志输出 + sys.exit(0) # 脚本退出 + # Enjoy