-
Notifications
You must be signed in to change notification settings - Fork 17
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
趁着双11,写个京东商品自动下单 #13
Comments
手动点赞 |
@sconts 哈哈,谢谢,昨晚已剁手 |
可以可以 |
厉害了,你搞个大件更厉害了 |
|
@wanghewanghe 谢谢,已更正 |
厉害了,虽然没看懂 |
哈哈哈哈有没有tb抢券的,抢的我都憔悴了 |
@ogurigin 没有,不怎么关注淘宝,基本上东西都在京东买,看重的就是物流和售后哈哈 |
@shaodahong 你好,我在windows上跑了你的脚本完全没有问题,但是在Ubuntu 16.4上运行的时候,login 这一步完全得不到p3p和set-cookie的信息, 不知道你有没有什么解决方案,谢谢。我的Node和NPM版本如下 |
这几天在玩 不知道是否有啥其他字段也在限制商品的是否可买状态? |
不清楚,这个项目很老了,我也很久没有更新了,从 issue 来看属于半废状态,可以自己去京东下单抓下接口看看 |
嗯, 现在最新是 |
项目地址 求个 star
在现在,商家一年不卖货,双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 拿到
header 拿到我们就可以伪装成浏览器去请求二维码图片了,京东的扫码图片地址
https://qr.m.jd.com/show
,没有多余的技巧,直接用 axios 来个get请求即可参数
appid
size
和t
可以通过抓包拿到的,这里注意我 responseType 用的arraybuffer
,默认值是json
,buffer 主要是方便我们来像本地写入图片,我们来处理下 res这一步 cookie 已经拿到了,这里我做了两步处理,一步是自己写的
cookieParser
把参数进行解析,主要是拿到其中的wlfstk_smdl
,接下来会用到,然后直接 writeFile 写入图片就行了,写好了之后利用 opn 打开图片,sindresorhus 大神的 opn 库还是蛮好用的,可以指定程序打开图片,文件等在扫码之前我们要监听扫码的状态
一开始的想法是开个定时器来轮询下:"好没好呀",没有我1秒后再来问下,这里使用 async/await的强大功能实现个 sleep,比 setTimeout 的使用更优雅而且对于异步的处理也能够操控自如
这里我们把 header 组合一下,刚刚拿到的 cookie 带上,并加上
host
和referer
来表明我们从哪里来要到哪里去,参数里面的 token 就是之前解析 cookie 拿到的 wlfstk_smdl ,这个接口应该约定的 jQuery jsonp(京东看了下 jsonp 还是蛮多的),所以我这里使用一个 callback 来模拟一个 jsonp 的执行,看返回的 code 和 msg,code 为 200 的时候说明扫码成功了,这时候 msg 是没有的,所以自定义下,其他状态是有 msg 的,直接输出就 OK 了,扫码成功我们要拿到ticket
,这个从字面上理解就知道了,大兄弟你拿到入场券了,并且 ticket 下单的时候也是需要的,存起来这时候用你的手机打开京东扫一扫打开的二维码图片,确认后扫码成功,用入场券登录去
这一步没什么说的,入场券有了,理所应当登录成功了,拿到 p3p 参数并且更新下 cookie 这样一个合法的身份就诞生了
有了身份后就可以去 get 商品页面,这一步需要拿三个请求的信息拼一下
拿到商品页面的 html
拿到商品的价格
拿到商品的状态
最后 Promise.all 一波带走
这里要解析 dom,
$
就是有着 Node 版 jQuery 之称的 cheerio,但是如果直接解析会乱码,先转码,转码神器出场 iconv-lite,剩下的就是 jQuery 操作了,很久没写 jQuery 了,写起来还是这么的顺溜defaultInfo 中的 goodId 是商品的 id,下面会说到,解析命令行的参数获得的,在哪里能看到呢,来图
areaId 是对应着区域的信息,毕竟每个城市的库存都是不一样的
京东购物的流程购物车先走一波,然后开始下单付款,有货了我们加入购物车
没什么可说的,加入后开始下单
其实这里 post http://trade.jd.com/shopping/order/submitOrder.action 这个就可以了,前面的一个请求是下单页面拿一下订单的信息展示下,这里会有两个注意的点
商品的数量
京东下单是把购物车这个商品全部下单,不管数量的,比如你购物车已经有一件这个商品了,那么前面的流程走完后购物车现在有两件这个商品,下单后是下单了两件,当然了这里是可以更改数量的,但是我没写
订单的参数
上面下单的请求可以注意到三个陌生的参数
submitOrderParam.trackID
submitOrderParam.eid
submitOrderParam.fp
,trackID 前面有拿到过,这里直接用就行了,那么 eid 和 fp 是从哪来的呢?答案是登录页面,但是这里有个坑是 request 返回的页面拿到的 dom 元素是不行的,只能通过浏览器来,这也很好办,Node 有 phantomjs,但是这里我用了 Chrome 出品的 puppeteerpuppeteer 使用也很简单,它是基于 Node 的 headless Chrome 工具
puppeteer 首先要 launch 后来生成一个 browser 的实例,我们用 browser 来新建一个页面运行我们的网址,并且我们可以在它提供的 evaluate 方法中操作 DOM,上面的代码也是很简单的,一目了然
至此基本上一个自动下单的功能就完成了,再扩展下命令行参数
这里我给了两个必需的参数和两个可选的参数,
-a
必须要的,地区编号,-g
必要要的,商品编号,-t
商品查询的间隔时间,默认是10s,-b
是否自动购买,默认是购买的,这里是 boolean,yargs 还是蛮好用的,也可以用 TJ 大神的 commander,都是一样的完整的代码可以去下面的项目地址中查看
项目地址 求个 star
The text was updated successfully, but these errors were encountered: