python使用requests秒杀茅台(适用某宝,也可抢购其他商品)
前言
關(guān)于茅臺(tái)搶購(gòu),看過(guò)不下一百篇小文章,瀏覽來(lái)瀏覽去,也找不到幾篇合適的。雖然有很多人發(fā)布了使用selenium搶購(gòu)茅臺(tái)的腳本,但個(gè)人覺得這些沒有直接使用requests提交訂單來(lái)的快。于是!就有了你現(xiàn)在讀的文章!廢話不多說(shuō),開搞!
準(zhǔn)備工作
安裝python,這就不用我說(shuō)吧?至于開發(fā)工具使用什么看自己心情,我這里使用的是vscode,不知道如何操作的可以參考這位博主的http://t.csdn.cn/Xh3LG。這位博主的文章下面還有selenium的安裝教程,可以順便看一下,因?yàn)槲疫@里也要用到selenium登錄,我就不重復(fù)造輪子了。
分析一波搶購(gòu)流程
1、登錄
2、requests請(qǐng)求“確認(rèn)訂單”所需信息
3、requests請(qǐng)求“提交訂單”
看似簡(jiǎn)單的三步,我可花費(fèi)了好多心血來(lái)研究啊,得掉多少頭發(fā)!
具體實(shí)現(xiàn)過(guò)程
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)鍵詞進(jìn)行匹配或判斷,下同self.key_word1 = '賬號(hào)管理'self.key_word2 = '安全鏈接'self.j = 0#創(chuàng)建隊(duì)列存放post訂單結(jié)果self.queue = Queue(maxsize=100)# 創(chuàng)建Session對(duì)象 requests庫(kù)的session對(duì)象會(huì)在同一個(gè)session實(shí)例的所有請(qǐng)求之間使用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)# 點(diǎn)擊跳轉(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("請(qǐng)掃碼登錄!")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(): # 遍歷當(dāng)前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("自動(dòng)登錄成功!")else:print("自動(dòng)登錄失敗!\n請(qǐng)?jiān)俅螔叽a登錄!")self.get_cookies()self.session.get('https://i.taobao.com/user/baseInfoSet.htm?').textif self.key_word1 in req:print("自動(dòng)登錄成功!")else:print("自動(dòng)登錄失敗!\n請(qǐng)手動(dòng)完成該任務(wù)")sys.exit(0)except:print('程序出錯(cuò)!')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))# 進(jìn)入商品詳情頁(yè) 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))# 確認(rèn)訂單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購(gòu)買倒計(jì)時(shí):%.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確認(rèn)訂單失敗!下次加油哦")print(datetime.datetime.now())sys.exit(0)if(key):print("\n確認(rè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#多線程,提高搶購(gòu)效率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)# 啟動(dòng)線程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('提交訂單成功!請(qǐng)快盡快付款!')self.j = 1breakif self.j == 0:print('提交訂單失敗!請(qǐng)下次重試!')print('Buy End!')sys.exit(0)# 提取信息:商品詳情def patterGoods(self):# 頁(yè)面idself.auction=re.findall(r'(?<=auction=).*?(?=&)', self.req)# 用戶idself.userId=re.findall(r'(?<=&userid=).*?(?=&)', self.req)# 購(gòu)買端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)也就……也就一兩百行代碼吧,當(dāng)然這些代碼也不是完完全全由我敲出來(lái)的,我只是站在巨人的肩膀上(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' #用來(lái)測(cè)試的淘寶鏈接,通過(guò)url = 'https://chaoshi.detail.tmall.com/item.htm?id=20739895092&spm=a1z0k.7628870.0.0.6d8537de1tkYdk&_u=t2dmg8j26111&skuId=4227830352490' #茅臺(tái)鏈接#url = 'https://chaoshi.detail.tmall.com/item.htm?spm=a1z0d.6639537/tb.1997196601.3.52367484NWZmwA&id=541462757234&skuId=5029227863773' #用來(lái)測(cè)試的天貓鏈接,通過(guò)'''#設(shè)定搶購(gòu)物品的url#詳情頁(yè)網(wǎng)址是用電腦登錄,選好數(shù)量和樣式之后的網(wǎng)址url=str(input("請(qǐng)輸入詳情頁(yè)網(wǎng)址:\n"))'''# 僅適用于 skUid 在鏈接末 即已選好商品規(guī)格的鏈接skuIds = url.split('=')k = len(skuIds)-1skuId = skuIds[k]quantity = '1' # 購(gòu)買數(shù)量# 定時(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# 實(shí)例化對(duì)象 a = TbMoudle.Login()a.submitOrder(url, skuId, setTime, quantity)還有一段,是上面這段代碼所需的模塊之一!
import time# 輸入觸發(fā)時(shí)間 返回時(shí)間戳 def postTime(setTime):#轉(zhuǎn)換成時(shí)間數(shù)組timeArray = time.strptime(setTime, "%Y/%m/%d %H:%M:%S")#轉(zhuǎn)換成時(shí)間戳timestamp = time.mktime(timeArray)return timestampok,全部代碼都在上面了,有時(shí)間會(huì)打包放在github上面,后面再更!別催!還有不要忘記安裝第二段代碼所需依賴!依賴放在下面了!一個(gè)一個(gè)裝吧,哈哈!
Pillow==9.3.0 psutil==5.9.1 requests==2.28.1 selenium==4.5.0說(shuō)明
第一段代碼copy下來(lái)命名為TbMoudle.py,第二段命名為main.py(隨便命名也行),第三段命名為TTime.py,然后運(yùn)行第二段代碼即可。想要搶購(gòu)茅臺(tái),在19:55左右運(yùn)行main.py,過(guò)幾秒會(huì)出現(xiàn)二維碼,60秒內(nèi)使用淘寶掃碼即可(不要問(wèn)我為什么不用保存的cookies登錄,問(wèn)就是不方便)。雖然到現(xiàn)在我還沒有搶到過(guò),但一定不是我的代碼的問(wèn)題吧?對(duì)吧???嗯???
參考
想法來(lái)源:
http://t.csdn.cn/yNAZk
requests使用介紹:
Python Requests庫(kù)使用指南 - 掘金
selenium使用說(shuō)明:
http://t.csdn.cn/DQd5n
……忘記還參考過(guò)誰(shuí)了……如有相同,聯(lián)系博主進(jìn)行修改!
代碼是不可能自己敲的(doge),這里借鑒了很多別人的代碼,不過(guò)這些思路是我自己想的,會(huì)禿頭的,覺得有用的能不能……點(diǎn)贊啥的???嗯???行不行???
說(shuō)明:本文僅供學(xué)習(xí)研究,嚴(yán)禁從事非法活動(dòng),下載后請(qǐng)勿用于商業(yè)用途,任何后果由使用者本人負(fù)責(zé);本文中使用的部分圖片以及部分代碼來(lái)自于網(wǎng)絡(luò),如有侵權(quán),請(qǐng)聯(lián)系博主進(jìn)行刪除
轉(zhuǎn)載:歡迎轉(zhuǎn)載,但未經(jīng)作者同意,必須保留此段聲明;必須在文章中給出原文連接;否則必究法律責(zé)任
作者:希聲
總結(jié)
以上是生活随笔為你收集整理的python使用requests秒杀茅台(适用某宝,也可抢购其他商品)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Maya2015安装配置和学习
- 下一篇: java.util.LinkedHash