irpas技术客

听说某宝抢购脚本大家都会了?那就在来个某东茅台抢购脚本吧。_爬遍天下无敌手_京东 api 抓包 抢券

网络投稿 7861

前言

? ? ? 某宝脚本一搜能搜一大堆,就是不知道具体有没有用,但是这款某东的代码于11-17还是可用的,大家拿去白嫖吧!

需要用到的一些工具 Python版本:3.7.8 相关模块: DecryptLogin模块; argparse模块; requests模块; pyttsx3模块; beautifulsoup4模块; prettytable模块; 以及一些python自带的模块。 环境搭建

安装Python并添加到环境变量,pip安装需要的相关模块即可。

?

具体而言,就是先用DecryptLogin实现京东商城的模拟登录操作,然后再查询登录账号的购物车中的商品信息,接着打印这些商品信息供用户选择需要抢购的商品,最后用程序实现自动下单抢购目标商品。

因为整个逻辑很简单,也没有考虑一些可能存在的异常情况(毕竟只是一个简单的小案例,主要目的还是学习python和爬虫),所以整体实现起来其实蛮简单的。首先pip安装一下DecryptLogin包:

pip install DecryptLogin

具体而言,就是先用DecryptLogin实现京东商城的模拟登录操作,然后再查询登录账号的购物车中的商品信息,接着打印这些商品信息供用户选择需要抢购的商品,最后用程序实现自动下单抢购目标商品。

因为整个逻辑很简单,也没有考虑一些可能存在的异常情况(毕竟只是一个简单的小案例,主要目的还是学习python和爬虫),所以整体实现起来其实蛮简单的。首先pip安装一下DecryptLogin包:

pip install DecryptLogin

然后简单几行代码就能实现京东商城的模拟登录操作啦:

from DecryptLogin import login '''模拟登录''' def login(self): lg = login.Login() infos_return, session = lg.jingdong() return infos_return, session

另外,为了避免经常需要重复扫码登录的问题,我加了个导入历史cookies的代码段(淘宝抢购那个脚本也有):

if os.path.isfile(cookie_cache_name): self.session = requests.Session() loadSessionCookies(self.session, cookie_cache_name) else: self.infos_return, self.session = self.login() saveSessionCookies(self.session, cookie_cache_name)

但是没有加验证cookies是否还在有效期内的代码,感兴趣的同学可以自己添加一下,不感兴趣的同学每次过段时间代码报错就自己手动删下:

cookie_cache.pkl

这个文件吧,作为懒惰的惩罚吧,就在你运行代码的那个文件夹里。

接着,我们来获取一下当前购物车里的商品信息,和之前一样,简单抓包的结果如下:

?

代码实现如下:

cart_url = 'https://api.m.jd.com/api?' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.82 Safari/537.36', 'origin': 'https://cart.jd.com', 'Referer': 'https://cart.jd.com', } data = { 'functionId': 'pcCart_jc_getCurrentCart', 'appid': 'JDC_mall_cart', 'loginType': '3', } response = self.session.post(cart_url, headers=headers, data=data) print(response.text)

????????

?

?看起来没什么问题,把我们需要的数据提取出来:

response_json, cart_infos = response.json(), {} for idx, item in enumerate(response_json['resultData']['cartInfo']['vendors']): cart_info = { 'title': self.rematch(r"'Name': '(.*?)',", str(item)), 'Id': item['sorted'][0]['item']['Id'], 'skuUuid': self.rematch(r"'skuUuid': '(.*?)',", str(item)), 'IdForOldVersion': self.rematch(r"'IdForOldVersion': (.*?),", str(item)), 'SType': '11', } cart_infos[str(idx)] = cart_info

接着打印并让用户选择想要抢购的商品信息:

# 打印并选择想要抢购的商品信息 title, items = ['id', 'title'], [] for key, value in cart_infos.items(): items.append([key, value['title']]) self.printTable(title, items) good_id = input('请选择想要抢购的商品编号(例如"0"): ') assert good_id in cart_infos, '输入的商品编号有误'

?效果大概是这样子的:

?最后根据用户的选择结果进行下单就ok啦,下单相关的代码实现如下:

'''购买商品''' def buygood(self, good_info): # 取消勾选购物车中的所有商品 url = 'https://cart.jd.com/cancelAllItem.action' data = { 't': 0, 'outSkus': '', 'random': random.random(), } response = self.session.post(url, data=data) # 勾选指定商品商品 url = 'https://api.m.jd.com/api' body = '{"operations":[{"ThePacks":[{"num":1,"sType":%s,"Id":%s,"TheSkus":[{"num":1,"Id":"%s","skuUuid":"%s","useUuid":false}]}]}]}' % \ (good_info['SType'], good_info['Id'], good_info['IdForOldVersion'], good_info['skuUuid']) data = { 'functionId': 'pcCart_jc_cartCheckSingle', 'appid': 'JDC_mall_cart', 'body': body, 'loginType': '3', } headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.82 Safari/537.36', 'origin': 'https://cart.jd.com', 'Referer': 'https://cart.jd.com', } response = self.session.post(url, data=data, headers=headers) # 获取订单结算页面信息 url = 'http://trade.jd.com/shopping/order/getOrderInfo.action' params = { 'rid': str(int(time.time() * 1000)), } headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.82 Safari/537.36', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3', 'Referer': 'https://cart.jd.com/cart.action', 'Connection': 'keep-alive', 'Host': 'trade.jd.com' } response = self.session.get(url=url, params=params, headers=headers) if '刷新太频繁了' in response.text: print(f'[{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} INFO]: 刷新太频繁了') raise RuntimeError('刷新太频繁了') if response.status_code != requests.codes.OK: print(f'[{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} INFO]: 当前请求存在错误') raise RuntimeError('当前请求存在错误') soup = BeautifulSoup(response.text, 'html.parser') risk_control = soup.select('input#riskControl')[0].get('value').strip(' \t\r\n') order_detail = { 'address': soup.find('span', id='sendAddr').text[5:], 'receiver': soup.find('span', id='sendMobile').text[4:], 'total_price': soup.find('span', id='sumPayPriceId').text[1:], 'items': [] } # 提交订单 url = 'https://trade.jd.com/shopping/order/submitOrder.action' data = { 'overseaPurchaseCookies': '', 'vendorRemarks': '[]', 'submitOrderParam.sopNotPutInvoice': 'false', 'submitOrderParam.trackID': 'TestTrackId', 'submitOrderParam.ignorePriceChange': '0', 'submitOrderParam.btSupport': '0', 'riskControl': order_detail, 'submitOrderParam.isBestCoupon': '1', 'submitOrderParam.jxj': '1', 'submitOrderParam.trackId': '9643cbd55bbbe103eef18a213e069eb0', 'submitOrderParam.needCheck': '1', } if self.paywd is not None: data['submitOrderParam.payPassword'] = ''.join(['u3' + x for x in self.paywd]) headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.82 Safari/537.36', 'Host': 'trade.jd.com', 'Referer': 'http://trade.jd.com/shopping/order/getOrderInfo.action', } response = self.session.post(url=url, data=data, headers=headers) response_json = response.json() if response_json.get('success'): return True return False

最终京东里的效果如下:

?

?当然这样提示的效果可能不明显,毕竟你不会一直盯着这个终端看,你可以加个语音提示,代码如下:

# 电脑语音提示 for _ in range(5): pyttsx3.speak('已经为您抢购到你所需的商品, 请尽快前往京东完成付款.')

当然,也许你也不一定一直在电脑边上,所以你还可以加个server酱提示,可以在商品抢购成功之后将该消息发送到你的微信上,代码如下:

'''发送Server酱提示''' def pushwechat(self, desp='已经为您抢购到你所需的商品, 请尽快前往京东完成付款.'): server_url = f'https://sc.ftqq.com/{self.server_key}.send' params = { 'text': '商品抢购成功提示', 'desp': desp, } response = requests.get(server_url, params=params) return response

?

server酱配置地址如下:

http://sc.ftqq.com/3.version

ok,大功告成啦,完整源代码关注文末公众号即可

使用方式:???????

usage: jingdongsnap.py [-h] [--interval INTERVAL] [--paywd PAYWD] [--key KEY] 京东抢购脚本 optional arguments: -h, --help show this help message and exit --interval INTERVAL 抢购商品时查询商品是否可以购买的时间间隔(单位秒) --paywd PAYWD 支付密码, 部分商品需要支付密码才能提交订单, 输入密码不会导致你直接购买商品, 请放心使用 --key KEY Server酱的Key

?效果展示:

?快拿去用吧,需要完整代码的可关注下方公众号哦!


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #京东 #API #抓包 #抢券