Files
clone_scripts_clone/jd_sign.js
2021-08-17 12:04:49 -04:00

312 lines
10 KiB
JavaScript
Executable File
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 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,
},
};
}