Files
zjk2017-ArcadiaScriptPublic/youzan/有赞通用.js
2024-09-01 22:19:19 +08:00

162 lines
17 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
cron: 38 7 * * *
YouZanIDListbak 例如抓checkinId 和下面的checkinId一样的 不是随便填的 示例只有两个可以继续加) [{"12063":"SKG会员商城"},{"99":"魅族商城Lite"}]
YouZan 例如h5.youzan域名下要抓checkinId、appId、kdtId、extraData id随便写 token不填都行 示例只有两个可以继续加 只是模版不能直接复制运行 [
{"checkinId":"1597464","data":[{"id":"xbox","appId":"wx7f4f694622875202","kdtId":"100464643","token":"","extraData":
{"is_weapp":1,"sid":"YZ...","version":"2.149.9.101","client":"weapp","bizEnv":"wsc","uuid":"uuid","ftime":111111}
}]},
{"checkinId":"4296415","data":[{"id":"猛犸象1862","appId":"wxccbbf1b55ddaa627","kdtId":"146288343","token":"","extraData":
{"sid":"YZ....","version":"3.135.1.201","clientType":"weapp-miniprogram","client":"weapp","bizEnv":"","uuid":"uuid","ftime":111}
}]}]
有赞通用会有多个只留一个就行只是为了在readme里面增加条目显示有赞有哪些可以玩的
**/
const $ = new Env('有赞通用');
const YouZan = ($.isNode() ? JSON.parse(process.env.YouZan) : $.getjson("YouZan")) || [];
//let activityArr = [{"12063":"SKG会员商城"},{"99":"魅族商城Lite"},{"2162835":"PANDAER 会员商店"},{"3520910":"Achock官方商店"},{"2187565":"蜜蜂惊喜社"},{"2923467":"红之旗舰店"},{"2910869":"FicceCode菲诗蔻官方商城"},{"2386563":"HBN颜究所"},{"1597464":"Xbox 聚乐部"},{"3347128":"松鲜鲜调味品"}, {"3":"海天美味馆"},{"2299510":"燕京啤酒电商"},{"18415":"得宝Tempo"},{"4296415":"MAMMUT 1862 猛犸象"}, {"3796104":"海天官方优选商城"}, {"1820214":"JDE咖啡"}, {"3997371":"7.5矿泉水"}, {"3549859":"蒙牛营养家会员中心"}, {"3092383":"柚朵朵黑龙江"}, {"10210":"劲牌"}];
let activityArr = ($.isNode() ? JSON.parse(process.env.YouZanIDList) : $.getjson("YouZanIDList")) || [];
let notice = '';
!(async () => {
if (typeof $request != "undefined") {
await getCookie();
} else {
await main();
}
})().catch((e) => {$.log(e)}).finally(() => {$.done({});});
async function main() {
console.log('作者:@xzxxn777\n频道https://t.me/xzxxn777\n群组https://t.me/xzxxn7777\n自用机场推荐https://xn--diqv0fut7b.com\n')
console.log('二更作者ArcadiaScriptPublic 202409 \n频道https://t.me/ArcadiaScript \n群组https://t.me/ArcadiaScriptPublic')
for (const item of YouZan) {
let checkinId = item.checkinId;
let name = checkinId
if (activityArr.find(item => checkinId in item)) {
name = activityArr.find(item => checkinId in item)[checkinId];
}
//打印商家名称
//notice += `${name}\n`;
for (const data of item.data) {
let id = data.id, appId = data.appId, kdtId = data.kdtId, token = data.token, extraData = data.extraData;
// console.log(`用户:${id}开始签到`)
jsons1 = JSON.stringify(extraData);
// console.log(`用户:${jsons1}开始签到`)
const obj = JSON.parse(jsons1);
const ftime = obj.ftime;
const moment = require('moment');
const date = moment(ftime).format('YYYY-MM-DD HH:mm:ss');
//console.log(date); // 输出格式为2021-02-03 19:01:18
// console.log(`用户:${ftime}开始签到`)
// await sleep( 1000 * 60 * (1 + Math.random())); // 休眠1-2分钟
// await sleep( 1000 * 60 * (1 + Math.random())); // 休眠1-2分钟
//console.log(`用户:${id}开始签到`)
let checkin = await commonGet(`checkinId=${checkinId}&app_id=${appId}&kdt_id=${kdtId}&access_token=${token}`,extraData);
if (checkin.code == -1) {
//$.msg($.name, `${name} 用户:${id}`, `token已过期请重新获取`);
$.msg(`${name} 用户:${id}${date}token已过期请重新获取`)
continue
}
//console.log(`签到结果完整:`+JSON.stringify(checkin))
//console.log(`签到结果:${checkin.msg}\n`)
notice += `用户:${id} 签到结果:${checkin.msg}\n`;
}
}
if (notice) {
$.msg($.name, '', notice);
}
}
function sleep(milliseconds) {
return new Promise(resolve => setTimeout(resolve, milliseconds));
}
async function getCookie() {
let extraData = $request.headers["extra-data"] || $request.headers["Extra-Data"];
if (!extraData) {
return
}
const urlStr = $request.url.split('?')[1];
let result = {};
let paramsArr = urlStr.split('&')
for(let i = 0,len = paramsArr.length;i < len;i++){
let arr = paramsArr[i].split('=')
result[arr[0]] = arr[1];
}
const checkinId = result.checkinId;
const appId = result.app_id;
const kdtId = result.kdt_id;
const token = result.access_token;
let body = JSON.parse(extraData);
const id = body.uuid;
const newData = {"checkinId": checkinId, "data": []};
const data = {"id": id, "appId": appId, "kdtId": kdtId, "token": token, "extraData":extraData};
const existingIndex = YouZan.findIndex(e => e.checkinId == newData.checkinId);
if (existingIndex !== -1) {
const index = YouZan[existingIndex].data.findIndex(e => e.id == data.id);
if (index !== -1) {
if (YouZan[existingIndex].data[index].token == data.token) {
return
} else {
YouZan[existingIndex].data[index] = data;
console.log(JSON.stringify(data))
$.msg($.name, `${checkinId}`, `🎉用户${data.id}更新token成功!`);
}
} else {
YouZan[existingIndex].data.push(data)
console.log(JSON.stringify(data))
$.msg($.name, `${checkinId}`, `🎉新增用户${data.id}成功!`);
}
} else {
console.log("发现新的签到活动")
$.msg($.name, `🎉发现新的签到活动!`);
YouZan.push(newData)
newData.data.push(data)
console.log(JSON.stringify(data))
$.msg($.name, `${checkinId}`, `🎉新增用户${data.id}成功!`);
}
$.setjson(YouZan, "YouZan");
}
async function commonGet(url,extraData) {
jsons = JSON.stringify(extraData);
return new Promise(resolve => {
const options = {
url: `https://h5.youzan.com/wscump/checkin/checkinV2.json?${url}`,
headers: {
'User-Agent': 'Mozilla/5.0 (Linux; Android 10; 16th Build/QKQ1.191222.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/116.0.0.0 Mobile Safari/537.36 XWEB/1160083 MMWEBSDK/20231202 MMWEBID/2933 MicroMessenger/8.0.47.2560(0x28002F50) WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64 MiniProgramEnv/android',
'Content-Type': 'application/json',
'Accept-Encoding': 'gzip,compress,br,deflate',
'Extra-Data': jsons
}
}
$.get(options, async (err, resp, data) => {
try {
if (err) {
console.log(`${JSON.stringify(err)}`)
console.log(`${$.name} API请求失败请检查网路重试`)
} else {
resolve(JSON.parse(data));
}
} catch (e) {
$.logErr(e, resp)
} finally {
resolve();
}
})
})
}
// prettier-ignore
function Env(t,e){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,a)=>{s.call(this,t,(t,s,r)=>{t?a(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.encoding="utf-8",this.startTime=(new Date).getTime(),Object.assign(this,e),this.log("",`🔔${this.name}, 开始!`)}getEnv(){return"undefined"!=typeof $environment&&$environment["surge-version"]?"Surge":"undefined"!=typeof $environment&&$environment["stash-version"]?"Stash":"undefined"!=typeof module&&module.exports?"Node.js":"undefined"!=typeof $task?"Quantumult X":"undefined"!=typeof $loon?"Loon":"undefined"!=typeof $rocket?"Shadowrocket":void 0}isNode(){return"Node.js"===this.getEnv()}isQuanX(){return"Quantumult X"===this.getEnv()}isSurge(){return"Surge"===this.getEnv()}isLoon(){return"Loon"===this.getEnv()}isShadowrocket(){return"Shadowrocket"===this.getEnv()}isStash(){return"Stash"===this.getEnv()}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 a=this.getdata(t);if(a)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,a)=>e(a))})}runScript(t,e){return new Promise(s=>{let a=this.getdata("@chavy_boxjs_userCfgs.httpapi");a=a?a.replace(/\n/g,"").trim():a;let r=this.getdata("@chavy_boxjs_userCfgs.httpapi_timeout");r=r?1*r:20,r=e&&e.timeout?e.timeout:r;const[i,o]=a.split("@"),n={url:`http://${o}/v1/scripting/evaluate`,body:{script_text:t,mock_type:"cron",timeout:r},headers:{"X-Key":i,Accept:"*/*"},timeout:r};this.post(n,(t,e,a)=>s(a))}).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),a=!s&&this.fs.existsSync(e);if(!s&&!a)return{};{const a=s?t:e;try{return JSON.parse(this.fs.readFileSync(a))}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),a=!s&&this.fs.existsSync(e),r=JSON.stringify(this.data);s?this.fs.writeFileSync(t,r):a?this.fs.writeFileSync(e,r):this.fs.writeFileSync(t,r)}}lodash_get(t,e,s){const a=e.replace(/\[(\d+)\]/g,".$1").split(".");let r=t;for(const t of a)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,a)=>Object(t[s])===t[s]?t[s]:t[s]=Math.abs(e[a+1])>>0==+e[a+1]?[]:{},t)[e[e.length-1]]=s,t)}getdata(t){let e=this.getval(t);if(/^@/.test(t)){const[,s,a]=/^@(.*?)\.(.*?)$/.exec(t),r=s?this.getval(s):"";if(r)try{const t=JSON.parse(r);e=t?this.lodash_get(t,a,""):e}catch(t){e=""}}return e}setdata(t,e){let s=!1;if(/^@/.test(e)){const[,a,r]=/^@(.*?)\.(.*?)$/.exec(e),i=this.getval(a),o=a?"null"===i?null:i||"{}":"{}";try{const e=JSON.parse(o);this.lodash_set(e,r,t),s=this.setval(JSON.stringify(e),a)}catch(e){const i={};this.lodash_set(i,r,t),s=this.setval(JSON.stringify(i),a)}}else s=this.setval(t,e);return s}getval(t){switch(this.getEnv()){case"Surge":case"Loon":case"Stash":case"Shadowrocket":return $persistentStore.read(t);case"Quantumult X":return $prefs.valueForKey(t);case"Node.js":return this.data=this.loaddata(),this.data[t];default:return this.data&&this.data[t]||null}}setval(t,e){switch(this.getEnv()){case"Surge":case"Loon":case"Stash":case"Shadowrocket":return $persistentStore.write(t,e);case"Quantumult X":return $prefs.setValueForKey(t,e);case"Node.js":return this.data=this.loaddata(),this.data[e]=t,this.writedata(),!0;default:return 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=(()=>{})){switch(t.headers&&(delete t.headers["Content-Type"],delete t.headers["Content-Length"],delete t.headers["content-type"],delete t.headers["content-length"]),t.params&&(t.url+="?"+this.queryStr(t.params)),this.getEnv()){case"Surge":case"Loon":case"Stash":case"Shadowrocket":default:this.isSurge()&&this.isNeedRewrite&&(t.headers=t.headers||{},Object.assign(t.headers,{"X-Surge-Skip-Scripting":!1})),$httpClient.get(t,(t,s,a)=>{!t&&s&&(s.body=a,s.statusCode=s.status?s.status:s.statusCode,s.status=s.statusCode),e(t,s,a)});break;case"Quantumult X":this.isNeedRewrite&&(t.opts=t.opts||{},Object.assign(t.opts,{hints:!1})),$task.fetch(t).then(t=>{const{statusCode:s,statusCode:a,headers:r,body:i,bodyBytes:o}=t;e(null,{status:s,statusCode:a,headers:r,body:i,bodyBytes:o},i,o)},t=>e(t&&t.error||"UndefinedError"));break;case"Node.js":let s=require("iconv-lite");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:a,statusCode:r,headers:i,rawBody:o}=t,n=s.decode(o,this.encoding);e(null,{status:a,statusCode:r,headers:i,rawBody:o,body:n},n)},t=>{const{message:a,response:r}=t;e(a,r,r&&s.decode(r.rawBody,this.encoding))})}}post(t,e=(()=>{})){const s=t.method?t.method.toLocaleLowerCase():"post";switch(t.body&&t.headers&&!t.headers["Content-Type"]&&!t.headers["content-type"]&&(t.headers["content-type"]="application/x-www-form-urlencoded"),t.headers&&(delete t.headers["Content-Length"],delete t.headers["content-length"]),this.getEnv()){case"Surge":case"Loon":case"Stash":case"Shadowrocket":default:this.isSurge()&&this.isNeedRewrite&&(t.headers=t.headers||{},Object.assign(t.headers,{"X-Surge-Skip-Scripting":!1})),$httpClient[s](t,(t,s,a)=>{!t&&s&&(s.body=a,s.statusCode=s.status?s.status:s.statusCode,s.status=s.statusCode),e(t,s,a)});break;case"Quantumult X":t.method=s,this.isNeedRewrite&&(t.opts=t.opts||{},Object.assign(t.opts,{hints:!1})),$task.fetch(t).then(t=>{const{statusCode:s,statusCode:a,headers:r,body:i,bodyBytes:o}=t;e(null,{status:s,statusCode:a,headers:r,body:i,bodyBytes:o},i,o)},t=>e(t&&t.error||"UndefinedError"));break;case"Node.js":let a=require("iconv-lite");this.initGotEnv(t);const{url:r,...i}=t;this.got[s](r,i).then(t=>{const{statusCode:s,statusCode:r,headers:i,rawBody:o}=t,n=a.decode(o,this.encoding);e(null,{status:s,statusCode:r,headers:i,rawBody:o,body:n},n)},t=>{const{message:s,response:r}=t;e(s,r,r&&a.decode(r.rawBody,this.encoding))})}}time(t,e=null){const s=e?new Date(e):new Date;let a={"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 a)new RegExp("("+e+")").test(t)&&(t=t.replace(RegExp.$1,1==RegExp.$1.length?a[e]:("00"+a[e]).substr((""+a[e]).length)));return t}queryStr(t){let e="";for(const s in t){let a=t[s];null!=a&&""!==a&&("object"==typeof a&&(a=JSON.stringify(a)),e+=`${s}=${a}&`)}return e=e.substring(0,e.length-1),e}msg(e=t,s="",a="",r){const i=t=>{switch(typeof t){case void 0:return t;case"string":switch(this.getEnv()){case"Surge":case"Stash":default:return{url:t};case"Loon":case"Shadowrocket":return t;case"Quantumult X":return{"open-url":t};case"Node.js":return}case"object":switch(this.getEnv()){case"Surge":case"Stash":case"Shadowrocket":default:{let e=t.url||t.openUrl||t["open-url"];return{url:e}}case"Loon":{let e=t.openUrl||t.url||t["open-url"],s=t.mediaUrl||t["media-url"];return{openUrl:e,mediaUrl:s}}case"Quantumult X":{let e=t["open-url"]||t.url||t.openUrl,s=t["media-url"]||t.mediaUrl,a=t["update-pasteboard"]||t.updatePasteboard;return{"open-url":e,"media-url":s,"update-pasteboard":a}}case"Node.js":return}default:return}};if(!this.isMute)switch(this.getEnv()){case"Surge":case"Loon":case"Stash":case"Shadowrocket":default:$notification.post(e,s,a,i(r));break;case"Quantumult X":$notify(e,s,a,i(r));break;case"Node.js":}if(!this.isMuteLog){let t=["","==============📣系统通知📣=============="];t.push(e),s&&t.push(s),a&&t.push(a),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){switch(this.getEnv()){case"Surge":case"Loon":case"Stash":case"Shadowrocket":case"Quantumult X":default:this.log("",`❗️${this.name}, 错误!`,t);break;case"Node.js":this.log("",`❗️${this.name}, 错误!`,t.stack)}}wait(t){return new Promise(e=>setTimeout(e,t))}done(t={}){const e=(new Date).getTime(),s=(e-this.startTime)/1e3;switch(this.log("",`🔔${this.name}, 结束! 🕛 ${s}`),this.log(),this.getEnv()){case"Surge":case"Loon":case"Stash":case"Shadowrocket":case"Quantumult X":default:$done(t);break;case"Node.js":process.exit(1)}}}(t,e)}