微信公众号:漫漫编程路
如果你觉得本文对你有帮助,欢迎点赞转发
自从华为偷偷上架了遥遥领先的华为 Mate 系列新款呢手机后,受到了大家的疯狂的追捧,机器现在可谓是一机难求。每天开启的限时抢购笔者抢了几次,简直每次都是秒没,最终等来一句话:“抢购失败,欢迎下次再来”。
在线抢购真的是大家拼网速、拼手速的时候,本着解放双手以及提高抢到的概率,于是我萌生了写个抢购脚本的想法,说干就干,于是花费了一晚上撸了个自动抢购华为 Mate 系列手机的脚本。源码文末会附链接。
其实原理非常简单,就是让机器模拟人的操作。通过 Python + Selemium + Browser Driver
实现UI自动化,模拟人在浏览器上的操作,机器操作时间是毫秒级别,远快于手速。
华为手机抢购大致分为以下几个部分,具体实现步骤如下:
[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
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
def __visit_official_website(self):
print("{0} 开始进入华为官网".format(datetime.now()))
self.browser.get('https://www.vmall.com/')
print("{0} 已进入华为官网".format(datetime.now()))
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
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")))
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))
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
下面的是我的公众号二维码图片,欢迎关注。