python使用requests秒杀茅台(适用某宝,也可抢购其他商品)
前言
關(guān)于茅臺搶購,看過不下一百篇小文章,瀏覽來瀏覽去,也找不到幾篇合適的。雖然有很多人發(fā)布了使用selenium搶購茅臺的腳本,但個人覺得這些沒有直接使用requests提交訂單來的快。于是!就有了你現(xiàn)在讀的文章!廢話不多說,開搞!
準備工作
安裝python,這就不用我說吧?至于開發(fā)工具使用什么看自己心情,我這里使用的是vscode,不知道如何操作的可以參考這位博主的http://t.csdn.cn/Xh3LG。這位博主的文章下面還有selenium的安裝教程,可以順便看一下,因為我這里也要用到selenium登錄,我就不重復(fù)造輪子了。
分析一波搶購流程
1、登錄
2、requests請求“確認訂單”所需信息
3、requests請求“提交訂單”
看似簡單的三步,我可花費了好多心血來研究啊,得掉多少頭發(fā)!
具體實現(xiàn)過程
import re, time, random, datetime, sys, requests, threading, psutil from requests.cookies import RequestsCookieJar from selenium.webdriver.common.by import By from multiprocessing import Queue from urllib.parse import quote from selenium import webdriver from io import BytesIO from PIL import Imageclass Login():def __init__(self):#設(shè)置關(guān)鍵詞進行匹配或判斷,下同self.key_word1 = '賬號管理'self.key_word2 = '安全鏈接'self.j = 0#創(chuàng)建隊列存放post訂單結(jié)果self.queue = Queue(maxsize=100)# 創(chuàng)建Session對象 requests庫的session對象會在同一個session實例的所有請求之間使用cookies保持登錄狀態(tài)self.session = requests.session()#設(shè)置headersua = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36 Edg/105.0.1343.50"self.headers = {'User-Agent': ua}self.session.headers.update(self.headers)# 掃碼登錄,獲取cookiesdef get_cookies(self):options = webdriver.ChromeOptions()options.add_experimental_option('excludeSwitches', ['enable-logging'])options.add_argument('--headless')browser = webdriver.Chrome(options=options)url = 'https://login.taobao.com/member/login.jhtml'browser.get(url)# 點擊跳轉(zhuǎn)掃碼界面browser.find_element(By.XPATH,'/html/body/div[1]/div[2]/div[3]/div/div/div/div[1]/i').click()time.sleep(round(random.uniform(1,2),2))# 獲取并保存二維碼截圖qrcode_img_data=browser.find_element(By.XPATH, '//*[@id="login"]/div[2]/div/div[1]/div[1]').screenshot_as_pngqrcode_img = Image.open(BytesIO(qrcode_img_data))qrcode_img.save('qrcode.png')qrcode_img.show()print("請掃碼登錄!")time.sleep(2)# 每隔1.5秒判斷一次是否登錄成功t=0while t < 40:try:info = browser.find_element(By.XPATH, '//*[@id="J_Col_Main"]/div/div[1]/div/div[1]/div[1]/div/div[1]/a/em').textprint('您的帳戶:' + info)for proc in psutil.process_iter(): # 遍歷當前processif proc.name() == "Microsoft.Photos.exe":proc.kill() # 關(guān)閉該processbreakexcept:time.sleep(1.5)t+=1# 獲取Cookie并保持在session中cookies = browser.get_cookies()time.sleep(round(random.uniform(1,2),2))browser.quit()selenium_cookies = cookiestmp_cookies = RequestsCookieJar()for item in selenium_cookies:tmp_cookies.set(item["name"], item["value"])self.session.cookies.update(tmp_cookies)#登錄def login(self):print("登錄中...")try:req=self.session.get('https://i.taobao.com/user/baseInfoSet.htm?').textif self.key_word1 in req:print("自動登錄成功!")else:print("自動登錄失敗!\n請再次掃碼登錄!")self.get_cookies()self.session.get('https://i.taobao.com/user/baseInfoSet.htm?').textif self.key_word1 in req:print("自動登錄成功!")else:print("自動登錄失敗!\n請手動完成該任務(wù)")sys.exit(0)except:print('程序出錯!')sys.exit(0)# 提交訂單def submitOrder(self, url, skuId, setTime, quantity):self.url = urlquantity = '_' + quantity + '_'# 獲取cookies并登錄self.cookies=self.get_cookies()self.login()time.sleep(round(random.uniform(1,2),2))# 進入商品詳情頁 self.req = self.session.get(url=self.url).texttime.sleep(round(random.uniform(1,2),2))# 提取 key datasself.patterGoods()time.sleep(round(random.uniform(1,2),2))# 確認訂單data = {"buy_param": self.auction[0] + quantity + skuId}url = 'https://buy.tmall.com/order/confirm_order.htm?x-itemid=' + self.auction[0] + '&x-uid=' + self.userId[0]k = 0while True:print("\r購買倒計時:%.3f"%(setTime-time.time()),end="",flush=True)if (time.time() >= setTime):print('\n')print(datetime.datetime.now())while True:self.req = self.session.post(url=url, data=data).text# 獲取數(shù)據(jù)key = self.patterData()k+=1if(k==50):print("\n確認訂單失敗!下次加油哦")print(datetime.datetime.now())sys.exit(0)if(key):print("\n確認訂單成功!")print(datetime.datetime.now())breakbreak# 提交訂單data = {"endpoint": self.endpoint,"linkage": self.linkage,"data": self.data,"action": self.action,"_tb_token_": self.tbToken,"event_submit_do_confirm": self.event,"praper_alipay_cashier_domain": self.unitSuffix,"input_charset": self.charset,"hierarchy": self.hierarchy}url = 'https://buy.tmall.com/auction/confirm_order.htm?x-itemid=' + self.auction[0] + '&x-uid=' + self.userId[0] + '&submitref=' + self.submitUrl#多線程,提高搶購效率thread_list=[]for i in range(1,80):t = threading.Thread(target=self.post, args=(url, data))thread_list.append(t)l = len(thread_list)# 啟動線程for i in range(0,l-1):thread_list[i].start()# 關(guān)閉線程for t in range(0,l-1):thread_list[i].join()while self.queue.empty() == False:req = self.queue.get()if self.key_word2 in req:print('提交訂單成功!請快盡快付款!')self.j = 1breakif self.j == 0:print('提交訂單失敗!請下次重試!')print('Buy End!')sys.exit(0)# 提取信息:商品詳情def patterGoods(self):# 頁面idself.auction=re.findall(r'(?<=auction=).*?(?=&)', self.req)# 用戶idself.userId=re.findall(r'(?<=&userid=).*?(?=&)', self.req)# 購買端tokentbTokens=re.findall(r'(?<=yunid=&).*?(?=&)', self.req)self.tbToken = tbTokens[0]# 提取信息:生成訂單數(shù)據(jù)def patterData(self):# 正則匹配data=re.findall(r'(?<="secretValue":).*?(?=,"unitSuffix")', self.req)if not data:return False self.submitUrl = ''.join(data)self.submitUrl=re.sub(r'"', '', self.submitUrl)self.submitUrl=re.sub(r',', '&', self.submitUrl)self.submitUrl=re.sub(r':', '=', self.submitUrl)data = re.findall(r'(?<="endpoint":).*?(?=,"data")', self.req)self.endpoint = ''.join(data)self.endpoint = quote(self.endpoint)data = re.findall(r'(?<="action":").*?(?=","event_submit_do_confirm")', self.req)self.action = ''.join(data)data = re.findall(r'(?<="event_submit_do_confirm":").*?(?=","input_charset")', self.req)self.event = ''.join(data)data = re.findall(r'(?<="input_charset":").*?(?=","pcSubmitUrl")', self.req)self.charset = ''.join(data)data = re.findall(r'(?<="unitSuffix":").*?(?="}},)', self.req)unitSuffix = ''.join(data)self.unitSuffix = "cashier" + unitSuffixdata=re.findall(r'(?<="data":).*?(?=,"linkage")', self.req)self.data = ''.join(data)self.data = quote(self.data) # url 編碼data=re.findall(r'(?<="linkage":).*?(?=,"hierarchy")', self.req)self.linkage = ''.join(data)self.linkage = quote(self.linkage)data=re.findall(r'(?<="hierarchy":).*?(?=,"container")', self.req)self.hierarchy = ''.join(data)self.hierarchy = quote(self.hierarchy)return Truedef post(self, url, data):req = self.session.post(url=url, data=data).textself.queue.put(req)也就……也就一兩百行代碼吧,當然這些代碼也不是完完全全由我敲出來的,我只是站在巨人的肩膀上(doge)
這不是全部的代碼,還有還有……
from TTime import postTime import TbMoudle, timeif __name__ == "__main__":# 商品鏈接#url = 'https://detail.tmall.com/item.htm?id=576148466933&spm=a1z09.2.0.0.28032e8dcv63yd&_u=1340hb4c2d7d&skuId=4516861399500' #用來測試的淘寶鏈接,通過url = 'https://chaoshi.detail.tmall.com/item.htm?id=20739895092&spm=a1z0k.7628870.0.0.6d8537de1tkYdk&_u=t2dmg8j26111&skuId=4227830352490' #茅臺鏈接#url = 'https://chaoshi.detail.tmall.com/item.htm?spm=a1z0d.6639537/tb.1997196601.3.52367484NWZmwA&id=541462757234&skuId=5029227863773' #用來測試的天貓鏈接,通過'''#設(shè)定搶購物品的url#詳情頁網(wǎng)址是用電腦登錄,選好數(shù)量和樣式之后的網(wǎng)址url=str(input("請輸入詳情頁網(wǎng)址:\n"))'''# 僅適用于 skUid 在鏈接末 即已選好商品規(guī)格的鏈接skuIds = url.split('=')k = len(skuIds)-1skuId = skuIds[k]quantity = '1' # 購買數(shù)量# 定時 + 毫秒延遲校正action_time='20:00:00'post_date = time.strftime("%Y/%#m/%#d",time.localtime(time.time()))post_time = post_date + ' ' + action_timesetTime = postTime(post_time) - 0.2# 實例化對象 a = TbMoudle.Login()a.submitOrder(url, skuId, setTime, quantity)還有一段,是上面這段代碼所需的模塊之一!
import time# 輸入觸發(fā)時間 返回時間戳 def postTime(setTime):#轉(zhuǎn)換成時間數(shù)組timeArray = time.strptime(setTime, "%Y/%m/%d %H:%M:%S")#轉(zhuǎn)換成時間戳timestamp = time.mktime(timeArray)return timestampok,全部代碼都在上面了,有時間會打包放在github上面,后面再更!別催!還有不要忘記安裝第二段代碼所需依賴!依賴放在下面了!一個一個裝吧,哈哈!
Pillow==9.3.0 psutil==5.9.1 requests==2.28.1 selenium==4.5.0說明
第一段代碼copy下來命名為TbMoudle.py,第二段命名為main.py(隨便命名也行),第三段命名為TTime.py,然后運行第二段代碼即可。想要搶購茅臺,在19:55左右運行main.py,過幾秒會出現(xiàn)二維碼,60秒內(nèi)使用淘寶掃碼即可(不要問我為什么不用保存的cookies登錄,問就是不方便)。雖然到現(xiàn)在我還沒有搶到過,但一定不是我的代碼的問題吧?對吧???嗯???
參考
想法來源:
http://t.csdn.cn/yNAZk
requests使用介紹:
Python Requests庫使用指南 - 掘金
selenium使用說明:
http://t.csdn.cn/DQd5n
……忘記還參考過誰了……如有相同,聯(lián)系博主進行修改!
代碼是不可能自己敲的(doge),這里借鑒了很多別人的代碼,不過這些思路是我自己想的,會禿頭的,覺得有用的能不能……點贊啥的???嗯???行不行???
說明:本文僅供學習研究,嚴禁從事非法活動,下載后請勿用于商業(yè)用途,任何后果由使用者本人負責;本文中使用的部分圖片以及部分代碼來自于網(wǎng)絡(luò),如有侵權(quán),請聯(lián)系博主進行刪除
轉(zhuǎn)載:歡迎轉(zhuǎn)載,但未經(jīng)作者同意,必須保留此段聲明;必須在文章中給出原文連接;否則必究法律責任
作者:希聲
總結(jié)
以上是生活随笔為你收集整理的python使用requests秒杀茅台(适用某宝,也可抢购其他商品)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Maya2015安装配置和学习
- 下一篇: panda3d python教程_pan