378 lines
15 KiB
JavaScript
378 lines
15 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))}
|