|
@@ -13,7 +13,7 @@ USE_PROXY = True
|
|
|
# 是否无头模式, 是 True 否 False
|
|
# 是否无头模式, 是 True 否 False
|
|
|
HEADLESS = False
|
|
HEADLESS = False
|
|
|
# 是否记录用户数据, 例如cookies, 是 True 否 False
|
|
# 是否记录用户数据, 例如cookies, 是 True 否 False
|
|
|
-NEED_USER_DATA = False
|
|
|
|
|
|
|
+NEED_USER_DATA = True
|
|
|
|
|
|
|
|
|
|
|
|
|
class GotifySender:
|
|
class GotifySender:
|
|
@@ -38,15 +38,46 @@ class GotifySender:
|
|
|
|
|
|
|
|
|
|
|
|
|
class ExecuteBrowserActon(object):
|
|
class ExecuteBrowserActon(object):
|
|
|
- def click_elements(self, page): # 点击元素
|
|
|
|
|
- pass
|
|
|
|
|
|
|
+ def click_elements(self, page, selector): # 点击元素
|
|
|
|
|
+ try:
|
|
|
|
|
+ # 等待元素可见
|
|
|
|
|
+ page.wait_for_selector(selector, state='visible')
|
|
|
|
|
+ # 点击元素
|
|
|
|
|
+ page.click(selector)
|
|
|
|
|
+ print("点击元素成功")
|
|
|
|
|
+ except Exception as e:
|
|
|
|
|
+ print(f"点击元素时发生异常: {e}")
|
|
|
|
|
+ return False
|
|
|
|
|
|
|
|
- def check_elements(self, page): # 检查元素
|
|
|
|
|
- pass
|
|
|
|
|
|
|
+ def check_elements(self, page, selector): # 检查元素
|
|
|
|
|
+ try:
|
|
|
|
|
+ # 等待元素可见
|
|
|
|
|
+ page.wait_for_selector(selector, state='visible')
|
|
|
|
|
+ # 获取元素的文本内容
|
|
|
|
|
+ element_text = page.query_selector(selector).inner_text()
|
|
|
|
|
+ # 返回元素的文本内容
|
|
|
|
|
+ return element_text
|
|
|
|
|
+ except Exception as e:
|
|
|
|
|
+ print(f"检查元素时发生异常: {e}")
|
|
|
|
|
+ return False
|
|
|
|
|
|
|
|
- def scroll_page(self): # 滚动页面
|
|
|
|
|
|
|
+ def scroll_page(self, page): # 滚动页面
|
|
|
pass
|
|
pass
|
|
|
|
|
|
|
|
|
|
+ def hide_elements(self, page, selector): # 隐藏元素
|
|
|
|
|
+ try:
|
|
|
|
|
+ page.evaluate('''() => {{
|
|
|
|
|
+ const img = document.querySelector('{}');
|
|
|
|
|
+ if (img) {{
|
|
|
|
|
+ img.style.display = 'none';
|
|
|
|
|
+ }}
|
|
|
|
|
+ }}'''.format(selector))
|
|
|
|
|
+ print("隐藏元素成功")
|
|
|
|
|
+ except Exception as e:
|
|
|
|
|
+ print(f"隐藏元素时发生异常: {e}")
|
|
|
|
|
+ return False
|
|
|
|
|
+ return True
|
|
|
|
|
+
|
|
|
|
|
|
|
|
class BrowserAutomation:
|
|
class BrowserAutomation:
|
|
|
def __init__(self):
|
|
def __init__(self):
|
|
@@ -61,14 +92,14 @@ class BrowserAutomation:
|
|
|
self.get_current_file_path(),
|
|
self.get_current_file_path(),
|
|
|
'user_data')
|
|
'user_data')
|
|
|
|
|
|
|
|
- def hang_up_browser(self, page): # 挂起浏览器
|
|
|
|
|
|
|
+ def check_browser_alive(self, page, browser): # 挂起浏览器
|
|
|
try:
|
|
try:
|
|
|
- while True:
|
|
|
|
|
- page.query_selector("head").inner_html()
|
|
|
|
|
- time.sleep(1)
|
|
|
|
|
|
|
+ page.query_selector("head").inner_html()
|
|
|
except Exception as e:
|
|
except Exception as e:
|
|
|
|
|
+ browser.close()
|
|
|
print(f"浏览器被关闭或发生异常: {e}")
|
|
print(f"浏览器被关闭或发生异常: {e}")
|
|
|
- print('关闭浏览器')
|
|
|
|
|
|
|
+ exit(0)
|
|
|
|
|
+
|
|
|
|
|
|
|
|
def set_browser(self, playwright): # 设置浏览器
|
|
def set_browser(self, playwright): # 设置浏览器
|
|
|
if self.need_user_data:
|
|
if self.need_user_data:
|
|
@@ -115,11 +146,43 @@ class BrowserAutomation:
|
|
|
def get_current_file_path(self): # 获取当前文件路径
|
|
def get_current_file_path(self): # 获取当前文件路径
|
|
|
return os.path.dirname(os.path.abspath(__file__))
|
|
return os.path.dirname(os.path.abspath(__file__))
|
|
|
|
|
|
|
|
- def exce_browser_action(self, page):
|
|
|
|
|
|
|
+ def exce_browser_action(self, page, browser):
|
|
|
# 实例化执行浏览器动作类
|
|
# 实例化执行浏览器动作类
|
|
|
Exce = ExecuteBrowserActon()
|
|
Exce = ExecuteBrowserActon()
|
|
|
|
|
|
|
|
- # 模拟各种动作
|
|
|
|
|
|
|
+ # 需要用到的所有 选择器
|
|
|
|
|
+ hide_img1 = 'body > div.faucet-wrapper > div > div > div > div.faucet-body > div > div.faucet-frontimage > img'
|
|
|
|
|
+ hide_img2 = 'body > div.faucet-wrapper > div > div > div > div.faucet-body > div > div.pow-status-container > div > div:nth-child(1) > div > img'
|
|
|
|
|
+ status_selector = 'body > div.faucet-wrapper > div > div > div > div.faucet-body > div > div.pow-status-container > div > div.row.pow-status-top > div:nth-child(1) > div.status-value'
|
|
|
|
|
+ button_selector1 = 'body > div.faucet-wrapper > div > div > div > div.faucet-body > div > div.faucet-actions.center > button'
|
|
|
|
|
+
|
|
|
|
|
+ # 隐藏两个图片
|
|
|
|
|
+ while True:
|
|
|
|
|
+ self.check_browser_alive(page, browser)
|
|
|
|
|
+ result = Exce.hide_elements(page, hide_img1)
|
|
|
|
|
+ time.sleep(0.5)
|
|
|
|
|
+ if result:
|
|
|
|
|
+ break
|
|
|
|
|
+
|
|
|
|
|
+ while True:
|
|
|
|
|
+ self.check_browser_alive(page, browser)
|
|
|
|
|
+ result = Exce.hide_elements(page, hide_img2)
|
|
|
|
|
+ time.sleep(0.5)
|
|
|
|
|
+ if result:
|
|
|
|
|
+ break
|
|
|
|
|
+
|
|
|
|
|
+ # 监控领水数值
|
|
|
|
|
+ while True:
|
|
|
|
|
+ self.check_browser_alive(page, browser)
|
|
|
|
|
+ status_value = Exce.check_elements(page, status_selector)
|
|
|
|
|
+ if status_value:
|
|
|
|
|
+ print(f"当前领取水滴数为: {status_value}")
|
|
|
|
|
+ value = float(status_value.split(' ')[0].strip())
|
|
|
|
|
+ if value >=2.49:
|
|
|
|
|
+ print('领取水滴数大于2.49, 领取水滴')
|
|
|
|
|
+ Exce.click_elements(page, button_selector1)
|
|
|
|
|
+ break
|
|
|
|
|
+ time.sleep(1)
|
|
|
|
|
|
|
|
def open_browser(self): # 打开浏览器
|
|
def open_browser(self): # 打开浏览器
|
|
|
with sync_playwright() as playwright:
|
|
with sync_playwright() as playwright:
|
|
@@ -134,11 +197,12 @@ class BrowserAutomation:
|
|
|
page.goto(self.target_url)
|
|
page.goto(self.target_url)
|
|
|
|
|
|
|
|
# TODO 此处开始执行自动化逻辑
|
|
# TODO 此处开始执行自动化逻辑
|
|
|
- self.exce_browser_action(page)
|
|
|
|
|
|
|
+ self.exce_browser_action(page, browser)
|
|
|
|
|
|
|
|
# 自动化执行完成, 挂起浏览器挂机,
|
|
# 自动化执行完成, 挂起浏览器挂机,
|
|
|
- self.hang_up_browser(page)
|
|
|
|
|
- browser.close()
|
|
|
|
|
|
|
+ while True:
|
|
|
|
|
+ self.check_browser_alive(page, browser)
|
|
|
|
|
+ time.sleep(1)
|
|
|
|
|
|
|
|
def main(self):
|
|
def main(self):
|
|
|
if self.need_user_data:
|
|
if self.need_user_data:
|