iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >怎么用Python写一个京东自动下单抢购脚本
  • 896
分享到

怎么用Python写一个京东自动下单抢购脚本

2023-07-05 16:07:31 896人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

本文小编为大家详细介绍“怎么用python写一个京东自动下单抢购脚本”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么用Python写一个京东自动下单抢购脚本”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1 问

本文小编为大家详细介绍“怎么用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
获取Ticket
def 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
def 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频道。

--结束END--

本文标题: 怎么用Python写一个京东自动下单抢购脚本

本文链接: https://www.lsjlt.com/news/352963.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么用Python写一个京东自动下单抢购脚本
    本文小编为大家详细介绍“怎么用Python写一个京东自动下单抢购脚本”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么用Python写一个京东自动下单抢购脚本”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1 问...
    99+
    2023-07-05
  • 教你用Python写一个京东自动下单抢购脚本
    1 问题背景 经过无数次抢购失败后,发现商家会不定时的放出少量货源,目测每次会有几台。如果我们编写一个脚本程序24小时不间断监听商品库存,一旦查询到货源便开始尝试自动下单,这样就可以...
    99+
    2023-03-23
    Python自动下单 Python抢购脚本 Python脚本 Python京东抢购
  • 【Python】京东自动下单抢购脚本——双十一购物小技巧
    最近种草一款富士📷已久,但限于富士产能,一直都没有等到开放购买,在尝试几次定闹钟到点准时抢购后,果断放弃,于是花了一个周末时间写了一个简易脚本,终于成为一名合格的“富家子弟”。 ...
    99+
    2023-09-03
    python java 抢购 抢购脚本 京东
  • 用python写一个抢购的脚本
    好的,这是用 Python 写的一个抢购的脚本的示例: import requestsdef main(): # 在这里输入你的抢购商品的 URL url = "http://www.example.com/product/123" ...
    99+
    2023-10-05
    java 开发语言
  • Python实现京东茅台抢购脚本, 原来这么简单
    前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 开发环境: python 3.8 运行代码 pycharm 2022.3.2 辅助敲代码 专业版 京东茅台抢购脚本可以分为以下几部分,具体...
    99+
    2023-09-02
    python 开发语言 pycharm 学习
  • 使用Python怎么实现一个京东抢秒杀效果
    这篇文章将为大家详细讲解有关使用Python怎么实现一个京东抢秒杀效果,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。python是什么意思Python是一种跨平台的、具有解释性、编译性、互动...
    99+
    2023-06-14
  • 怎么自制Python淘宝秒杀抢购脚本
    本篇内容主要讲解“怎么自制Python淘宝秒杀抢购脚本”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么自制Python淘宝秒杀抢购脚本”吧!首先我的思路很简单,就是让“程序”帮我们自动打开浏览...
    99+
    2023-06-25
  • 用Python写一个抢演唱会门票的脚本
    import threadingimport timefrom random import randint# 演唱会门票总数量TOTAL_TICKETS = 100# 剩余门票数量remaining_tickets = TOTAL_TICK...
    99+
    2023-09-07
    python 开发语言
  • 【Python项目实战】京东自动抢茅台脚本,此项目不可商用,仅为Python练手使用!
    目前,在多家电商平台都可以抢购茅台酒,包括天猫超市、京东、天猫会员店、国美、苏宁、网易严选等渠道,消费者使用一台手机便可参与抢购,不过,很多消费者依旧不清楚用手机抢茅台怎么抢,因为抢购的人实在太多,需...
    99+
    2023-10-01
    github
  • 用python写一个脚本,自动连wifi,自动登录校园网
    文章目录 1.实现原理1.1认识 URL1.2 http请求报文格式1.3 http响应报头格式 2.具体实现2.1 获取url2.2 获取请求报文的报头2.3 获取请求报文的数据2.4 获取本机的局域网ip 3.自动连接W...
    99+
    2023-08-30
    python 服务器 网络
  • 写一个Python脚本自动爬取Bilibili小视频
    目录实验环境准备 API 寻找 && 提取 代码实现 项目链接 我身边的很多小伙伴们在朋友圈里面晒着出去游玩的照片,简直了,人多的不要不要的,长城被堵到水泄不通,老实...
    99+
    2024-04-02
  • 使用python怎么编写一个自动生成sql语句的脚本
    这篇文章主要介绍了使用python怎么编写一个自动生成sql语句的脚本,此处通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考价值,需要的朋友可以参考下:python是什么意思Python是一种跨平台的、具有解释性、编译性、...
    99+
    2023-06-06
  • python自动打卡脚本怎么写
    编写一个Python自动打卡脚本可以参考以下步骤:1. 导入所需的库:`requests`用于发送HTTP请求,`time`用于设置...
    99+
    2023-08-17
    python
  • 这怎么在SQL Server编写一个自动备份脚本
    本篇文章为大家展示了这怎么在SQL Server编写一个自动备份脚本,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。 创建SQL脚本新建db_backup.sql文件,填入以下内容。-- 定...
    99+
    2023-06-14
  • 想去看演唱却总是抢不到票?教你用Python制作一个自动抢票脚本
    前言 嗨喽!大家好,这里是魔王!! 大麦网,是中国综合类现场娱乐票务营销平台,业务覆盖演唱会、 话剧、音乐剧、体育赛事等领域。 但是因为票数有限,还有黄牛们不能丢了饭碗,所以导致了,很多人都抢不到票 ...
    99+
    2023-08-31
    udp python 网络
  • 十个简单使用的Python自动化脚本分享
    目录1.给照片添加水印2.检测文本文件的相似性3.对文件内容进行加 密4.将照片转换为PDF5.修改照片的长与宽6.对于照片的其他操作7.测试网速8.货币汇率的转换9.生成...
    99+
    2024-04-02
  • 怎么用java写自动化测试脚本
    使用Java编写自动化测试脚本可以通过以下步骤进行:1. 确定测试框架:选择一个适合的测试框架,比如JUnit、TestNG等。这些...
    99+
    2023-10-10
    java
  • 我用Python给班主任写了一个自动阅卷脚本(附源码)
    导语 幼儿园升小学,小学升中学,中学升高中.......... 每个人都要经历的九年义务教育:伴随的都是作业、随堂考、以及每个科目的大大小小的考试。当然小编被考试支配的恐惧以及过去了...
    99+
    2024-04-02
  • 怎么在Linux中使用expect命令编写一个自动化交互脚本
    怎么在Linux中使用expect命令编写一个自动化交互脚本?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。expect 是建立在工具控制语言(Tool Control La...
    99+
    2023-06-09
  • Linux中python自启动和定时启动脚本怎么写
    这篇“Linux中python自启动和定时启动脚本怎么写”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Linux中pytho...
    99+
    2023-06-28
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作