听说某宝抢购脚本大家都会了?那就在来个某东茅台抢购脚本吧

前言

      某宝脚本一搜能搜一大堆,就是不知道具体有没有用,但是这款某东的代码于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': '(.*?)','IdForOldVersion': self.rematch(r"'IdForOldVersion': (.*?),'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','body': body,}
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,data=data,headers=headers)
    # 获取订单结算页面信息
    url = 'http://trade.jd.com/shopping/order/getOrderInfo.action'
    params = {
        'rid': str(int(time.time() * 1000)),'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,'Host': 'trade.jd.com','Referer': 'http://trade.jd.com/shopping/order/getOrderInfo.action',}
    response = self.session.post(url=url,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

 效果展示:

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


文章浏览阅读752次。关系型数据库关系型数据库是一个结构化的数据库,创建在关系模型(二维表模型)基础上,一般面向于记录SQL语句(标准数据查询语言)就是一种基于关系型数据库的语言,用于执行对关系型数据库中数据的检索和操作主流的关系数据库包括Oracle、Mysql、SQL Server、Microsoft Access、DB2等非关系型数据库NoSQL(nOSQL=Not Only SQL),意思是“不仅仅是SQL”,是非关系型数据库的总称。除了主流的关系型数据库外的数据库,都认为是非关系型主流的NoSQ.._redis是非关系型数据库吗
文章浏览阅读687次,点赞2次,收藏5次。商城系统中,抢购和秒杀是很常见的营销场景,在一定时间内有大量的用户访问商场下单,主要需要解决的问题有两个:1. 高并发对数据库产生的压力;2. 竞争状态下如何解决商品库存超卖;高并发对数据库产生的压力对于第一个问题,使用缓存来处理,避免直接操作数据库,例如使用 Redis。竞争状态下如何解决商品库存超卖对于第二个问题,需要重点说明。常规写法:查询出对应商品的库存,判断库存数量否大于 0,然后执行生成订单等操作,但是在判断库存是否大于 0 处,如果在高并发下就会有问题,导致库存_php库存结余并发
文章浏览阅读1.4k次。MongoTemplate开发spring-data-mongodb提供了MongoTemplate和MongoRepository两种方式访问MongoDB,MongoRepository的方式访问较为简单,MongoTemplate方式较为灵活,这两种方式在Java对于MongoDB的运用中相辅相成。_springboot插入指定的mongodb数据库
文章浏览阅读887次,点赞10次,收藏19次。1.背景介绍1. 背景介绍NoSQL数据库是一种非关系型数据库,它的特点是可以存储非结构化的数据,并且可以处理大量的数据。HBase是一个分布式、可扩展的列式存储系统,它是基于Google的Bigtable设计的。HBase是一个开源的NoSQL数据库,它的核心功能是提供高性能的随机读写访问。在本文中,我们将对比HBase与其他NoSQL数据库,例如Redis、MongoDB、Cass...
文章浏览阅读819次。MongoDB连接失败记录_edentialmechanisn-scram-sha-1
文章浏览阅读470次。mongodb抽取数据到ES,使用ELK内部插件无法获取数据,只能试试monstache抽取mongodb数据,但是monstache需要mongodb replica set 模式才能采集数据。############monstache-compose文件。#replicas set 启动服务。# 默认备份节点不能读写,可以设置。# mydb指的是需要同步的数据库。#登录主mongodb初始化rs。#primary 创建用户。# ip地址注意要修改。# ip地址注意要修改。_monstache csdn
文章浏览阅读913次,点赞4次,收藏5次。storage:fork: trueadmin登录切换数据库注意: use 代表创建并使用,当库中没有数据时默认不显示这个库删除数据库查看表清单> show tables # 或者 > show collections表创建db.createCollection('集合名称', [options])table1字段类型描述capped布尔(可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。_mongodb5
文章浏览阅读862次。Centos7.9设置MongoDB开机自启(超全教程,一条龙)_mongodb centos开机启动脚本
文章浏览阅读1.3k次,点赞6次,收藏21次。NoSQL数据库使用场景以及架构介绍
文章浏览阅读856次,点赞21次,收藏20次。1.背景介绍1. 背景介绍NoSQL数据库是一种非关系型数据库,它的设计目标是为了解决传统关系型数据库(如MySQL、Oracle等)在处理大量不结构化数据方面的不足。NoSQL数据库可以处理大量数据,具有高性能、高可扩展性和高可用性。但是,与关系型数据库不同,NoSQL数据库没有固定的模式,数据结构也不一定是表格。在NoSQL数据库中,数据存储和查询都是基于键值对、列族、图形等不同的...
文章浏览阅读416次。NoSQL定义:非关系型、分布式、开放源码和具有横向扩展能力的下一代数据库。由c++编写的开源、高性能、无模式的基于分布式文件存储的文档型数据库特点:高性能、高可用性、高扩展性、丰富的查询支持、可替换已完场文档某个指定的数据字段应用场景:社交场景:使用mongodb存储用户信息游戏场景:用户信息,装备积分物流场景:订单信息,订单状态场景操作特点:数据量大;读写操作频繁;价值较低的数据,对事物性要求不高开源、c语言编写、默认端口号6379、key-value形式存在,存储非结构化数据。_nosql
文章浏览阅读1.5k次,点赞3次,收藏2次。Exception in thread "main" redis.clients.jedis.exceptions.JedisConnectionException: Failed to create socket. at redis.clients.jedis.DefaultJedisSocketFactory.createSocket(DefaultJedisSocketFactory.java:110) at redis.clients.jedis.Connection.connect(Conne_redis.clients.jedis.exceptions.jedisconnectionexception: failed to create so
文章浏览阅读6.5k次,点赞3次,收藏12次。readAnyDatabase(在所有数据库上都有读取数据的权限)、readWriteAnyDatabase(在所有数据库上都有读写数据的权限)、userAdminAnyDatabase(在所有数据库上都有管理user的权限)、dbAdminAnyDatabase(管理所有数据库的权限);:clusterAdmin(管理机器的最高权限)、clusterManager(管理和监控集群的权限)、clusterMonitor(监控集群的权限)、hostManager( 管理Server);_mongodb创建用户密码并授权
文章浏览阅读593次。Redis是一个基于内存的键值型NoSQL数据库,在实际生产中有着非常广泛的用处_搭建本地redis
文章浏览阅读919次。Key 的最佳实践[业务名]:[数据名]:[id]足够简短:不超过 44 字节不包含特殊字符Value 的最佳实践:合理的拆分数据,拒绝 BigKey选择合适数据结构Hash 结构的 entry 数量不要超过 1000(默认是 500,如果达到上限则底层会使用哈希表而不是 ZipList,内存占用较多)设置合理的超时时间批量处理的方案:原生的 M 操作Pipeline 批处理注意事项:批处理时不建议一次携带太多命令。Pipeline 的多个命令之间不具备原子性。_redis高级实战
文章浏览阅读1.2k次。MongoDB 递归查询_mongodb数据库 递归
文章浏览阅读1.2k次。通过实际代码例子介绍:如何通过MongoTemplate和MongoRepository操作数据库数据_springboot操作mongodb
文章浏览阅读687次,点赞7次,收藏2次。首先欢迎大家阅读此文档,本文档主要分为三个模块分别是:Redis的介绍及安装、RedisDesktopManager可视化工具的安装、主从(哨兵)模式的配置。_redis 主从配置工具
文章浏览阅读764次。天下武功,无坚不摧,唯快不破!我的名字叫 Redis,全称是 Remote Dictionary Server。有人说,组 CP,除了要了解她外,还要给机会让她了解你。那么,作为开发工程师的你,是否愿意认真阅读此心法抓住机会来了解我,运用到你的系统中提升性能。我遵守 BSD 协议,由意大利人 Salvatore Sanfilippo 使用 C 语言编写的一个基于内存实现的键值型非关系(NoSQL)..._redis 7.2 源码
文章浏览阅读2k次。MongoDB 的增删改查【1】_mongodb $inc