ITPub博客

首页 > IT职业 > IT生活 > python使用requests秒杀茅台(适用某宝,也可抢购其他商品)

python使用requests秒杀茅台(适用某宝,也可抢购其他商品)

IT生活 作者:专注的阿熊 时间:2023-01-12 17:04:47 0 删除 编辑

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 Image

class Login():

     def __init__(self):

         # 设置关键词进行匹配或判断,下同

         self.key_word1 = ' 账号管理 '

         self.key_word2 = ' 安全链接 '

         self.j = 0

         # 创建队列存放 post 订单结果

         self.queue = Queue(maxsize=100)

         # 创建 Session 对象   requests 库的 session 对象会在同一个 session 实例的所有请求之间使用 cookies 保持登录状态

         self.session = requests.session()

         # 设置 headers

         ua = "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)

     # 扫码登录,获取 cookies

     def 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)

         # 点击跳转扫码界面

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_png

         qrcode_img = Image.open(BytesIO(qrcode_img_data))

         qrcode_img.save('qrcode.png')

         qrcode_img.show()

         print(" 请扫码登录! ")

         time.sleep(2)

         # 每隔 1.5 秒判断一次是否登录成功

         t=0

         while 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').text

                 print(' 您的帐户 :' + info)

                 for proc in psutil.process_iter():  # 遍历当前 process

                     if proc.name() == "Microsoft.Photos.exe":

                         proc.kill()  # 关闭该 process

                 break

             except:

                 time.sleep(1.5)

                 t+=1

         # 获取 Cookie 并保持在 session 中

         cookies = browser.get_cookies()

         time.sleep(round(random.uniform(1,2),2))

         browser.quit()

         selenium_cookies = cookies

         tmp_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?').text

             if self.key_word1 in req:

                 print(" 自动登录成功! ")

             else:

                 print(" 自动登录失败! \n 请再次扫码登录! ")

                 self.get_cookies()

                 self.session.get('https://i.taobao.com/user/baseInfoSet.htm?').text

                 if self.key_word1 in req:

                     print(" 自动登录成功! ")

                 else:

                     print(" 自动登录失败! \n 请手动完成该任务 ")

                     sys.exit(0)

         except:

             print(' 程序出错! ')

             sys.exit(0)

     # 提交订单

     def submitOrder(self, url, skuId, setTime, quantity):

         self.url = url

         quantity = '_' + 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).text

         time.sleep(round(random.uniform(1,2),2))

         # 提取 key datas

         self.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 = 0

         while 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

                     # 获取数据

                     key = self.patterData()

                     k+=1

                     if(k==50):

                         print("\n 确认订单失败!下次加油哦 ")

                         print(datetime.datetime.now())

                         sys.exit(0)

                     if(key):

                         print("\n 确认订单成功! ")

                         print(datetime.datetime.now())

                         break

                 break

         # 提交订单

         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()

         # 关闭线程

         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 = 1

                 break

         if self.j == 0:

             print(' 提交订单失败!请下次重试! ')

         print('Buy End!')

         sys.exit(0)

     # 提取信息:商品详情

     def patterGoods(self):

         # 页面 id

         self.auction=re.findall(r'(?<=auction=).*?(?=&)', self.req)

         # 用户 id

         self.userId=re.findall(r'(?<=&userid=).*?(?=&)', self.req)

         # 购买端 token

         tbTokens=re.findall(r'(?<=yunid=&).*?(?=&)', self.req)

         self.tbToken = tbTokens[0]

     # 提取信息:生成订单数据

     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 =外汇跟单gendan5.com ''.join(data)

         data = re.findall(r'(?<="unitSuffix":").*?(?="}},)', self.req)

         unitSuffix = ''.join(data)

         self.unitSuffix = "cashier" + unitSuffix

         data=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 True

     def post(self, url, data):

         req = self.session.post(url=url, data=data).text

         self.queue.put(req)


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69946337/viewspace-2931957/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-08-23

  • 博文量
    410
  • 访问量
    276739