前言
某宝脚本一搜能搜一大堆,就是不知道具体有没有用,但是这款某东的代码于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.versionok,大功告成啦,完整源代码关注文末公众号即可
使用方式:
  
   - 
    
     
    
    
     
      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
     
    
 效果展示:
快拿去用吧,需要完整代码的可关注下方公众号哦!
转载:https://blog.csdn.net/weixin_43881394/article/details/127898362
 
					