前言
薅羊毛门槛越来越高了,京东cookie目前有效期只有一天,有些甚至更短。之前扫码登陆目前看来已经获取不到cookie了,现在获取cookie相对麻烦不少。
前段时间很忙,最近闲下来折腾下。看到github上有些脚本,可以抓包获取京东APP请求中cookie,突然有个大胆的想法。如果我让脚本把获取的cookie发送到自己的服务器,服务器自动更新维护cookies.list文件,那么每天打开下APP即可。像IOS有快捷指令APP,让它自动化,每天按时打开京东APP更新cookie,让后服务器自动维护岂不美哉!缺点就是每个用户都得有个可以执行脚本的APP。
废话不多说,干就完了
由于我用的是软路由,openwrt上跑docker(没错,还是LXK0301大佬的那套,自不过修修补补勉强用着,不过目前蛮多用什么面板的!),所以要复杂一点,服务器上部署可以少很多步骤。在openwrt上需要开启frp客户端,然后要映射docker容器端口到本地。还需要一台服务器搭建frp,主要是服务端会搭建在openwrt上,方便外网访问API。在openwrt上部署服务端,接收请求更新本地cookie文件就好了。
服务端
服务端不需要太复杂,用node.js弄个简单的就好了,根据cookie中的pt_pin来替换整行cookie(没有新增哦,只能提换已存在的):
const http = require('http')
const fs = require('fs');
const path = require('path')
const file = path.resolve(__dirname, '../logs/cookies.list') //路径不同需要改改,你当期间脚本文件相对路径
function writeCookie(pt_key, pt_pin) {
const re = new RegExp('.*'+ pt_pin +'.*', 'g')
const cookie = `${pt_key};${pt_pin};`
// console.log(re)
fs.readFile(file,'utf8',function(err,data){
// console.log('替換前' + data)
let result = data.replace(re, cookie);
// console.log('替換後' + result)
fs.writeFile(file, result, 'utf8', function (err) {
if (err){
console.log(err)
}
});
})
}
const server = http.createServer(function(request, response) {
const contentType = request.headers['content-type']
// response.setHeader('Content-type', 'application/json')
// && contentType === 'application/json'
if (request.method === 'POST' && request.url === '/cookie/update') {
let body = [];
request.on('data', (chunk) => {
body.push(chunk);
}).on('end', () => {
// console.log(Buffer.concat(body).toString())
try {
body = JSON.parse(Buffer.concat(body).toString());
if (body.pt_key && body.pt_pin) {
writeCookie(body.pt_key, body.pt_pin)
// console.log(body.pt_key)
response.end('OK');
} else {
response.statusCode = 400;
response.end('Invalid param');
}
} catch (e) {
response.statusCode = 400;
response.end('Invalid param');
}
});
} else {
response.statusCode = 404;
response.end();
}
})
const port = 8888
const host = '0.0.0.0'
server.listen(port, host)
console.log(`Listening at http://${host}:${port}`)
运行 node 脚本名
即可启动服务,对于服务器上部署,我还是推荐使用 pm2 来管理 (至于有什么有点,点进去官网了解下吧!):
# 安装
$ npm install pm2@latest -g
# or
$ yarn global add pm2
# 运行
pm2 start 脚本名
客户端
脚本在此 jd_appopen.js, 只需要稍作修改即可:
/*
杀掉后台后打开京东app获取app_open
在脚本日志查看值
[MITM]
hostname = api.m.jd.com
===========Surge=================
[Script]
jd_appopen = type=http-request,pattern=^https:\/\/api\.m\.jd\.com\/openUpgrade, max-size=0, script-path=jd_appopen.js
===================Quantumult X=====================
[rewrite_local]
# jd_appopen
^https:\/\/api\.m\.jd\.com\/openUpgrade url script-request-header jd_appopen.js
=====================Loon=====================
[Script]
http-request ^https:\/\/api\.m\.jd\.com\/openUpgrade script-path=jd_appopen.js, timeout=3600, tag=jd_appopen
*/
const $ = new Env("app_open")
if ($request.headers) {
let cookie = ($request.headers.Cookie || $request.headers['Cookie'] || $request.headers['cookie'] || '')
let pt_key = cookie.match(/(pt_key=[^;]*)/)[1]
let pt_pin = cookie.match(/(pt_pin=[^;]*)/)[1]
if (pt_key && pt_pin) {
console.log('================')
console.log(`${pt_key};${pt_pin};`)
console.log('================')
const options = {
"url": `换成你的域名/cookie/update`,
'body': JSON.stringify({
"pt_key": pt_key,
"pt_pin": pt_pin
})
}
$.post(options, (err, resp, data) => {
try {
if (err) {
$.msg("app_open获取成功!", `更新cookie失败: ${JSON.stringify(err)}`)
console.log(`pp_open获取成功,更新cookie失败: ${JSON.stringify(err)}`)
} else {
console.log(`更新cookie: ${data}`)
}
} catch (e) {
$.logErr(e, resp)
}
})
}
}
$.done($request.headers)
...
然后使用你手机APP(Surge、Quantumult X、Loon、shadowrocket)添加即可,shadowrocket我试过也可以,成本相对其他app应该便宜点!
IOS快捷指令
在快捷指令APP中添加个自动化,运行前询问看自己情况开启,这里的shadowrocket可以换成其他执行脚本APP,如果你跑脚本的APP常驻打开那么就可以删掉shadowrocket部分,启动此自动化需要打开:
快捷指令有个缺点,不是所有自动化都可以锁屏运行,像这个也是,但是会发送通知,点击通知就可以,或者自己不使用,每天自己手动也是一样的!
结语
没有写很详细,这些也就是大概思路,还有很多值得优化的地方。京东这次动作能刷下不少代挂了,操作成本太高了。对于三五个好友玩玩还行。如果喜欢折腾的应该能按照思路完善吧,写得太详细有时候真不是件好事!
评论 (0)