欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用 Python 在京東上搶口罩的思路詳解

 更新時間:2020年02月27日 14:24:54   作者:極光  
受疫情影響全民真的在搶口罩,而且還是搶不到的那種。這篇文章主要介紹了用 Python 在京東上搶口罩的實(shí)例代碼,代碼簡單易懂,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下

全國抗"疫"這么久終于見到曙光,在家待了將近一個月,現(xiàn)在終于可以去上班了,可是卻發(fā)現(xiàn)出門必備的口罩卻一直買不到。最近看到京東上每天都會有口罩的秒殺活動,試了幾次卻怎么也搶不到,到了搶購的時間,瀏覽器的頁面根本就刷新不出來,等刷出來秒殺也結(jié)束了?,F(xiàn)在每天只放出一萬個,卻有幾百萬人在搶,很想知道別人是怎么搶到的,于是就在網(wǎng)上找了大神公開出來的搶購代碼??戳讼麓a并不復(fù)雜,現(xiàn)在我們就報著學(xué)習(xí)的態(tài)度一起看看。

使用模塊

首先打開項(xiàng)目中 requirements.txt 文件,看下它都需要哪些模塊:

  • requests:類似 urllib ,主要用于向網(wǎng)站發(fā)送 HTTP 請求。
  • beautifulsoup4: HTML 解析器,用于將 HTML 文檔轉(zhuǎn)換成一個復(fù)雜的樹形結(jié)構(gòu)。
  • pillow:Python 圖像處理標(biāo)準(zhǔn)庫,用于識別驗(yàn)證碼。

配置文件

一般項(xiàng)目中我們都需要把一些可配置的內(nèi)容放到配置文件中,現(xiàn)在我們來看下這里主要配置項(xiàng):

# 郵寄地所屬地區(qū)ID
area = 123456
# 這是配置的商品的ID
skuid = 6828101
# 打碼服務(wù)器的地址
captchaUrl = http://xxx/pic
# 通知郵箱
mail = xxxxxx@qq.com
# cookie的設(shè)置
cookies_String = shshshfpa21jsda8923892949204923123
OK,有了配置文件,那我們就得有一段讀取配置文件的代碼,這段代碼實(shí)現(xiàn)將配置內(nèi)容加載到內(nèi)存中。
import os
import configparser
# 加載配置文件
class Config(object):
 def __init__(self, config_file='configDemo.ini'):
  self._path = os.path.join(os.getcwd(), config_file)
  if not os.path.exists(self._path):
   raise FileNotFoundError("No such file: config.ini")
  self._config = configparser.ConfigParser()
  self._config.read(self._path, encoding='utf-8-sig')
  self._configRaw = configparser.RawConfigParser()
  self._configRaw.read(self._path, encoding='utf-8-sig')
 def get(self, section, name):
  return self._config.get(section, name)
 def getRaw(self, section, name):
  return self._configRaw.get(section, name)

主程序模塊

我看 GitHub 上也有實(shí)現(xiàn)了運(yùn)行程序后通過京東 App 掃碼登陸,然后再通過登陸 Cookie 訪問網(wǎng)站的,不過這里并沒有使用這種方式,畢竟我們打開瀏覽器開發(fā)者工具也能很容易獲取到登陸的 Cookie ,這里就是將 Cookie 直接放到配置文件里的方式。

# 主程序入口
# 檢查是否存在要搶購的端口,然后進(jìn)入循環(huán)掃描
if len(skuids) != 1:
 logger.info('請準(zhǔn)備一件商品')
skuId = skuids[0]
flag = 1
# 循環(huán)掃描該商品是否有貨,有庫存即會自動下單,無庫存則休眠后繼續(xù)掃描
while (1):
 try:
  # 初始化校驗(yàn)
  if flag == 1:
   logger.info('當(dāng)前是V3版本')
   validate_cookies() # 校驗(yàn)登陸狀態(tài)
   getUsername()  # 獲取登陸用戶信息
   select_all_cart_item() # 全選購物車
   remove_item()   # 刪除購物車
   add_item_to_cart(skuId) # 增加搶購的商品
  # 檢測配置文件修改
  if int(time.time()) - configTime >= 60:
   check_Config()
  logger.info('第' + str(flag) + '次 ')
  # 計數(shù)器
  flag += 1
  # 檢查庫存模塊
  inStockSkuid = check_stock(checksession, skuids, area)
  # 自動下單模塊
  V3AutoBuy(inStockSkuid)
  # 休眠模塊
  timesleep = random.randint(1, 3) / 10
  time.sleep(timesleep)
  # 校驗(yàn)是否還在登錄模塊
  if flag % 100 == 0:
   V3check(skuId)
 except Exception as e:
  print(traceback.format_exc())
  time.sleep(10)

以上就是該項(xiàng)目主程序,我已經(jīng)將代碼在原來基礎(chǔ)上增加了些注釋,可以讓我們更容易明白代碼的含義。下面我們就選擇幾個比較關(guān)鍵的代碼分析一下。

登陸狀態(tài)校驗(yàn)

# 校驗(yàn)登陸狀態(tài)
def validate_cookies():
 for flag in range(1, 3):
  try:
   targetURL = 'https://order.jd.com/center/list.action'
   payload = {
    'rid': str(int(time.time() * 1000)),
   }
   resp = session.get(url=targetURL, params=payload, allow_redirects=False)
   if resp.status_code == requests.codes.OK:
    logger.info('登錄成功')
    return True
   else:
    logger.info('第【%s】次請重新獲取cookie', flag)
    time.sleep(5)
    continue
  except Exception as e:
   logger.info('第【%s】次請重新獲取cookie', flag)
   time.sleep(5)
   continue
 message.sendAny('腳本登錄cookie失效了,請重新登錄')
 sys.exit(1)

以上代碼是每次調(diào)用時,循環(huán)兩次獲取通過 session 獲取當(dāng)前登陸狀態(tài),如果兩次后依然失敗則退出程序。

添加商品到購物車

接下來我們再看下如果添加商品到購物車的,代碼如下:

def add_item_to_cart(sku_id):
 # 請求添加商品url
 url = 'https://cart.jd.com/gate.action'
 payload = {
  'pid': sku_id,
  'pcount': 1,
  'ptype': 1,
 }
 # 返回結(jié)果
 resp = session.get(url=url, params=payload)
 # 套裝商品加入購物車后直接跳轉(zhuǎn)到購物車頁面
 if 'https://cart.jd.com/cart.action' in resp.url:
  result = True
 else:
  # 普通商品成功加入購物車后會跳轉(zhuǎn)到提示 "商品已成功加入購物車!" 頁面
  soup = BeautifulSoup(resp.text, "html.parser")
  result = bool(soup.select('h3.ftx-02')) # [<h3 class="ftx-02">商品已成功加入購物車!</h3>]
 if result:
  logger.info('%s 已成功加入購物車', sku_id)
 else:
  logger.error('%s 添加到購物車失敗', sku_id)

在這里,只是簡單幾行代碼就能將端口添加到購物車了,而且這里還區(qū)分了不同類型商品添加到購物車返回的頁面結(jié)果是不同的,所以要進(jìn)行區(qū)別處理。

購買商品

將商品添加到購物車了,接下來我們就得提交結(jié)算頁了,也就是將商品提交到付款頁面,這段代碼有點(diǎn)多,我簡化了下并加了些注釋:

def submit_order(session, risk_control, sku_id, skuids, submit_Time, encryptClientInfo, is_Submit_captcha, payment_pwd,
     submit_captcha_text, submit_captcha_rid):
 # 提交端口的url
 url = 'https://trade.jd.com/shopping/order/submitOrder.action'
 # 提交參數(shù)
 data = {
  'overseaPurchaseCookies': '',
  'vendorRemarks': '[]',
  'submitOrderParam.sopNotPutInvoice': 'false',
  'submitOrderParam.trackID': 'TestTrackId',
  'submitOrderParam.ignorePriceChange': '0',
  'submitOrderParam.btSupport': '0',
  'riskControl': risk_control,
  'submitOrderParam.isBestCoupon': 1,
  'submitOrderParam.jxj': 1,
  'submitOrderParam.trackId': '9643cbd55bbbe103eef18a213e069eb0', # Todo: need to get trackId
  'submitOrderParam.needCheck': 1,
 }
 # 如果用到京豆會需要輸入支付密碼
 def encrypt_payment_pwd(payment_pwd):
  return ''.join(['u3' + x for x in payment_pwd])
 # 校驗(yàn)支付密碼
 if len(payment_pwd) > 0:
  data['submitOrderParam.payPassword'] = encrypt_payment_pwd(payment_pwd)
 # 請求報文頭
 headers = {
  "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/531.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": "http://trade.jd.com/shopping/order/getOrderInfo.action",
  "Connection": "keep-alive",
  'Host': 'trade.jd.com',
 }
 # 訂單提交會嘗試兩次
 for count in range(1, 3):
  logger.info('第[%s/%s]次嘗試提交訂單', count, 3)
  try:
   # 可能會存在的校驗(yàn)碼
   if is_Submit_captcha:
    captcha_result = page_detail_captcha(session, encryptClientInfo)
    # 驗(yàn)證碼服務(wù)錯誤
    if not captcha_result:
     logger.error('驗(yàn)證碼服務(wù)異常')
     continue
    data['submitOrderParam.checkcodeTxt'] = submit_captcha_text
    data['submitOrderParam.checkCodeRid'] = submit_captcha_rid
   # 提交訂單
   resp = session.post(url=url, data=data, headers=headers)
   resp_json = json.loads(resp.text)
   logger.info('本次提交訂單耗時[%s]毫秒', str(int(time.time() * 1000) - submit_Time))
   # 判斷是否提交成功
   if resp_json.get('success'):
    logger.info('訂單提交成功! 訂單號:%s', resp_json.get('orderId'))
    return True
   else:
    # 提交失敗返回的多種原因
    resultMessage, result_code = resp_json.get('message'), resp_json.get('resultCode')
    if result_code == 0:
     # self._save_invoice()
     if '驗(yàn)證碼不正確' in resultMessage:
      resultMessage = resultMessage + '(驗(yàn)證碼錯誤)'
      logger.info('提交訂單驗(yàn)證碼[錯誤]')
      continue
     else:
      resultMessage = resultMessage + '(下單商品可能為第三方商品,將切換為普通發(fā)票進(jìn)行嘗試)'
    elif result_code == 60077:
     resultMessage = resultMessage + '(可能是購物車為空 或 未勾選購物車中商品)'
    elif result_code == 60123:
     resultMessage = resultMessage + '(需要在payment_pwd參數(shù)配置支付密碼)'
    elif result_code == 60070:
     resultMessage = resultMessage + '(省份不支持銷售)'
     skuids.remove(sku_id)
     logger.info('[%s]類型口罩不支持銷售', sku_id)
    logger.info('訂單提交失敗, 錯誤碼:%s, 返回信息:%s', result_code, resultMessage)
    logger.info(resp_json)
    return False
  except Exception as e:
   print(traceback.format_exc())
   continue

以上代碼實(shí)現(xiàn)了商品自動提交到結(jié)算頁面,這段明顯比添加購物車要復(fù)雜,果然跟錢有關(guān)的都不簡單。好了,到了結(jié)算頁面剩下就是付款了,這個就不需要再搶了,畢竟也沒人會搶著給你付錢的。

總結(jié)

本文為大家介紹了一個京東搶購的小工具,它實(shí)現(xiàn)了掃描是否有庫存,發(fā)現(xiàn)有庫存就自動下單,并且可以自動提交到結(jié)算頁面。而它所實(shí)現(xiàn)方式也并不算太復(fù)雜,進(jìn)一步分析了它的部分代碼,有興趣的小伙伴可以去文末 GitHub 項(xiàng)目網(wǎng)址上了解更多,再次感謝開發(fā)者的付出和分享。

參考

GitHub項(xiàng)目網(wǎng)址:https://github.com/cycz/jdBuyMask

到此這篇關(guān)于使用 Python 在京東上搶口罩的思路詳解的文章就介紹到這了,更多相關(guān)Python 京東搶口罩內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python實(shí)現(xiàn)OCR識別之pytesseract案例詳解

    Python實(shí)現(xiàn)OCR識別之pytesseract案例詳解

    這篇文章主要介紹了Python實(shí)現(xiàn)OCR識別之pytesseract案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • Python通過串口實(shí)現(xiàn)收發(fā)文件

    Python通過串口實(shí)現(xiàn)收發(fā)文件

    這篇文章主要為大家詳細(xì)介紹了Python如何通過串口實(shí)現(xiàn)收發(fā)文件功能,文中的示例代碼簡潔易懂,具有一定的借鑒價值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-11-11
  • Python 權(quán)限控制模塊 Casbin

    Python 權(quán)限控制模塊 Casbin

    這篇文章主要介紹了Python 權(quán)限控制模塊 Casbin,Casbin是一個強(qiáng)大的、高效的開源訪問控制框架,其權(quán)限管理機(jī)制支持多種訪問控制模型,更多相關(guān)內(nèi)容感興趣的朋友可以參考下面文章內(nèi)容
    2022-06-06
  • Python實(shí)現(xiàn)簡單多線程任務(wù)隊(duì)列

    Python實(shí)現(xiàn)簡單多線程任務(wù)隊(duì)列

    本文給大家介紹的是使用很簡單的代碼實(shí)現(xiàn)的多線程任務(wù)隊(duì)列,給大家一個思路,希望對大家學(xué)習(xí)python能夠有所幫助
    2016-02-02
  • python中異常捕獲方法詳解

    python中異常捕獲方法詳解

    異常信息的獲取對于程序的調(diào)試非常重要,可以有助于快速定位有錯誤程序語句的位置。下面介紹幾種python中獲取異常信息的方法,希望小伙伴們能夠喜歡
    2017-03-03
  • 詳解django中使用定時任務(wù)的方法

    詳解django中使用定時任務(wù)的方法

    在本篇文章中我們給大家介紹了關(guān)于django中使用定時任務(wù)的方法的相關(guān)知識點(diǎn),有需要的朋友們參考下。
    2018-09-09
  • Python自動化開發(fā)學(xué)習(xí)之三級菜單制作

    Python自動化開發(fā)學(xué)習(xí)之三級菜單制作

    這篇文章主要為大家詳細(xì)介紹了Python自動化開發(fā)學(xué)習(xí)之三級菜單的制作方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • Python并發(fā)請求下限制QPS(每秒查詢率)的實(shí)現(xiàn)代碼

    Python并發(fā)請求下限制QPS(每秒查詢率)的實(shí)現(xiàn)代碼

    這篇文章主要介紹了Python并發(fā)請求下限制QPS(每秒查詢率)實(shí)現(xiàn)方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-06-06
  • 基于python實(shí)現(xiàn)開箱即用的桌面時鐘

    基于python實(shí)現(xiàn)開箱即用的桌面時鐘

    這篇文章主要為大家詳細(xì)介紹了如何基于python實(shí)現(xiàn)開箱一個即用的桌面時鐘,文中的示例代碼講解詳細(xì),具有一定的借鑒價值,需要的小伙伴可以參考下
    2023-12-12
  • Python在centos7.6上安裝python3.9的詳細(xì)教程(默認(rèn)python版本為2.7.5)

    Python在centos7.6上安裝python3.9的詳細(xì)教程(默認(rèn)python版本為2.7.5)

    這篇文章主要介紹了Python在centos7.6上安裝python3.9(默認(rèn)python版本為2.7.5)的方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2020-10-10

最新評論