mirror of
https://github.com/lan-tianxiang/clone_scripts.git
synced 2026-02-05 07:03:12 +08:00
312 lines
10 KiB
JavaScript
Executable File
312 lines
10 KiB
JavaScript
Executable File
/*
|
||
cron 14 10 * * * https://raw.githubusercontent.com/smiek2221/scripts/master/jd_sign_graphics.js
|
||
只支持nodejs环境
|
||
需要安装依赖
|
||
npm i png-js 或者 npm i png-js -S
|
||
|
||
如果 read ECONNRESET 错误 可以试试
|
||
环境变量 JOY_HOST
|
||
修改域名 https://jdjoy.jd.com 可以改成ip https://49.7.27.236
|
||
*/
|
||
|
||
const jd_env = require("./utils/JDEnv.js");
|
||
const $ = jd_env.env("京东签到图形验证");
|
||
const validator = require("./utils/JDJRValidator_Pure.js");
|
||
const Faker = require("./utils/sign_graphics_validate.js");
|
||
const notify = $.isNode() ? require("./sendNotify") : "";
|
||
//Node.js用户请在jdCookie.js处填写京东ck;
|
||
const jdCookieNode = $.isNode() ? require("./jdCookie.js") : "";
|
||
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);
|
||
}
|
||
let message = "",
|
||
subTitle = "",
|
||
beanNum = 0;
|
||
let fp = "";
|
||
let eid = "";
|
||
let UA = "";
|
||
let signFlag = false;
|
||
let successNum = 0;
|
||
let errorNum = 0;
|
||
let JD_API_HOST = "https://jdjoy.jd.com";
|
||
$.invokeKey = "ztmFUCxcPMNyUq0P"
|
||
if (process.env.JOY_HOST) {
|
||
JD_API_HOST = process.env.JOY_HOST;
|
||
}
|
||
|
||
const turnTableId = [
|
||
{
|
||
name: "京东商城-内衣",
|
||
id: 1071,
|
||
url: "https://prodev.m.jd.com/mall/active/4PgpL1xqPSW1sVXCJ3xopDbB1f69/index.html",
|
||
},
|
||
{
|
||
name: "京东商城-健康",
|
||
id: 527,
|
||
url: "https://prodev.m.jd.com/mall/active/w2oeK5yLdHqHvwef7SMMy4PL8LF/index.html",
|
||
},
|
||
{
|
||
name: "京东商城-清洁",
|
||
id: 446,
|
||
url: "https://prodev.m.jd.com/mall/active/2Tjm6ay1ZbZ3v7UbriTj6kHy9dn6/index.html",
|
||
},
|
||
{
|
||
name: "京东商城-个护",
|
||
id: 336,
|
||
url: "https://prodev.m.jd.com/mall/active/2tZssTgnQsiUqhmg5ooLSHY9XSeN/index.html",
|
||
},
|
||
{
|
||
name: "京东商城-童装",
|
||
id: 511,
|
||
url: "https://prodev.m.jd.com/mall/active/3Af6mZNcf5m795T8dtDVfDwWVNhJ/index.html",
|
||
},
|
||
{
|
||
name: "京东商城-母婴",
|
||
id: 458,
|
||
url: "https://prodev.m.jd.com/mall/active/3BbAVGQPDd6vTyHYjmAutXrKAos6/index.html",
|
||
},
|
||
{
|
||
name: "京东商城-数码",
|
||
id: 347,
|
||
url: "https://prodev.m.jd.com/mall/active/4SWjnZSCTHPYjE5T7j35rxxuMTb6/index.html",
|
||
},
|
||
{
|
||
name: "京东超市",
|
||
id: 1204,
|
||
url: "https://pro.m.jd.com/mall/active/QPwDgLSops2bcsYqQ57hENGrjgj/index.html",
|
||
},
|
||
];
|
||
$.UA = $.isNode()
|
||
? process.env.JD_USER_AGENT
|
||
? process.env.JD_USER_AGENT
|
||
: require("./USER_AGENTS").USER_AGENT
|
||
: $.getdata("JDUA")
|
||
? $.getdata("JDUA")
|
||
: "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";
|
||
$.get = validator.injectToRequest2($.get.bind($), "channelSign", $.UA);
|
||
$.post = validator.injectToRequest2($.post.bind($), "channelSign", $.UA);
|
||
|
||
!(async () => {
|
||
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;
|
||
}
|
||
for (let i = 0; i < cookiesArr.length; i++) {
|
||
if (cookiesArr[i]) {
|
||
cookie = cookiesArr[i];
|
||
$.UserName = decodeURIComponent(cookie.match(/pt_pin=(.+?);/) && cookie.match(/pt_pin=(.+?);/)[1]);
|
||
$.index = i + 1;
|
||
$.nickName = "";
|
||
console.log(`\n开始【京东账号${$.index}】${$.nickName || $.UserName}\n`);
|
||
beanNum = 0;
|
||
successNum = 0;
|
||
errorNum = 0;
|
||
subTitle = "";
|
||
await signRun();
|
||
const UTC8 = new Date().getTime() + new Date().getTimezoneOffset() * 60000 + 28800000;
|
||
$.beanSignTime = new Date(UTC8).toLocaleString("zh", {
|
||
hour12: false,
|
||
});
|
||
let msg = `【京东账号${$.index}】${$.nickName || $.UserName}\n【签到时间】: ${$.beanSignTime}\n【签到概览】: 成功${successNum}个, 失败${errorNum}个\n【签到奖励】: ${beanNum}京豆\n`;
|
||
message += msg + "\n";
|
||
$.msg($.name, msg);
|
||
// break
|
||
}
|
||
}
|
||
await showMsg();
|
||
})()
|
||
.catch((e) => {
|
||
$.log("", `❌ ${$.name}, 失败! 原因: ${e}!`, "");
|
||
})
|
||
.finally(() => {
|
||
$.done();
|
||
});
|
||
|
||
async function showMsg() {
|
||
$.msg($.name, `【签到数量】: ${turnTableId.length}个\n` + subTitle + message);
|
||
if ($.isNode() && message) await notify.sendNotify(`${$.name}`, `【签到数量】: ${turnTableId.length}个\n` + subTitle + message);
|
||
}
|
||
async function signRun() {
|
||
for (let i in turnTableId) {
|
||
signFlag = false;
|
||
await Login(i);
|
||
if (signFlag) {
|
||
successNum++;
|
||
} else {
|
||
errorNum++;
|
||
}
|
||
}
|
||
}
|
||
|
||
function Sign(i) {
|
||
return new Promise((resolve) => {
|
||
$.post(tasPostkUrl(turnTableId[i].id), (err, resp, data) => {
|
||
try {
|
||
if (err) {
|
||
console.log(`\n${turnTableId[i].name} 签到: API查询请求失败 ‼️‼️`);
|
||
throw new Error(err);
|
||
} else {
|
||
if (data) {
|
||
// console.log(data)
|
||
data = JSON.parse(data);
|
||
if (data.success && data.data) {
|
||
data = data.data;
|
||
if (Number(data.jdBeanQuantity) > 0) beanNum += Number(data.jdBeanQuantity);
|
||
signFlag = true;
|
||
console.log(`${turnTableId[i].name} 签到成功:获得 ${Number(data.jdBeanQuantity)}京豆`);
|
||
} else {
|
||
if (data.errorMessage) {
|
||
if (data.errorMessage.indexOf("已签到") > -1 || data.errorMessage.indexOf("今天已经签到") > -1) {
|
||
signFlag = true;
|
||
}
|
||
console.log(`${turnTableId[i].name} ${data.errorMessage}`);
|
||
} else {
|
||
console.log(`${turnTableId[i].name} ${JSON.stringify(data)}`);
|
||
}
|
||
}
|
||
} else {
|
||
console.log(`京豆api返回数据为空,请检查自身原因`);
|
||
}
|
||
}
|
||
} catch (e) {
|
||
$.logErr(e, resp);
|
||
} finally {
|
||
resolve(data);
|
||
}
|
||
});
|
||
});
|
||
}
|
||
|
||
function Login(i) {
|
||
return new Promise((resolve) => {
|
||
$.get(taskUrl(turnTableId[i].id), async (err, resp, data) => {
|
||
try {
|
||
if (err) {
|
||
console.log(`\n${turnTableId[i].name} 登录: API查询请求失败 ‼️‼️`);
|
||
console.log(`${JSON.stringify(err)}`);
|
||
} else {
|
||
if (data) {
|
||
// console.log(data)
|
||
data = JSON.parse(data);
|
||
if (data.success && data.data) {
|
||
data = data.data;
|
||
if (!data.hasSign) {
|
||
let arr = await Faker.getBody(UA, turnTableId[i].url);
|
||
fp = arr.fp;
|
||
await getEid(arr);
|
||
await Sign(i);
|
||
} else {
|
||
if (data.records && data.records[0]) {
|
||
for (let i in data.records) {
|
||
let item = data.records[i];
|
||
if ((item.hasSign == false && item.index != 1) || i == data.records.length - 1) {
|
||
if (item.hasSign == false) i = i - 1;
|
||
beanNum += Number(data.records[i].beanQuantity);
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
signFlag = true;
|
||
console.log(`${turnTableId[i].name} 已签到`);
|
||
}
|
||
} else {
|
||
if (data.errorMessage) {
|
||
if (data.errorMessage.indexOf("已签到") > -1 || data.errorMessage.indexOf("今天已经签到") > -1) {
|
||
signFlag = true;
|
||
}
|
||
console.log(`${turnTableId[i].name} ${data.errorMessage}`);
|
||
} else {
|
||
console.log(`${turnTableId[i].name} ${JSON.stringify(data)}`);
|
||
}
|
||
}
|
||
} else {
|
||
console.log(`京豆api返回数据为空,请检查自身原因`);
|
||
}
|
||
}
|
||
} catch (e) {
|
||
$.logErr(e, resp);
|
||
} finally {
|
||
resolve(data);
|
||
}
|
||
});
|
||
});
|
||
}
|
||
|
||
function getEid(arr) {
|
||
return new Promise((resolve) => {
|
||
const options = {
|
||
url: `https://gia.jd.com/fcf.html?a=${arr.a}`,
|
||
body: `d=${arr.d}`,
|
||
headers: {
|
||
"Content-Type": "application/x-www-form-urlencoded;charset=UTF-8",
|
||
"User-Agent": $.UA,
|
||
},
|
||
};
|
||
$.post(options, async (err, resp, data) => {
|
||
try {
|
||
if (err) {
|
||
console.log(`\n${turnTableId[i].name} 登录: API查询请求失败 ‼️‼️`);
|
||
throw new Error(err);
|
||
} else {
|
||
if (data.indexOf("*_*") > 0) {
|
||
data = data.split("*_*", 2);
|
||
data = JSON.parse(data[1]);
|
||
eid = data.eid;
|
||
} else {
|
||
console.log(`京豆api返回数据为空,请检查自身原因`);
|
||
}
|
||
}
|
||
} catch (e) {
|
||
$.logErr(e, resp);
|
||
} finally {
|
||
resolve(data);
|
||
}
|
||
});
|
||
});
|
||
}
|
||
|
||
function taskUrl(turnTableId) {
|
||
const url = `${JD_API_HOST}/api/turncard/channel/detail?turnTableId=${turnTableId}&invokeKey=${$.invokeKey}`;
|
||
return {
|
||
url,
|
||
headers: {
|
||
Accept: "application/json, text/plain, */*",
|
||
"Accept-Encoding": "gzip, deflate, br",
|
||
"Accept-Language": "zh-cn",
|
||
Connection: "keep-alive",
|
||
Cookie: cookie,
|
||
Host: `jdjoy.jd.com`,
|
||
Origin: "https://prodev.m.jd.com",
|
||
Referer: "https://prodev.m.jd.com/",
|
||
"User-Agent": $.UA,
|
||
},
|
||
};
|
||
}
|
||
|
||
function tasPostkUrl(turnTableId) {
|
||
const url = `${JD_API_HOST}/api/turncard/channel/sign?turnTableId=${turnTableId}&fp=${fp}&eid=${eid}&invokeKey=${$.invokeKey}`;
|
||
return {
|
||
url,
|
||
headers: {
|
||
Accept: "application/json, text/plain, */*",
|
||
"Accept-Encoding": "gzip, deflate, br",
|
||
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8",
|
||
Connection: "keep-alive",
|
||
"Content-Type": "application/x-www-form-urlencoded",
|
||
Cookie: cookie,
|
||
Host: `jdjoy.jd.com`,
|
||
Origin: "https://prodev.m.jd.com",
|
||
Referer: "https://prodev.m.jd.com/",
|
||
"User-Agent": $.UA,
|
||
},
|
||
};
|
||
} |