日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

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

瀏覽:74日期:2022-08-05 17:16:42

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

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

使用模塊

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

requests:類似 urllib ,主要用于向網站發送 HTTP 請求。 beautifulsoup4: HTML 解析器,用于將 HTML 文檔轉換成一個復雜的樹形結構。 pillow:Python 圖像處理標準庫,用于識別驗證碼。

配置文件

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

# 郵寄地所屬地區IDarea = 123456# 這是配置的商品的IDskuid = 6828101# 打碼服務器的地址captchaUrl = http://xxx/pic# 通知郵箱mail = xxxxxx@qq.com# cookie的設置cookies_String = shshshfpa21jsda8923892949204923123OK,有了配置文件,那我們就得有一段讀取配置文件的代碼,這段代碼實現將配置內容加載到內存中。import osimport 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 上也有實現了運行程序后通過京東 App 掃碼登陸,然后再通過登陸 Cookie 訪問網站的,不過這里并沒有使用這種方式,畢竟我們打開瀏覽器開發者工具也能很容易獲取到登陸的 Cookie ,這里就是將 Cookie 直接放到配置文件里的方式。

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

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

登陸狀態校驗

# 校驗登陸狀態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)

以上代碼是每次調用時,循環兩次獲取通過 session 獲取當前登陸狀態,如果兩次后依然失敗則退出程序。

添加商品到購物車

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

def add_item_to_cart(sku_id): # 請求添加商品url url = ’https://cart.jd.com/gate.action’ payload = { ’pid’: sku_id, ’pcount’: 1, ’ptype’: 1, } # 返回結果 resp = session.get(url=url, params=payload) # 套裝商品加入購物車后直接跳轉到購物車頁面 if ’https://cart.jd.com/cart.action’ in resp.url: result = True else: # 普通商品成功加入購物車后會跳轉到提示 '商品已成功加入購物車!' 頁面 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)

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

購買商品

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

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’ # 提交參數 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]) # 校驗支付密碼 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: # 可能會存在的校驗碼 if is_Submit_captcha: captcha_result = page_detail_captcha(session, encryptClientInfo) # 驗證碼服務錯誤 if not captcha_result: logger.error(’驗證碼服務異?!? 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 ’驗證碼不正確’ in resultMessage: resultMessage = resultMessage + ’(驗證碼錯誤)’ logger.info(’提交訂單驗證碼[錯誤]’) continue else: resultMessage = resultMessage + ’(下單商品可能為第三方商品,將切換為普通發票進行嘗試)’ elif result_code == 60077: resultMessage = resultMessage + ’(可能是購物車為空 或 未勾選購物車中商品)’ elif result_code == 60123: resultMessage = resultMessage + ’(需要在payment_pwd參數配置支付密碼)’ 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

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

總結

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

參考

GitHub項目網址:https://github.com/cycz/jdBuyMask

到此這篇關于使用 Python 在京東上搶口罩的思路詳解的文章就介紹到這了,更多相關Python 京東搶口罩內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: 京東 Python
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产精品色在线网站| 日韩不卡免费视频| 亚洲资源av| 欧美精品一区二区久久| 国产精品久久久免费| 久久一级电影| 日本大胆欧美人术艺术动态| 亚洲精品福利| 欧美成a人国产精品高清乱码在线观看片在线观看久 | 欧美特黄一级大片| 激情五月综合| 日韩高清电影一区| www.com.cn成人| 亚洲经典在线| 欧美在线不卡| 日韩亚洲在线| 7777精品| 播放一区二区| 国产精品毛片| 亚洲高清av| 日韩在线黄色| 久久精品国产999大香线蕉| 欧美精品1区| 亚洲精品少妇| 日韩午夜精品| 国精品一区二区| 高清不卡亚洲| 色偷偷偷在线视频播放| 嫩草伊人久久精品少妇av杨幂| 日韩中文字幕区一区有砖一区 | 免费一级片91| 色黄视频在线观看| 久久中文字幕导航| 国产日韩欧美一区二区三区在线观看 | 亚洲不卡av不卡一区二区| 精品一区二区三区亚洲| 一区二区三区国产盗摄| 日韩精品导航| 女生影院久久| 亚洲精品动态| 亚洲91精品| 久久精品国内一区二区三区| 亚洲综合日本| av在线最新| 国产精品videosex极品| 奶水喷射视频一区| 欧美日韩第一| 欧美日韩水蜜桃| zzzwww在线看片免费| 成人污污视频| 国产精品4hu.www| 国产精品久久国产愉拍| 国产一区91| 日韩一区二区三区免费播放| 激情91久久| 91精品国产调教在线观看| 久久av导航| 亚洲三级av| 99国产精品久久久久久久成人热 | 天堂av在线一区| 最新中文字幕在线播放| 国产欧美自拍一区| 午夜久久中文| 免费在线观看一区二区三区| 欧美aⅴ一区二区三区视频| 性欧美videohd高精| 亚洲精品系列| 亚洲激情欧美| 日本成人在线视频网站| 国产日本亚洲| 精品久久久亚洲| 日韩欧美一区二区三区免费观看| 精品国产免费人成网站| 99久久婷婷| 一区二区国产在线观看| 国产色99精品9i| 中国字幕a在线看韩国电影| 在线中文字幕播放| 欧美专区18| 伊人久久大香伊蕉在人线观看热v| 日韩精品一区二区三区中文字幕| 激情丁香综合| 91久久亚洲| 成人在线视频区| 久久伊人亚洲| 蜜桃精品视频| 精品在线91| 午夜免费一区| 亚洲人亚洲人色久| 激情综合亚洲| 久久国产精品亚洲77777| 综合日韩在线| 麻豆亚洲精品| 免费在线播放第一区高清av| 欧美中文一区| 秋霞国产精品| 日韩激情综合| 国产综合亚洲精品一区二| 日本欧美在线| 少妇精品久久久一区二区| 国产精品日韩| 欧美久久精品一级c片| 伊人久久亚洲| 日韩高清在线不卡| 国际精品欧美精品| 国产尤物精品| 高清av一区| 国产欧美日韩免费观看| 国产精品第一国产精品| 蜜芽一区二区三区| 精品香蕉视频| 国产亚洲精品美女久久| 日韩欧美少妇| 国产欧美日韩影院| 视频一区二区三区中文字幕| 久久精品日韩欧美| 少妇精品久久久一区二区| 亚洲精品一区二区妖精| 欧美韩日一区| 蜜桃精品视频| 国产精品久久久久久久久免费高清 | 亚洲一级大片| 天堂资源在线亚洲| 欧美片第1页| 中文字幕在线高清| 九九九精品视频| 美腿丝袜亚洲三区| 国产精品国产三级在线观看| 日韩精品福利一区二区三区| 视频一区二区三区入口| 久久不射中文字幕| 久久国产高清| 丝袜美腿高跟呻吟高潮一区| 亚洲在线观看| 亚洲欧美日韩综合国产aⅴ| aa国产精品| 夜夜精品视频| 蜜臀久久久99精品久久久久久| 亚洲精品乱码| 国产精品一级| 神马久久午夜| 亚洲免费网址| 亚洲精品在线二区| 国产日韩欧美一区二区三区| 国产亚洲欧美日韩精品一区二区三区 | 国产午夜久久av| 国产精品一区二区三区av麻| 久久99高清| 97精品视频在线看| 中文在线一区| 日韩不卡在线观看日韩不卡视频| 久久国产麻豆精品| 日韩欧美精品综合| 免费日韩精品中文字幕视频在线| 日本一不卡视频| 精品国产欧美| 免费看日韩精品| 国产一区二区三区视频在线| 欧美日韩国产探花| 另类综合日韩欧美亚洲| 欧美特黄一级| 风间由美中文字幕在线看视频国产欧美| 成人羞羞视频播放网站| 狠狠色综合网| 老司机免费视频一区二区| 亚洲精华国产欧美| 91日韩在线| 欧美日韩1区2区3区| 久久精品99久久无色码中文字幕| 视频一区中文字幕精品| 91看片一区| 精品黄色一级片| 日本欧美大码aⅴ在线播放| 亚洲一本视频| 五月天av在线| 精品视频91| 亚洲天堂免费| 中日韩男男gay无套| 麻豆一区二区99久久久久| 亚洲欧美一级| 久久国产精品久久w女人spa| 99久久亚洲精品蜜臀| 精品视频一二| 久久99影视| 美女高潮久久久| 国产精品久久久久毛片大屁完整版| 老司机久久99久久精品播放免费| 天堂日韩电影| 国产成人精品一区二区三区免费| 日韩激情综合| 日韩国产欧美在线视频| 最近国产精品视频| 色综合视频一区二区三区日韩 | 成人精品国产亚洲| 国产调教精品| 国产精品对白| 91欧美在线| 99精品视频在线| 欧美在线亚洲综合一区| 欧美日韩色图|