怎么使用Python编写自动抢购京东下单脚本

您所在的位置:网站首页 京东api抓取商品流程 怎么使用Python编写自动抢购京东下单脚本

怎么使用Python编写自动抢购京东下单脚本

2023-05-09 05:23| 来源: 网络整理| 查看: 265

怎么使用Python编写自动抢购京东下单脚本 发布时间:2023-05-08 11:23:26 来源:亿速云 阅读:92 作者:iii 栏目:编程语言

本篇内容主要讲解“怎么使用Python编写自动抢购京东下单脚本”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么使用Python编写自动抢购京东下单脚本”吧!

1 问题背景

经过无数次抢购失败后,发现商家会不定时的放出少量货源,目测每次会有几台。如果我们编写一个脚本程序24小时不间断监听商品库存,一旦查询到货源便开始尝试自动下单,这样就可以极大提高我们的成功概率。

2 设计思路

京东对于商品的抢购主要分为两种:

预约抢购:到点开放购买,和普通商品下单流程一致;秒杀商品:单独的抢购接口和下单流程。

当然本次针对的预约抢购类或无货订购类,即整体下单流程和购买普通商品时一样:

登录账号 → 进入购物车 → 选择抢购商品 → 点击去结算 → 点击提交订单 → 选择付款方式并付款。

3 具体实现

由于笔者本人没有一个可以抓包的客户端,决定采用京东 WEB 端接口实现我们的脚本程序。

于是经过对京东网页下单流程的分析,将我们的脚本程序分为四个模块:账号登录模块、库存监听模块、购物车管理模块、订单管理模块。

3.1 账号登录

由于使用账号密码时有验证码限制,此处采用扫码登录方式绕过。

如对扫码登录不熟悉或感兴趣的同学可以查看周周之前的博文 扫码登录原理和实现。

本次只要针对京东登录页进行抓包分析,找到几个有用接口:

获取登录二维码def getQRcode(self):     url = 'https://qr.m.jd.com/show'     payload = {         'appid': 133,         'size': 147,         't': str(int(time.time() * 1000)),     }     headers = {         'User-Agent': self.userAgent,         'Referer': 'https://passport.jd.com/new/login.aspx',     }     resp = self.sess.get(url=url, headers=headers, params=payload)     if not self.respStatus(resp):         return None     return resp.content获取Ticketdef getQRcodeTicket(self):     url = 'https://qr.m.jd.com/check'     payload = {         'appid': '133',         'callback': 'jQuery{}'.format(random.randint(1000000, 9999999)),         'token': self.sess.cookies.get('wlfstk_smdl'),         '_': str(int(time.time() * 1000)),     }     headers = {         'User-Agent': self.userAgent,         'Referer': 'https://passport.jd.com/new/login.aspx',     }     resp = self.sess.get(url=url, headers=headers, params=payload)     if not self.respStatus(resp):         return False     respJson = self.parseJson(resp.text)     if respJson['code'] != 200:         return None     else:         return respJson['ticket']验证 Ticketdef getQRcodeTicket(self):     url = 'https://qr.m.jd.com/check'     payload = {         'appid': '133',         'callback': 'jQuery{}'.format(random.randint(1000000, 9999999)),         'token': self.sess.cookies.get('wlfstk_smdl'),         '_': str(int(time.time() * 1000)),     }     headers = {         'User-Agent': self.userAgent,         'Referer': 'https://passport.jd.com/new/login.aspx',     }     resp = self.sess.get(url=url, headers=headers, params=payload)     if not self.respStatus(resp):         return False     respJson = self.parseJson(resp.text)     if respJson['code'] != 200:         return None     else:         return respJson['ticket']

此时验证 Ticket 有效后使用 pickle 库将程序会话中的 cookie 保存到本地以便下次使用。

3.2 库存监听

库存监听较为简单,分析商品详情页,获取店铺ID以及商品分类属性:

获取商品详情信息def getItemDetail(self, skuId):     url = 'https://item.jd.com/{}.html'.format(skuId)     page = requests.get(url=url, headers=self.headers)     html = etree.HTML(page.text)     vender = html.xpath(         '//div[@class="follow J-follow-shop"]/@data-vid')[0]     cat = html.xpath('//a[@clstag="shangpin|keycount|product|mbNav-3"]/@href')[         0].replace('//list.jd.com/list.html?cat=', '')     if not vender or not cat:         raise Exception('获取商品信息失败,请检查SKU是否正确')     detail = dict(catId=cat, venderId=vender)     return detail查询库存def getItemStock(self, skuId, num, areaId):     item = self.itemDetails.get(skuId)     if not item:         return False     url = 'https://c0.3.cn/stock'     payload = {         'skuId': skuId,         'buyNum': num,         'area': areaId,         'ch': 1,         '_': str(int(time.time() * 1000)),         'callback': 'jQuery{}'.format(random.randint(1000000, 9999999)),         # get error stock state without this param         'extraParam': '{"originid":"1"}',         # get 403 Forbidden without this param (obtained from the detail page)         'cat': item.get('catId'),         # return seller information with this param (can't be ignored)         'venderId': item.get('venderId')     }     headers = {         'User-Agent': self.userAgent,         'Referer': 'https://item.jd.com/{}.html'.format(skuId),     }     respText = ''     try:         respText = requests.get(             url=url, params=payload, headers=headers, timeout=self.timeout).text         respJson = self.parseJson(respText)         stockInfo = respJson.get('stock')         skuState = stockInfo.get('skuState')  # 商品是否上架         # 商品库存状态:33 -- 现货  0,34 -- 无货  36 -- 采购中  40 -- 可配货         stockState = stockInfo.get('StockState')         return skuState == 1 and stockState in (33, 40)3.3 购物车操作

无货商品加入到购物车我们是无法通过页面操作的,我们这边可以使用其他有货商品进行尝试,主要查看购物车的增删改查接口:

取消所有选中商品def uncheckCartAll(self):     """ 取消所有选中商品     return 购物车信息     """     url = 'https://api.m.jd.com/api'     headers = {         'User-Agent': self.userAgent,         'Content-Type': 'application/x-www-form-urlencoded',         'origin': 'https://cart.jd.com',         'referer': 'https://cart.jd.com'     }     data = {         'functionId': 'pcCart_jc_cartUnCheckAll',         'appid': 'JDC_mall_cart',         'body': '{"serInfo":{"area":"","user-key":""}}',         'loginType': 3     }     resp = self.sess.post(url=url, headers=headers, data=data)     # return self.respStatus(resp) and resp.json()['success']     return resp加入购入车def addCartSku(self, skuId, skuNum):     """ 加入购入车     skuId 商品sku     skuNum 购买数量     retrun 是否成功     """     url = 'https://api.m.jd.com/api'     headers = {         'User-Agent': self.userAgent,         'Content-Type': 'application/x-www-form-urlencoded',         'origin': 'https://cart.jd.com',         'referer': 'https://cart.jd.com'     }     data = {         'functionId': 'pcCart_jc_cartAdd',         'appid': 'JDC_mall_cart',         'body': '{\"operations\":[{\"carttype\":1,\"TheSkus\":[{\"Id\":\"' + skuId + '\",\"num\":' + str(skuNum) + '}]}]}',         'loginType': 3     }     resp = self.sess.post(url=url, headers=headers, data=data)     return self.respStatus(resp) and resp.json()['success']修改购物车商品数量def changeCartSkuCount(self, skuId, skuUid, skuNum, areaId):     """ 修改购物车商品数量     skuId 商品sku     skuUid 商品用户关系     skuNum 购买数量     retrun 是否成功     """     url = 'https://api.m.jd.com/api'     headers = {         'User-Agent': self.userAgent,         'Content-Type': 'application/x-www-form-urlencoded',         'origin': 'https://cart.jd.com',         'referer': 'https://cart.jd.com'     }     body = '{\"operations\":[{\"TheSkus\":[{\"Id\":\"'+skuId+'\",\"num\":'+str(         skuNum)+',\"skuUuid\":\"'+skuUid+'\",\"useUuid\":false}]}],\"serInfo\":{\"area\":\"'+areaId+'\"}}'     data = {         'functionId': 'pcCart_jc_changeSkuNum',         'appid': 'JDC_mall_cart',         'body': body,         'loginType': 3     }     resp = self.sess.post(url=url, headers=headers, data=data)     return self.respStatus(resp) and resp.json()['success']

以上是我们一次购买需要用到的最少接口,为了不破坏账户购物车中已有数据,采用一下步骤准备好购物车:

取消全部勾选(返回购物车信息);已在购物车则修改商品数量;不在购物车则加入购物车。 3.4 订单操作

当我们准备好购物车之后(选中购买商品以及调整购买数量),就可以进行下一步订单相关操作:

获取结算单def getCheckoutPage(self):     """获取订单结算页面信息     :return: 结算信息 dict     """     url = 'http://trade.jd.com/shopping/order/getOrderInfo.action'     # url = 'https://cart.jd.com/gotoOrder.action'     payload = {         'rid': str(int(time.time() * 1000)),     }     headers = {         'User-Agent': self.userAgent,         'Referer': 'https://cart.jd.com/cart',     }提交订单def submitOrder(self):     """提交订单     :return: True/False 订单提交结果     """     url = 'https://trade.jd.com/shopping/order/submitOrder.action'     # js function of submit order is included in https://trade.jd.com/shopping/misc/js/order.js?r=2018070403091     data = {         'overseaPurchaseCookies': '',         'vendorRemarks': '[]',         'submitOrderParam.sopNotPutInvoice': 'false',         'submitOrderParam.trackID': 'TestTrackId',         'submitOrderParam.ignorePriceChange': '0',         'submitOrderParam.btSupport': '0',         'riskControl': self.risk_control,         'submitOrderParam.isBestCoupon': 1,         'submitOrderParam.jxj': 1,         'submitOrderParam.trackId': self.track_id,         'submitOrderParam.eid': self.eid,         'submitOrderParam.fp': self.fp,         'submitOrderParam.needCheck': 1,     }

到此,相信大家对“怎么使用Python编写自动抢购京东下单脚本”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

推荐阅读: Python函数怎么实现学员管理系统 怎么用Python实现多任务版的udp聊天器

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:[email protected]进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

python 上一篇新闻:怎么使用Python批量缩放图片尺寸 下一篇新闻:Python怎么实现批量合成图片为PDF格式 猜你喜欢 php数组如何用while求和 php二维数组中指定字段如何求和 php中的DI依赖注入是什么及怎么实现 python文件数据分析治理提取的方法是什么 Java二分法如何实现 PHP的垃圾回收机制怎么实现 Vue高频面试题有哪些 php如何检测字符串是否含大写字母 php如何将数据转为16进制字符串 php中垃圾回收机制的知识点有哪些


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3