如何撸一个华为手机抢购脚本

微信公众号:漫漫编程路
如果你觉得本文对你有帮助,欢迎点赞转发

前言

  自从华为偷偷上架了遥遥领先的华为 Mate 系列新款呢手机后,受到了大家的疯狂的追捧,机器现在可谓是一机难求。每天开启的限时抢购笔者抢了几次,简直每次都是秒没,最终等来一句话:“抢购失败,欢迎下次再来”。
在线抢购真的是大家拼网速、拼手速的时候,本着解放双手以及提高抢到的概率,于是我萌生了写个抢购脚本的想法,说干就干,于是花费了一晚上撸了个自动抢购华为 Mate 系列手机的脚本。源码文末会附链接。

原理

  其实原理非常简单,就是让机器模拟人的操作。通过 Python + Selemium + Browser Driver 实现UI自动化,模拟人在浏览器上的操作,机器操作时间是毫秒级别,远快于手速。

环境要求

  • Python:版本需要 3.6 以上(含)
  • Selemium:版本需要 4.12.0 以上(含)
  • Browser Driver:需要下载Browser版本相匹配的Driver,目前只支持 Chrome 浏览器

实现

  华为手机抢购大致分为以下几个部分,具体实现步骤如下:

  1. 进行相关配置
[user]
name=mobile
password=password

[product]
name=Mate60Pro+
id=10086764961298
color=宣白
version=16GB+512GB

[chrome]
# 不同系统的Chrome的用户数据目录不同
# Windows:userDataDir=C:/Users/用户名/AppData/Local/Google/Chrome/User Data
# Linux系统:userDataDir=~/.config/google-chrome/Default
# MacOS系统:userDataDir=/Users/用户名/Library/Application Support/Google/Chrome/Default
userDataDir=/Users/用户名/Library/Application Support/Google/Chrome/Default
  1. 进行浏览器设置
def __browser_setting(self):
    print("{0} 开始设置浏览器参数".format(datetime.now()))
    options = webdriver.ChromeOptions()
    options.add_argument(r"--user-data-dir={}".format(self.__config_get("chrome", "userDataDir")))
    options.add_argument(r"--profile-directory={}".format("Profile 5"))
    browser = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)
    print("{0} 设置浏览器参数完成".format(datetime.now()))
    browser.maximize_window()
    self.browser = browser
  1. 访问华为商城
def __visit_official_website(self):
    print("{0} 开始进入华为官网".format(datetime.now()))
    self.browser.get('https://www.vmall.com/')
    print("{0} 已进入华为官网".format(datetime.now()))
  1. 登录华为账号
def __login(self):
    print("{0} 开始登录华为账号".format(datetime.now()))
    self.__goto_login_page()
    self.__submit_login()
    self.__check_is_login()
    if self.isLogin:
        print("{0} 当前登录账号为:{1}".format(datetime.now(), self.nickname))

    print("{0} 结束登录华为账号".format(datetime.now()))

def __goto_login_page(self):
    print("{0} 点击登录按钮".format(datetime.now()))
    login = WebDriverWait(self.browser, self.defaultTimeout).until(
        EC.presence_of_element_located((By.CLASS_NAME, "r-1a7l8x0"))
    )
    login.click()
    print("{0} 已跳转登录页面".format(datetime.now()))

def __submit_login(self):
    print("{0} 开始输入账号及密码".format(datetime.now()))
    input_elements = WebDriverWait(self.browser, self.defaultTimeout).until(
        EC.presence_of_all_elements_located((By.CLASS_NAME, "hwid-input"))
    )

    input_elements[0].send_keys(self.__config_get("user", "name"))
    input_elements[1].send_keys(self.__config_get("user", "password"))
    print("{0} 已输入账号及密码".format(datetime.now()))

    WebDriverWait(self.browser, self.defaultTimeout).until(
        EC.presence_of_element_located((By.CLASS_NAME, "hwid-login-btn"))
    ).click()
    print("{0} 发起登录请求".format(datetime.now()))
    self.browser.implicitly_wait(20)

def __check_is_login(self):
    try:
        self.browser.find_element(By.LINK_TEXT, "请登录")
        self.isLogin = False
        print("{0} 账号登录失败,请重试".format(datetime.now()))
    except NoSuchElementException:
        self.isLogin = True
        print("{0} 账号登录成功".format(datetime.now()))
        self.nickname = WebDriverWait(self.browser, self.defaultTimeout).until(
            EC.presence_of_element_located((By.CLASS_NAME, "r-1pn2ns4"))
        ).text
  1. 进入对应的手机详情页
def __visit_product_page(self):
    print("{0} 开始进入华为 {1} 产品详情页".format(datetime.now(), self.__config_get("product", "name")))
    self.browser.get("https://www.vmall.com/product/{0}.html".format(self.__config_get("product", "id")))
    self.browser.refresh()
    self.browser.implicitly_wait(20)
    print("{0} 已进入华为 {1} 产品详情页".format(datetime.now(), self.__config_get("product", "name")))
  1. 选择自己要抢购的手机颜色及版本
def __choose_product(self):
    print("{0} 开始选择手机规格".format(datetime.now()))
    sku_color = self.__config_get("product", "color")
    sku_version = self.__config_get("product", "version")
    WebDriverWait(self.browser, self.defaultTimeout).until(
        EC.presence_of_element_located((By.LINK_TEXT, f"{sku_color}"))
    ).click()
    WebDriverWait(self.browser, self.defaultTimeout).until(
        EC.presence_of_element_located((By.LINK_TEXT, f"{sku_version}"))
    ).click()
    print("{0} 选择手机规格完成,颜色:{1} 版本:{2}".format(datetime.now(), sku_color, sku_version))
  1. 轮训抢购开始倒计时,判断是否最后10秒,最后10秒内不断尝试抢购
def __countdown(self):
    while self.isCountdown:
        countdown_times = self.__get_countdown_time()
        if len(countdown_times) > 0:
            print("{0} 距离抢购开始还剩:{1}".format(datetime.now(), self.__format_countdown_time(countdown_times)))
            self.__set_start_buying(countdown_times)
            if not self.isStartBuying:
                time.sleep(1)

def __start_buying(self):
    while self.isStartBuying:
        countdown_times = self.__get_countdown_time()
        if len(countdown_times) > 0:
            print("{0} 距离抢购开始还剩:{1}".format(datetime.now(), self.__format_countdown_time(countdown_times)))
            button_element = WebDriverWait(self.browser, self.defaultTimeout).until(
                EC.presence_of_element_located((By.XPATH, "//div[@id='pro-operation']/a"))
            )
            button_element.click()
            time.sleep(0.0001)

  至此,一个简单的华为手机抢购脚本就大功告成了,需要注意的是,华为抢购流程会不断变化的,导致这个脚本可能会存在问题,需要及时调整

特别说明

  本脚本仅用于测试和学习研究,禁止用于商业用途,不能保证其合法性,准确性,完整性和有效性,请根据情况自行判断。
本文及本文所有资源文件,禁止任何公众号、自媒体进行任何形式的转载、发布。

源码地址

GitHub地址:ancoka/hw_seckill

关注我

下面的是我的公众号二维码图片,欢迎关注。

图注:漫漫编程路公众号

你可能感兴趣的:(华为,智能手机,python)