Merge branch 'main' of https://github.com/leafTheFish/DeathNote
This commit is contained in:
39
README.md
39
README.md
@@ -3,5 +3,40 @@
|
||||
本仓库脚本仅用于交流学习,请下载后24之内自行删除
|
||||
|
||||
# 京东挂机
|
||||
自助登录挂机:
|
||||
https://ark.leaf-x-dg.tk/login
|
||||
京东车, 支持APP扫二维码登录和手机打开授权登录:
|
||||
|
||||
https://qrabbit.leaf-x-dg.tk
|
||||
|
||||
备用提交ck登录车:
|
||||
|
||||
https://radish.leaf-x-dg.tk
|
||||
|
||||
备用短信登录车:
|
||||
|
||||
https://ark.leaf-x-dg.tk
|
||||
|
||||
|
||||
京东车登录后可以在网页个人中心查询资产
|
||||
|
||||
## 车上自动跑的
|
||||
(需要助力的活动,车头优先助力):
|
||||
|
||||
赚京豆
|
||||
|
||||
极速版金币
|
||||
|
||||
过期豆续期
|
||||
|
||||
京东超市抽奖和游戏
|
||||
|
||||
农场抽奖
|
||||
|
||||
消消乐任务
|
||||
|
||||
赚钱大赢家任务
|
||||
|
||||
团圆红包任务
|
||||
|
||||
各种签到
|
||||
|
||||
其他的私有活动本等
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -1,310 +0,0 @@
|
||||
/*
|
||||
广汽传祺小程序抽奖
|
||||
|
||||
cron: 45 12 29-31 12 *
|
||||
|
||||
一次性抽奖, 跑一次就好
|
||||
抽奖之后需要自己到app-我的-兑奖中心-年末好礼大放送 里面填兑换码
|
||||
一个号只能填一次兑换码,自己选分数多的去填吧
|
||||
*/
|
||||
const $ = new Env('广汽传祺小程序抽奖');
|
||||
const got = require('got');
|
||||
|
||||
const envPrefix = 'gqcqWx'
|
||||
const envSplitor = ['\n','&','@'] //支持多种分割,但要保证变量里不存在这个字符
|
||||
const ckNames = [envPrefix+'Cookie'] //支持多变量
|
||||
|
||||
const MAX_THREAD = parseInt(process.env[envPrefix+'Thread']) || 3
|
||||
const DEFAULT_TIMEOUT=8000, DEFAULT_RETRY=3;
|
||||
|
||||
const default_UA = 'Mozilla/5.0 (iPhone; CPU iPhone OS 15_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.31(0x18001f30) NetType/WIFI Language/zh_CN miniProgram/wx86a1eb5a53a6973b'
|
||||
const Origin = 'https://mall.gacmotor.com'
|
||||
const Referer = 'https://mall.gacmotor.com/act/turntable?id=147&_sasdk=fMTUzNjA1OTE2Mjc5MzM5NDE3Ng'
|
||||
|
||||
const channel = 'wx_channel'
|
||||
const activityId_list = ['147','148','150','152']
|
||||
|
||||
const client = got.extend({
|
||||
headers:{
|
||||
Connection:'keep-alive',
|
||||
'User-Agent': default_UA,
|
||||
Origin,
|
||||
Referer,
|
||||
},
|
||||
retry: {limit:0},
|
||||
timeout: DEFAULT_TIMEOUT,
|
||||
followRedirect: false,
|
||||
})
|
||||
|
||||
class BasicClass {
|
||||
constructor() {
|
||||
this.index = $.userIdx++;
|
||||
this.name = '';
|
||||
}
|
||||
log(msg, opt = {}) {
|
||||
var m = '', n = $.userCount.toString().length;;
|
||||
if (this.index) m += `账号[${$.padStr(this.index,n)}]`;
|
||||
if (this.name) m += `[${this.name}]`;
|
||||
$.log(m + msg, opt);
|
||||
}
|
||||
async request(opt) {
|
||||
var resp = null, count = 0;
|
||||
var fn = opt.fn || opt.url;
|
||||
opt.method = opt?.method?.toUpperCase() || 'GET';
|
||||
while (count++ < DEFAULT_RETRY) {
|
||||
try {
|
||||
await client(opt).then(t => {
|
||||
resp = t
|
||||
}, e => {
|
||||
resp = e.response
|
||||
});
|
||||
if (((resp?.statusCode / 100) | 0) <= 4) break;
|
||||
} catch (e) {
|
||||
if (e.name == 'TimeoutError') {
|
||||
this.log(`[${fn}]请求超时,重试第${count}次`);
|
||||
} else {
|
||||
this.log(`[${fn}]请求错误(${e.message}),重试第${count}次`);
|
||||
}
|
||||
};
|
||||
}
|
||||
if (resp == null) return Promise.resolve({statusCode:-1,headers:null,result:null});
|
||||
let {statusCode,headers,body} = resp;
|
||||
if (body) try {body = JSON.parse(body);} catch {};
|
||||
return Promise.resolve({statusCode,headers,result:body})
|
||||
}
|
||||
}
|
||||
let http = new BasicClass();
|
||||
|
||||
class UserClass extends BasicClass {
|
||||
constructor(ck) {
|
||||
super()
|
||||
this.token = ck
|
||||
this.headers = {
|
||||
token: this.token,
|
||||
}
|
||||
}
|
||||
|
||||
async lottery(activityId) {
|
||||
try {
|
||||
let options = {
|
||||
fn: 'lottery',
|
||||
method: 'post',
|
||||
url: 'https://mall.gacmotor.com/activity-app/customer/activityPrize/lotter',
|
||||
searchParam: {notip:true},
|
||||
headers: this.headers,
|
||||
json: {activityId,channel},
|
||||
}
|
||||
let {result} = await this.request(options)
|
||||
let code = result?.code
|
||||
if(code == '0000') {
|
||||
this.log(`抽奖[${activityId}]: ${result?.data?.name}`, {notify:true})
|
||||
} else {
|
||||
this.log(`抽奖[${activityId}]失败[${code}]: ${result?.msg}`, {notify:true})
|
||||
}
|
||||
} catch (e) {
|
||||
$.log(e)
|
||||
} finally {
|
||||
return Promise.resolve()
|
||||
}
|
||||
}
|
||||
|
||||
async prizeRecords(activityId) {
|
||||
try {
|
||||
let options = {
|
||||
fn: 'prizeRecords',
|
||||
method: 'get',
|
||||
url: 'https://mall.gacmotor.com/activity-app/customer/activityPrize/query/prizeRecords',
|
||||
searchParam: {activityId},
|
||||
headers: this.headers,
|
||||
}
|
||||
let {result} = await this.request(options)
|
||||
let code = result?.code
|
||||
if(code == '0000') {
|
||||
for(let item of (result?.data||[])) {
|
||||
$.log(`[${item.prizeName}] -- ${item.code}`, {notify:true})
|
||||
}
|
||||
} else {
|
||||
this.log(`查询中奖记录失败`)
|
||||
}
|
||||
} catch (e) {
|
||||
$.log(e)
|
||||
} finally {
|
||||
return Promise.resolve()
|
||||
}
|
||||
}
|
||||
|
||||
async userTask() {
|
||||
for(let id of activityId_list) {
|
||||
await this.lottery(id)
|
||||
}
|
||||
}
|
||||
|
||||
async userCheckTask() {
|
||||
//for(let id of activityId_list) {
|
||||
// await this.prizeRecords(id)
|
||||
//}
|
||||
await this.prizeRecords('147')
|
||||
}
|
||||
}
|
||||
|
||||
!(async () => {
|
||||
$.read_env(UserClass);
|
||||
|
||||
$.log('\n------------- 抽奖 -------------')
|
||||
await $.threadTask('userTask',MAX_THREAD)
|
||||
|
||||
$.log('\n------------- 中奖记录 -------------')
|
||||
await $.threadTask('userCheckTask',MAX_THREAD)
|
||||
})()
|
||||
.catch((e) => $.log(e))
|
||||
.finally(() => $.exitNow())
|
||||
|
||||
function Env(name) {
|
||||
return new class {
|
||||
constructor(name) {
|
||||
this.name = name;
|
||||
this.startTime = Date.now();
|
||||
this.log(`[${this.name}]开始运行\n`, {time: true});
|
||||
this.notifyStr = [];
|
||||
this.notifyFlag = true;
|
||||
this.userIdx = 0;
|
||||
this.userList = [];
|
||||
this.userCount = 0;
|
||||
}
|
||||
log(msg, options = {}) {
|
||||
let opt = {console: true};
|
||||
Object.assign(opt, options);
|
||||
if (opt.time) {
|
||||
let fmt = opt.fmt || 'hh:mm:ss';
|
||||
msg = `[${this.time(fmt)}]` + msg;
|
||||
}
|
||||
if (opt.notify) this.notifyStr.push(msg);
|
||||
if (opt.console) console.log(msg);
|
||||
}
|
||||
read_env(Class) {
|
||||
let envStrList = ckNames.map(x => process.env[x]);
|
||||
for (let env_str of envStrList.filter(x => !!x)) {
|
||||
let sp = envSplitor.filter(x => env_str.includes(x));
|
||||
let splitor = sp.length > 0 ? sp[0] : envSplitor[0];
|
||||
for (let ck of env_str.split(splitor).filter(x => !!x)) {
|
||||
this.userList.push(new Class(ck));
|
||||
}
|
||||
}
|
||||
this.userCount = this.userList.length;
|
||||
if (!this.userCount) {
|
||||
this.log(`未找到变量,请检查变量${ckNames.map(x => '['+x+']').join('或')}`, {notify: true});
|
||||
return false;
|
||||
}
|
||||
this.log(`共找到${this.userCount}个账号`);
|
||||
return true;
|
||||
}
|
||||
async threads(taskName, conf, opt = {}) {
|
||||
while (conf.idx < $.userList.length) {
|
||||
let user = $.userList[conf.idx++];
|
||||
await user[taskName](opt);
|
||||
}
|
||||
}
|
||||
async threadTask(taskName, thread) {
|
||||
let taskAll = [];
|
||||
let taskConf = {idx:0};
|
||||
while(thread--) taskAll.push(this.threads(taskName, taskConf));
|
||||
await Promise.all(taskAll);
|
||||
}
|
||||
time(t, x = null) {
|
||||
let xt = x ? new Date(x) : new Date;
|
||||
let e = {
|
||||
"M+": xt.getMonth() + 1,
|
||||
"d+": xt.getDate(),
|
||||
"h+": xt.getHours(),
|
||||
"m+": xt.getMinutes(),
|
||||
"s+": xt.getSeconds(),
|
||||
"q+": Math.floor((xt.getMonth() + 3) / 3),
|
||||
S: this.padStr(xt.getMilliseconds(), 3)
|
||||
};
|
||||
/(y+)/.test(t) && (t = t.replace(RegExp.$1, (xt.getFullYear() + "").substr(4 - RegExp.$1.length)));
|
||||
for(let s in e) new RegExp("(" + s + ")").test(t) && (t = t.replace(RegExp.$1, 1 == RegExp.$1.length ? e[s] : ("00" + e[s]).substr(("" + e[s]).length)));
|
||||
return t;
|
||||
}
|
||||
async showmsg() {
|
||||
if(!this.notifyFlag) return;
|
||||
if(!this.notifyStr.length) return;
|
||||
var notify = require('./sendNotify');
|
||||
this.log('\n============== 推送 ==============');
|
||||
await notify.sendNotify(this.name, this.notifyStr.join('\n'));
|
||||
}
|
||||
padStr(num, length, opt = {}) {
|
||||
let padding = opt.padding || '0';
|
||||
let mode = opt.mode || 'l';
|
||||
let numStr = String(num);
|
||||
let numPad = (length > numStr.length) ? (length - numStr.length) : 0;
|
||||
let pads = '';
|
||||
for (let i=0; i < numPad; i++) {
|
||||
pads += padding;
|
||||
}
|
||||
if (mode == 'r') {
|
||||
numStr = numStr + pads;
|
||||
} else {
|
||||
numStr = pads + numStr;
|
||||
}
|
||||
return numStr;
|
||||
}
|
||||
json2str(obj, c, encode = false) {
|
||||
let ret = [];
|
||||
for (let keys of Object.keys(obj).sort()) {
|
||||
let v = obj[keys];
|
||||
if(v && encode) v = encodeURIComponent(v);
|
||||
ret.push(keys + '=' + v);
|
||||
}
|
||||
return ret.join(c);
|
||||
}
|
||||
str2json(str, decode = false) {
|
||||
let ret = {};
|
||||
for (let item of str.split('&')) {
|
||||
if(!item) continue;
|
||||
let idx = item.indexOf('=');
|
||||
if(idx == -1) continue;
|
||||
let k = item.substr(0, idx);
|
||||
let v = item.substr(idx + 1);
|
||||
if(decode) v = decodeURIComponent(v);
|
||||
ret[k] = v;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
randomPattern(pattern, charset = 'abcdef0123456789') {
|
||||
let str = '';
|
||||
for (let chars of pattern) {
|
||||
if (chars == 'x') {
|
||||
str += charset.charAt(Math.floor(Math.random() * charset.length));
|
||||
} else if (chars == 'X') {
|
||||
str += charset.charAt(Math.floor(Math.random() * charset.length)).toUpperCase();
|
||||
} else {
|
||||
str += chars;
|
||||
}
|
||||
}
|
||||
return str;
|
||||
}
|
||||
randomString(len, charset = 'abcdef0123456789') {
|
||||
let str = '';
|
||||
for (let i = 0; i < len; i++) {
|
||||
str += charset.charAt(Math.floor(Math.random() * charset.length));
|
||||
}
|
||||
return str;
|
||||
}
|
||||
randomList(a) {
|
||||
let idx = Math.floor(Math.random() * a.length);
|
||||
return a[idx];
|
||||
}
|
||||
wait(t) {
|
||||
return new Promise(e => setTimeout(e, t));
|
||||
}
|
||||
async exitNow() {
|
||||
await this.showmsg();
|
||||
let e = Date.now();
|
||||
let s = (e - this.startTime) / 1000;
|
||||
this.log('');
|
||||
this.log(`[${this.name}]运行结束,共运行了${s}秒`, {time: true});
|
||||
process.exit(0);
|
||||
}
|
||||
}
|
||||
(name)
|
||||
}
|
||||
250
jcCheckin.js
250
jcCheckin.js
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user