微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

前言

      某宝脚本一搜能搜一大堆,就是不知道具体有没有用,但是这款某东的代码于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

 效果展示:

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

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

相关推荐