-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
1 changed file
with
192 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,192 @@ | ||
/** | ||
* 扫码获取京东cookie,此方式得到的cookie有效期为30天 | ||
* @Author: LXK9301 https://github.com/LXK9301 | ||
* @Date: 2021-01-13 12:12:40 | ||
* @Last Modified by: LXK9301 | ||
* @Last Modified time: 2021-01-13 12:22:54 | ||
* Modify from FanchangWang https://github.com/FanchangWang | ||
*/ | ||
const $ = new Env('扫码获取京东cookie'); | ||
const qrcode = require('qrcode-terminal'); | ||
let s_token, cookies, guid, lsid, lstoken, okl_token, token | ||
!(async () => { | ||
await loginEntrance(); | ||
await generateQrcode(); | ||
await getCookie(); | ||
})() | ||
.catch((e) => { | ||
$.log('', `❌ ${$.name}, 失败! 原因: ${e}!`, '') | ||
}) | ||
.finally(() => { | ||
// $.done(); | ||
}) | ||
|
||
|
||
function loginEntrance() { | ||
return new Promise((resolve) => { | ||
$.get(taskUrl(), async (err, resp, data) => { | ||
try { | ||
if (err) { | ||
console.log(`${JSON.stringify(err)}`) | ||
console.log(`${$.name} API请求失败,请检查网路重试`); | ||
} else { | ||
$.headers = resp.headers; | ||
$.data = JSON.parse(data); | ||
await formatSetCookies($.headers, $.data); | ||
} | ||
} catch (e) { | ||
$.logErr(e, resp) | ||
} finally { | ||
resolve(); | ||
} | ||
}) | ||
}) | ||
} | ||
|
||
function generateQrcode() { | ||
return new Promise((resolve) => { | ||
$.post(taskPostUrl(), (err, resp, data) => { | ||
try { | ||
if (err) { | ||
console.log(`${JSON.stringify(err)}`) | ||
console.log(`${$.name} API请求失败,请检查网路重试`); | ||
} else { | ||
$.stepsHeaders = resp.headers; | ||
data = JSON.parse(data); | ||
token = data['token']; | ||
// $.log('token', token) | ||
|
||
const setCookie = resp.headers['set-cookie'][0]; | ||
okl_token = setCookie.substring(setCookie.indexOf("=") + 1, setCookie.indexOf(";")) | ||
const url = 'https://plogin.m.jd.com/cgi-bin/m/tmauth?appid=300&client_type=m&token=' + token; | ||
qrcode.generate(url, {small: true}); // 输出二维码 | ||
console.log("请打开 京东APP 扫码登录(二维码有效期为3分钟)"); | ||
console.log(`\n\n注:如扫描不到,请使用工具(例如在线二维码工具:https://cli.im)手动生成如下url二维码\n\n${url}\n\n`); | ||
} | ||
} catch (e) { | ||
$.logErr(e, resp) | ||
} finally { | ||
resolve(); | ||
} | ||
}) | ||
}) | ||
} | ||
|
||
function checkLogin() { | ||
return new Promise((resolve) => { | ||
const options = { | ||
url: `https://plogin.m.jd.com/cgi-bin/m/tmauthchecktoken?&token=${token}&ou_state=0&okl_token=${okl_token}`, | ||
body: `lang=chs&appid=300&source=wq_passport&returnurl=https://wqlogin2.jd.com/passport/LoginRedirect?state=${Date.now()}&returnurl=//home.m.jd.com/myJd/newhome.action?sceneval=2&ufc=&/myJd/home.action`, | ||
headers: { | ||
'Referer': `https://plogin.m.jd.com/login/login?appid=300&returnurl=https://wqlogin2.jd.com/passport/LoginRedirect?state=${Date.now()}&returnurl=//home.m.jd.com/myJd/newhome.action?sceneval=2&ufc=&/myJd/home.action&source=wq_passport`, | ||
'Cookie': cookies, | ||
'Connection': 'Keep-Alive', | ||
'Content-Type': 'application/x-www-form-urlencoded; Charset=UTF-8', | ||
'Accept': 'application/json, text/plain, */*', | ||
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36', | ||
} | ||
} | ||
$.post(options, (err, resp, data) => { | ||
try { | ||
if (err) { | ||
console.log(`${JSON.stringify(err)}`) | ||
console.log(`${$.name} API请求失败,请检查网路重试`); | ||
} else { | ||
data = JSON.parse(data); | ||
$.checkLoginHeaders = resp.headers; | ||
// $.log(`errcode:${data['errcode']}`) | ||
} | ||
} catch (e) { | ||
$.logErr(e, resp) | ||
} finally { | ||
resolve(data); | ||
} | ||
}) | ||
}) | ||
} | ||
|
||
function getCookie() { | ||
$.timer = setInterval(async () => { | ||
const checkRes = await checkLogin(); | ||
if (checkRes['errcode'] === 0) { | ||
//扫描登录成功 | ||
$.log(`扫描登录成功\n`) | ||
clearInterval($.timer); | ||
await formatCookie($.checkLoginHeaders); | ||
$.done(); | ||
} else if (checkRes['errcode'] === 21) { | ||
$.log(`二维码已失效,请重新获取二维码重新扫描\n`); | ||
clearInterval($.timer); | ||
$.done(); | ||
} else if (checkRes['errcode'] === 176) { | ||
//未扫描登录 | ||
} else { | ||
$.log(`其他异常:${JSON.stringify(checkRes)}\n`); | ||
clearInterval($.timer); | ||
$.done(); | ||
} | ||
}, 1000) | ||
} | ||
|
||
function formatCookie(headers) { | ||
new Promise(resolve => { | ||
let pt_key = headers['set-cookie'][1] | ||
pt_key = pt_key.substring(pt_key.indexOf("=") + 1, pt_key.indexOf(";")) | ||
let pt_pin = headers['set-cookie'][2] | ||
pt_pin = pt_pin.substring(pt_pin.indexOf("=") + 1, pt_pin.indexOf(";")) | ||
const cookie1 = "pt_key=" + pt_key + ";pt_pin=" + pt_pin + ";"; | ||
|
||
$.UserName = decodeURIComponent(cookie1.match(/pt_pin=([^; ]+)(?=;?)/) && cookie1.match(/pt_pin=([^; ]+)(?=;?)/)[1]) | ||
$.log(`京东用户:${$.UserName} Cookie获取成功,cookie如下:`); | ||
$.log(`\n${cookie1}\n`); | ||
resolve() | ||
}) | ||
} | ||
|
||
function formatSetCookies(headers, body) { | ||
new Promise(resolve => { | ||
s_token = body['s_token'] | ||
guid = headers['set-cookie'][0] | ||
guid = guid.substring(guid.indexOf("=") + 1, guid.indexOf(";")) | ||
lsid = headers['set-cookie'][2] | ||
lsid = lsid.substring(lsid.indexOf("=") + 1, lsid.indexOf(";")) | ||
lstoken = headers['set-cookie'][3] | ||
lstoken = lstoken.substring(lstoken.indexOf("=") + 1, lstoken.indexOf(";")) | ||
cookies = "guid=" + guid + "; lang=chs; lsid=" + lsid + "; lstoken=" + lstoken + "; " | ||
resolve() | ||
}) | ||
} | ||
|
||
function taskUrl() { | ||
return { | ||
url: `https://plogin.m.jd.com/cgi-bin/mm/new_login_entrance?lang=chs&appid=300&returnurl=https://wq.jd.com/passport/LoginRedirect?state=${Date.now()}&returnurl=https://home.m.jd.com/myJd/newhome.action?sceneval=2&ufc=&/myJd/home.action&source=wq_passport`, | ||
headers: { | ||
'Connection': 'Keep-Alive', | ||
'Content-Type': 'application/x-www-form-urlencoded', | ||
'Accept': 'application/json, text/plain, */*', | ||
'Accept-Language': 'zh-cn', | ||
'Referer': `https://plogin.m.jd.com/login/login?appid=300&returnurl=https://wq.jd.com/passport/LoginRedirect?state=${Date.now()}&returnurl=https://home.m.jd.com/myJd/newhome.action?sceneval=2&ufc=&/myJd/home.action&source=wq_passport`, | ||
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36', | ||
'Host': 'plogin.m.jd.com' | ||
} | ||
} | ||
} | ||
|
||
function taskPostUrl() { | ||
return { | ||
url: `https://plogin.m.jd.com/cgi-bin/m/tmauthreflogurl?s_token=${s_token}&v=${Date.now()}&remember=true`, | ||
body: `lang=chs&appid=300&source=wq_passport&returnurl=https://wqlogin2.jd.com/passport/LoginRedirect?state=${Date.now()}&returnurl=//home.m.jd.com/myJd/newhome.action?sceneval=2&ufc=&/myJd/home.action`, | ||
headers: { | ||
'Connection': 'Keep-Alive', | ||
'Content-Type': 'application/x-www-form-urlencoded', | ||
'Accept': 'application/json, text/plain, */*', | ||
'Accept-Language': 'zh-cn', | ||
'Referer': `https://plogin.m.jd.com/login/login?appid=300&returnurl=https://wq.jd.com/passport/LoginRedirect?state=${Date.now()}&returnurl=https://home.m.jd.com/myJd/newhome.action?sceneval=2&ufc=&/myJd/home.action&source=wq_passport`, | ||
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36', | ||
'Host': 'plogin.m.jd.com' | ||
} | ||
} | ||
} | ||
|
||
// prettier-ignore | ||
function Env(t,e){"undefined"!=typeof process&&JSON.stringify(process.env).indexOf("GITHUB")>-1&&process.exit(0);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,i)=>{s.call(this,t,(t,s,r)=>{t?i(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.startTime=(new Date).getTime(),Object.assign(this,e),this.log("",`🔔${this.name}, 开始!`)}isNode(){return"undefined"!=typeof module&&!!module.exports}isQuanX(){return"undefined"!=typeof $task}isSurge(){return"undefined"!=typeof $httpClient&&"undefined"==typeof $loon}isLoon(){return"undefined"!=typeof $loon}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 i=this.getdata(t);if(i)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,i)=>e(i))})}runScript(t,e){return new Promise(s=>{let i=this.getdata("@chavy_boxjs_userCfgs.httpapi");i=i?i.replace(/\n/g,"").trim():i;let r=this.getdata("@chavy_boxjs_userCfgs.httpapi_timeout");r=r?1*r:20,r=e&&e.timeout?e.timeout:r;const[o,h]=i.split("@"),n={url:`http://${h}/v1/scripting/evaluate`,body:{script_text:t,mock_type:"cron",timeout:r},headers:{"X-Key":o,Accept:"*/*"}};this.post(n,(t,e,i)=>s(i))}).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),i=!s&&this.fs.existsSync(e);if(!s&&!i)return{};{const i=s?t:e;try{return JSON.parse(this.fs.readFileSync(i))}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),i=!s&&this.fs.existsSync(e),r=JSON.stringify(this.data);s?this.fs.writeFileSync(t,r):i?this.fs.writeFileSync(e,r):this.fs.writeFileSync(t,r)}}lodash_get(t,e,s){const i=e.replace(/\[(\d+)\]/g,".$1").split(".");let r=t;for(const t of i)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,i)=>Object(t[s])===t[s]?t[s]:t[s]=Math.abs(e[i+1])>>0==+e[i+1]?[]:{},t)[e[e.length-1]]=s,t)}getdata(t){let e=this.getval(t);if(/^@/.test(t)){const[,s,i]=/^@(.*?)\.(.*?)$/.exec(t),r=s?this.getval(s):"";if(r)try{const t=JSON.parse(r);e=t?this.lodash_get(t,i,""):e}catch(t){e=""}}return e}setdata(t,e){let s=!1;if(/^@/.test(e)){const[,i,r]=/^@(.*?)\.(.*?)$/.exec(e),o=this.getval(i),h=i?"null"===o?null:o||"{}":"{}";try{const e=JSON.parse(h);this.lodash_set(e,r,t),s=this.setval(JSON.stringify(e),i)}catch(e){const o={};this.lodash_set(o,r,t),s=this.setval(JSON.stringify(o),i)}}else s=this.setval(t,e);return s}getval(t){return this.isSurge()||this.isLoon()?$persistentStore.read(t):this.isQuanX()?$prefs.valueForKey(t):this.isNode()?(this.data=this.loaddata(),this.data[t]):this.data&&this.data[t]||null}setval(t,e){return this.isSurge()||this.isLoon()?$persistentStore.write(t,e):this.isQuanX()?$prefs.setValueForKey(t,e):this.isNode()?(this.data=this.loaddata(),this.data[e]=t,this.writedata(),!0):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=(()=>{})){t.headers&&(delete t.headers["Content-Type"],delete t.headers["Content-Length"]),this.isSurge()||this.isLoon()?(this.isSurge()&&this.isNeedRewrite&&(t.headers=t.headers||{},Object.assign(t.headers,{"X-Surge-Skip-Scripting":!1})),$httpClient.get(t,(t,s,i)=>{!t&&s&&(s.body=i,s.statusCode=s.status),e(t,s,i)})):this.isQuanX()?(this.isNeedRewrite&&(t.opts=t.opts||{},Object.assign(t.opts,{hints:!1})),$task.fetch(t).then(t=>{const{statusCode:s,statusCode:i,headers:r,body:o}=t;e(null,{status:s,statusCode:i,headers:r,body:o},o)},t=>e(t))):this.isNode()&&(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:s,statusCode:i,headers:r,body:o}=t;e(null,{status:s,statusCode:i,headers:r,body:o},o)},t=>{const{message:s,response:i}=t;e(s,i,i&&i.body)}))}post(t,e=(()=>{})){if(t.body&&t.headers&&!t.headers["Content-Type"]&&(t.headers["Content-Type"]="application/x-www-form-urlencoded"),t.headers&&delete t.headers["Content-Length"],this.isSurge()||this.isLoon())this.isSurge()&&this.isNeedRewrite&&(t.headers=t.headers||{},Object.assign(t.headers,{"X-Surge-Skip-Scripting":!1})),$httpClient.post(t,(t,s,i)=>{!t&&s&&(s.body=i,s.statusCode=s.status),e(t,s,i)});else if(this.isQuanX())t.method="POST",this.isNeedRewrite&&(t.opts=t.opts||{},Object.assign(t.opts,{hints:!1})),$task.fetch(t).then(t=>{const{statusCode:s,statusCode:i,headers:r,body:o}=t;e(null,{status:s,statusCode:i,headers:r,body:o},o)},t=>e(t));else if(this.isNode()){this.initGotEnv(t);const{url:s,...i}=t;this.got.post(s,i).then(t=>{const{statusCode:s,statusCode:i,headers:r,body:o}=t;e(null,{status:s,statusCode:i,headers:r,body:o},o)},t=>{const{message:s,response:i}=t;e(s,i,i&&i.body)})}}time(t,e=null){const s=e?new Date(e):new Date;let i={"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 i)new RegExp("("+e+")").test(t)&&(t=t.replace(RegExp.$1,1==RegExp.$1.length?i[e]:("00"+i[e]).substr((""+i[e]).length)));return t}msg(e=t,s="",i="",r){const o=t=>{if(!t)return t;if("string"==typeof t)return this.isLoon()?t:this.isQuanX()?{"open-url":t}:this.isSurge()?{url:t}:void 0;if("object"==typeof t){if(this.isLoon()){let e=t.openUrl||t.url||t["open-url"],s=t.mediaUrl||t["media-url"];return{openUrl:e,mediaUrl:s}}if(this.isQuanX()){let e=t["open-url"]||t.url||t.openUrl,s=t["media-url"]||t.mediaUrl;return{"open-url":e,"media-url":s}}if(this.isSurge()){let e=t.url||t.openUrl||t["open-url"];return{url:e}}}};if(this.isMute||(this.isSurge()||this.isLoon()?$notification.post(e,s,i,o(r)):this.isQuanX()&&$notify(e,s,i,o(r))),!this.isMuteLog){let t=["","==============📣系统通知📣=============="];t.push(e),s&&t.push(s),i&&t.push(i),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){const s=!this.isSurge()&&!this.isQuanX()&&!this.isLoon();s?this.log("",`❗️${this.name}, 错误!`,t.stack):this.log("",`❗️${this.name}, 错误!`,t)}wait(t){return new Promise(e=>setTimeout(e,t))}done(t={}){const e=(new Date).getTime(),s=(e-this.startTime)/1e3;this.log("",`🔔${this.name}, 结束! 🕛 ${s} 秒`),this.log(),(this.isSurge()||this.isQuanX()||this.isLoon())&&$done(t)}}(t,e)} |