在现在,商家一年不卖货,双11卖出一年的货是大家都知道的事实了,总得来说调一调蚊子腿的价格,聊胜于无,但是也会有些神价格会出现,这时候买到就是赚到
本来是想趁着双11组台电脑,买个 Z370 的板U套装,没想到京东的 8700k 一直是无货的状态,这几天有货了,价格涨到了3999,简直不能忍,看了下板U套装比较划算,但是有些板U套装是不支持自动下单的,所以 gayhub 搜搜看有没有爬虫可以监听到货自动下单的,正好有了这哥们的 jd-autobuy Python 脚本,还有 Go 的,看了下接口已经很齐全了,来个 node 版本的助助兴
这次用到的 http 库是 axios,支持客户端和服务端,总得来说语法还是很简洁的,在这之前还有个 superagent 库,看了下也差不多,只不过 superagent 在 response 上多处理了下
因为在 vue 中使用了 axios,这次想试试服务端的能力咋样,还是一如既往的好,滋次一波
先写个 request header ,毕竟是服务端,没有浏览器帮你处理 User-Agent,所以自己去浏览器请求下然后把 header 拿到
const defaultInfo = {
header: {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36',
'Content-Type': 'text/plain;charset=utf-8',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.6,en;q=0.4,en-US;q=0.2',
'Connection': 'keep-alive',
},
}
header 拿到我们就可以伪装成浏览器去请求二维码图片了,京东的扫码图片地址 https://qr.m.jd.com/show
,没有多余的技巧,直接用 axios 来个get请求即可
async function requestScan() {
const result = await request({
method: 'get',
url: 'https://qr.m.jd.com/show',
headers: defaultInfo.header,
params: {
appid: 133,
size: 147,
t: new Date().getTime()
},
responseType: 'arraybuffer'
})
}
参数 appid
size
和 t
可以通过抓包拿到的,这里注意我 responseType 用的 arraybuffer
,默认值是 json
,buffer 主要是方便我们来像本地写入图片,我们来处理下 res
defaultInfo.cookies = cookieParser(result.headers['set-cookie'])
defaultInfo.cookieData = result.headers['set-cookie'];
const image_file = result.data;
await writeFile('qr.png', image_file)
async function writeFile(fileName, file) {
return await new Promise((resolve, reject) => {
fs.writeFile(fileName, file, 'binary', err => {
opn('qr.png')
resolve()
})
})
}
这一步 cookie 已经拿到了,这里我做了两步处理,一步是自己写的 cookieParser
把参数进行解析,主要是拿到其中的 wlfstk_smdl
,接下来会用到,然后直接 writeFile 写入图片就行了,写好了之后利用 opn 打开图片,sindresorhus 大神的 opn 库还是蛮好用的,可以指定程序打开图片,文件等
在扫码之前我们要监听扫码的状态
async function listenScan() {
let flag = true