Rules-For-Quantumult-X/Scripts/SignIn/JD/jd.618.adapt.js

406 lines
18 KiB
JavaScript

const $ = new Env('京东618')
$.VAL_url = $.getdata('chavy_url_jd816')
$.VAL_body = $.getdata('chavy_body_jd816')
$.VAL_headers = $.getdata('chavy_headers_jd816')
$.VAL_isSignShop = $.getdata('CFG_618_isSignShop') || 'true'
$.VAL_isJoinBrand = $.getdata('CFG_618_isJoinBrand') || 'false'
$.VAL_radommsMin = $.getdata('CFG_618_radomms_min') || '2000'
$.VAL_radommsMax = $.getdata('CFG_618_radomms_max') || '5000'
!(async () => {
$.log('', `🔔 ${$.name}, 开始!`, '')
await getData()
await getActs()
await getShops()
await execActs()
showmsg()
})()
.catch((e) => {
$.log('', `${$.name}, 失败! 原因: ${e}!`, '')
})
.finally(() => {
$.msg($.name, $.subt, $.desc), $.log('', `🔔 ${$.name}, 结束!`, ''), $.done()
})
function getData() {
return new Promise((resove) => {
$.post(taskurl('cakebaker_getHomeData'), (error, response, data) => {
try {
if (error) throw new Error(error)
const _info = JSON.parse(data).data.result.cakeBakerInfo
$.secretp = _info.secretp
if (!$.secretp) throw new Error('获取 secretp 失败!')
$.log(`${$.name}, 获取密钥!`)
$.log(` 密钥 = ${$.secretp.slice(0, 10)}...`)
$.log(` 等级 = ${_info.raiseInfo.scoreLevel}`)
$.log(` 分数 = ${_info.raiseInfo.totalScore} => ${_info.raiseInfo.nextLevelScore}`)
$.log(` 延时 = ${$.VAL_radommsMin} => ${$.VAL_radommsMax} 毫秒`, '')
} catch (e) {
$.log(`❗️ ${$.name}, 获取密钥!`, ` error = ${error || e}`, `response = ${JSON.stringify(response)}`, `data = ${data}`, '')
} finally {
resove()
}
})
})
}
function getShops() {
return new Promise((resove) => {
$.post(taskurl('cakebaker_bigBrandHomeData'), (error, response, data) => {
try {
$.log(`${$.name}, 获取商店!`)
if (error) throw new Error(error)
$.shopActs = []
JSON.parse(data).data.result.bigBrandList.forEach((_shopa) => {
const _shopact = {
_raw: _shopa,
id: _shopa.venderId,
name: _shopa.name
}
$.shopActs.push(_shopact)
})
$.log(` 商店数量 = ${$.shopActs.length}`, '')
} catch (e) {
$.log(`❗️ ${$.name}, 获取商店!`, ` error = ${error || e}`, `response = ${JSON.stringify(response)}`, `data = ${data}`, '')
} finally {
resove()
}
})
})
}
function getActs() {
return new Promise((resove) => {
$.post(taskurl('cakebaker_getTaskDetail'), (error, response, data) => {
try {
$.log(`${$.name}, 获取活动!`)
if (error) throw new Error(error)
$.acts = []
JSON.parse(data).data.result.taskVos.forEach((_a) => {
const _act = {
_raw: _a,
id: _a.taskId,
name: _a.taskName,
times: _a.times,
maxTimes: _a.maxTimes,
waitDuration: _a.waitDuration === 0 ? 1 : _a.waitDuration,
isProd: _a.productInfoVos ? true : false,
isBrand: _a.shoppingActivityVos && _a.taskId === 42 ? true : false,
tasks: []
}
const _vo = _a[Object.keys(_a).find((key) => (_a[key] && _a[key].itemId) || (_a[key] && _a[key][0] && _a[key][0].itemId))]
if (Array.isArray(_vo)) {
_vo.forEach((_task) => _act.tasks.push({
_raw: _task,
id: _task.itemId,
name: _task.title || _task.shopName || _task.taskName || '未知名称'
}))
} else {
_act.tasks = Array(_act.maxTimes - _act.times).fill({
_raw: _vo,
id: _vo.itemId,
name: _act.name
})
}
$.acts.push(_act)
})
if (!$.acts) throw new Error('获取活动失败!')
$.log(` 活动数量 = ${$.acts.length}`, '')
} catch (e) {
$.log(`❗️ ${$.name}, 获取活动!`, ` error = ${error || e}`, `response = ${JSON.stringify(response)}`, `data = ${data}`, '')
} finally {
resove()
}
})
})
}
async function execActs() {
$.log(`${$.name}, 执行活动!`)
for (let _actIdx = 0; _actIdx < $.acts.length; _actIdx++) {
const _act = $.acts[_actIdx]
$.log(` ${_actIdx + 1}. ${_act.name} (${_act.times}/${_act.maxTimes})`)
if (_act.times === _act.maxTimes) {
$.log(` @跳过: 全部完成!`, '')
continue
}
// 跳过:邀请好友、加入战队
if ([2, 12].includes(_act.id)) {
$.log(' 跳过!', '')
continue
}
// 甄选优品
else if (_act.isProd) {
await getProdAct(_act)
for (let subactIdx = 0; subactIdx < _act.subacts.length; subactIdx++) {
const subact = _act.subacts[subactIdx]
$.log(` ${subactIdx + 1}. ${subact.name} (${subact.times}/${subact.maxTimes})`)
if (subact.times === subact.maxTimes) {
$.log(` @跳过: 全部完成!`, '')
continue
}
for (let subataskIdx = 0; subataskIdx < subact.tasks.length; subataskIdx++) {
const subatask = subact.tasks[subataskIdx]
$.log(` ${subataskIdx + 1}. ${subatask.name.slice(0, 15)}...`)
if (subatask._raw.status && subatask._raw.status === 2) {
$.log(` @跳过: 已经做过!`, '')
continue
}
await sendtask(subact, subatask, true)
$.log(` @认领任务: ${subatask.isClaimSuc ? '🟢' : '🔴'}`)
if (subatask.isskip) {
$.log(` @跳过: ${subatask.msg}`)
const randomms = genRadomms()
$.log(` @等待: 8 秒 + ${randomms} 毫秒`, '')
await new Promise($.wait(8000 + randomms))
} else {
const randomms = genRadomms()
$.log(` @等待: ${subact.waitDuration} 秒 + ${randomms} 毫秒`)
await new Promise($.wait(subact.waitDuration * 1000 + randomms))
await sendtask(subact, subatask)
$.log(` @完成任务: ${subatask.isExecSuc ? '🟢' : '🔴'}`)
$.log(` @等待: 5 秒 + ${randomms} 毫秒`, '')
await new Promise($.wait(5000 + randomms))
}
}
}
}
// 开通会员
else if (_act.isBrand) {
if ($.VAL_isJoinBrand === 'true' || $.VAL_isJoinBrand === true) {
for (let taskIdx = 0; taskIdx < _act.tasks.length; taskIdx++) {
const task = _act.tasks[taskIdx]
$.log(` ${taskIdx + 1}. ${task.name}`)
await joinBrand(task)
$.log(` @加入会员: ${task.isJoinSuc ? '🟢' : '🔴'}`)
const randomms = genRadomms()
$.log(` @等待: ${_act.waitDuration} 秒 + ${randomms} 毫秒`)
await new Promise($.wait(_act.waitDuration * 1000 + randomms))
await brandAward(task)
$.log(` @完成任务: ${task.isAwardSuc ? '🟢' : '🔴'}`)
$.log(` @等待: 5 秒 + ${randomms} 毫秒`, '')
await new Promise($.wait(5000 + randomms))
}
} else {
$.log(` @跳过: BoxJs 设置为 关闭 品牌会员!`, '')
}
}
// 普通任务
else {
for (let taskIdx = 0; taskIdx < _act.tasks.length; taskIdx++) {
const task = _act.tasks[taskIdx]
$.log(` ${taskIdx + 1}. ${task.name}`)
if (task._raw.status && task._raw.status === 2) {
$.log(` @跳过: 已经做过!`, '')
continue
}
await sendtask(_act, task, true)
$.log(` @认领任务: ${task.isClaimSuc ? '🟢' : '🔴'}`)
if (task.isskip || task.ishot) {
$.log(` @跳过: ${task.msg}`)
const randomms = genRadomms()
$.log(` @等待: 8 秒 + ${randomms} 毫秒`, '')
await new Promise($.wait(8000 + randomms))
} else {
const randomms = genRadomms()
$.log(` @等待: ${_act.waitDuration} 秒 + ${randomms} 毫秒`)
await new Promise($.wait(_act.waitDuration * 1000 + randomms))
await sendtask(_act, task)
$.log(` @完成任务: ${task.isExecSuc ? '🟢' : '🔴'}`)
$.log(` @等待: 5 秒 + ${randomms} 毫秒`, '')
await new Promise($.wait(5000 + randomms))
}
}
}
}
// 商店签到
$.log(` ${$.acts.length + 1}. 商店签到 (${$.shopActs.length})`)
if ($.VAL_isSignShop === 'true' || $.VAL_isSignShop === true) {
for (let _shopIdx = 0; _shopIdx < $.shopActs.length; _shopIdx++) {
const shop = $.shopActs[_shopIdx]
$.log(` ${_shopIdx + 1}. ${shop.name}`)
await signshop(shop)
shop.msg = /,/.test(shop.msg) ? shop.msg.split(',')[1] : shop.msg
$.log(` @签到: ${shop.isSuc ? '🟢 已领取!' : shop.code === 402 ? '⚪️ 无效活动!' : `🔴 ${shop.msg}`}`)
const randomms = genRadomms()
$.log(` @等待: 8 秒 + ${randomms} 毫秒`, '')
await new Promise($.wait(8000 + randomms))
}
} else {
$.log(` @跳过: BoxJs 设置为 关闭 商店签到!`, '')
}
}
// 商品类活动
function getProdAct(act) {
return new Promise((resove) => {
const body = {taskIds: act.tasks.map((task) => task.id).toString()}
$.post(taskurl('cakebaker_getFeedDetail', JSON.stringify(body)), (error, response, data) => {
try {
const _result = JSON.parse(data).data.result
const _vo = _result[Object.keys(_result).find((key) => Array.isArray(_result[key] && _result[key][0] && _result[key][0].productInfoVos))]
act.subacts = []
_vo.forEach((_suba) => {
const _subact = {
_raw: _suba,
id: _suba.taskId,
name: _suba.taskName,
times: _suba.times,
maxTimes: _suba.maxTimes,
waitDuration: _suba.waitDuration === 0 ? 1 : _suba.waitDuration,
isProd: _suba.productInfoVos ? true : false,
tasks: []
}
_suba.productInfoVos.slice(0, 5).forEach((_prodvo) => {
const _taskname = _prodvo.skuName || _prodvo.title || _prodvo.shopName || _prodvo.taskName || '未知名称'
_subact.tasks.push({
_raw: _prodvo,
id: _prodvo.itemId,
name: _taskname
})
})
act.subacts.push(_subact)
})
} catch (e) {
$.log(`❗️ ${$.name}, 执行商品类活动!`, ` error = ${error || e}`, `response = ${JSON.stringify(response)}`, `data = ${data}`, '')
} finally {
resove()
}
})
})
}
function sendtask(act, task, isClaim = false) {
return new Promise((resove) => {
const body = {
taskId: act.id,
itemId: task.id,
actionType: isClaim ? 1 : undefined,
safeStr: JSON.stringify({secretp: $.secretp})
}
$.post(taskurl('cakebaker_ckCollectScore', JSON.stringify(body)), (error, response, data) => {
try {
const _data = JSON.parse(data)
const _issuc = _data.data.bizCode === 0 || _data.data.bizCode === -5 || _data.data.bizCode === -15
if (isClaim) task.isClaimSuc = _issuc
else task.isExecSuc = _issuc
task.isskip = _data.data.bizCode === -5
task.ishot = _data.data.bizCode === -15
task.msg = _data.data.bizMsg || '无'
} catch (e) {
if (isClaim) task.isClaimSuc = false
else task.isExecSuc = false
task.isskip = false
task.ishot = false
task.msg = error || e
} finally {
resove()
}
})
})
}
function signshop(shop) {
return new Promise((resove) => {
const body = {channel: 2, venderId: shop.id}
$.post(taskurl('interact_center_sign_collectGift', JSON.stringify(body)), (error, response, data) => {
try {
const _data = JSON.parse(data)
shop.isSuc = _data.code === 407000005 || _data.code === 200 ? true : false
shop.code = _data.code
shop.msg = _data.msg
} catch (e) {
shop.isSuc = false
shop.msg = error || e
} finally {
resove()
}
})
})
}
function joinBrand(task) {
return new Promise((resove) => {
const body = {
venderId: task._raw.copy1,
shopId: task._raw.copy1,
bindByVerifyCodeFlag: 1,
registerExtend: {},
writeChildFlag: 0,
channel: 4032
}
const joinurl = `https://api.m.jd.com/client.action?appid=jd_shop_member&functionId=bindWithVender&body=${encodeURIComponent(JSON.stringify(body))}&client=H5&clientVersion=8.5.6&uuid=88888`
const url = {url: joinurl, headers: JSON.parse($.VAL_headers)}
delete url.headers['Content-Length']
$.get(url, (error, response, data) => {
try {
const _data = JSON.parse(data)
task.isJoinSuc = _data.busiCode === '0'
task.msg = _data.message || '无'
} catch (e) {
task.isJoinSuc = false
task.msg = error || e
} finally {
resove()
}
})
})
}
function brandAward(task) {
return new Promise((resove) => {
const body = {venderId: task._raw.copy1, itemId: task.id}
$.post(taskurl('cakebaker_taskBigBrandAward', JSON.stringify(body)), (error, response, data) => {
try {
const _data = JSON.parse(data)
const _issuc = _data.data.bizCode === 0 || _data.data.bizCode === -5 || _data.data.bizCode === -15
task.isAwardSuc = _issuc
task.msg = _data.data.bizMsg || '无'
} catch (e) {
task.isAwardSuc = false
task.msg = error || e
} finally {
resove()
}
})
})
}
function taskurl(fid, body = '{}') {
const url = {url: `https://api.m.jd.com/client.action`}
url.headers = JSON.parse($.VAL_headers)
url.body = `functionId=${fid}&body=${body}&client=wh5&clientVersion=1.0.0`
return url
}
function genRadomms() {
const max = $.VAL_radommsMax * 1
const min = $.VAL_radommsMin * 1
return parseInt(Math.random() * (max - min + 1) + min, 10)
}
function showmsg() {
}
// prettier-ignore
function Env(t) {
this.name = t, this.logs = [], this.isSurge = (() => "undefined" != typeof $httpClient), this.isQuanX = (() => "undefined" != typeof $task), this.log = ((...t) => {
this.logs = [...this.logs, ...t], t ? console.log(t.join("\n")) : console.log(this.logs.join("\n"))
}), this.msg = ((t = this.name, s = "", i = "") => {
this.isSurge() && $notification.post(t, s, i), this.isQuanX() && $notify(t, s, i);
const e = ["", "==============\ud83d\udce3\u7cfb\u7edf\u901a\u77e5\ud83d\udce3=============="];
t && e.push(t), s && e.push(s), i && e.push(i), console.log(e.join("\n"))
}), this.getdata = (t => this.isSurge() ? $persistentStore.read(t) : this.isQuanX() ? $prefs.valueForKey(t) : void 0), this.setdata = ((t, s) => this.isSurge() ? $persistentStore.write(t, s) : this.isQuanX() ? $prefs.setValueForKey(t, s) : void 0), this.get = ((t, s) => this.send(t, "GET", s)), this.wait = ((t, s = t) => i => setTimeout(() => i(), Math.floor(Math.random() * (s - t + 1) + t))), this.post = ((t, s) => this.send(t, "POST", s)), this.send = ((t, s, i) => {
if (this.isSurge()) {
const e = "POST" == s ? $httpClient.post : $httpClient.get;
e(t, (t, s, e) => {
s && (s.body = e, s.statusCode = s.status), i(t, s, e)
})
}
this.isQuanX() && (t.method = s, $task.fetch(t).then(t => {
t.status = t.statusCode, i(null, t, t.body)
}, t => i(t.error, t, t)))
}), this.done = ((t = {}) => $done(t))
}