diff --git a/.github/workflows/zodgame.yml b/.github/workflows/zodgame.yml
index c45236b..afd6eb2 100644
--- a/.github/workflows/zodgame.yml
+++ b/.github/workflows/zodgame.yml
@@ -15,6 +15,9 @@ jobs:
runs-on: windows-latest
steps:
- uses: actions/checkout@v3
+ - uses: actions/setup-python@v5
+ with:
+ python-version: "3.13"
- name: Install requirements
run: |
pip3 install -r ./zodgame/requirements.txt
diff --git a/zodgame/requirements.txt b/zodgame/requirements.txt
index c12d709..819d361 100644
--- a/zodgame/requirements.txt
+++ b/zodgame/requirements.txt
@@ -1 +1 @@
-undetected-chromedriver
+nodriver
diff --git a/zodgame/zodgame.py b/zodgame/zodgame.py
index c9c31ec..a1a1ccc 100644
--- a/zodgame/zodgame.py
+++ b/zodgame/zodgame.py
@@ -1,105 +1,79 @@
-# encoding=utf8
-import io
import re
import sys
-import platform
-import subprocess
-sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf-8')
+import asyncio
+import nodriver
+from nodriver import cdp
+sys.stdout.reconfigure(encoding='utf-8')
-import undetected_chromedriver as uc
-from selenium.webdriver.support.ui import WebDriverWait
-from selenium.webdriver.common.by import By
-import requests
+async def zodgame_checkin(tab):
-def zodgame_checkin(driver, formhash):
checkin_url = "https://zodgame.xyz/plugin.php?id=dsu_paulsign:sign&operation=qiandao&infloat=1&inajax=0"
+ formhash = (await tab.find('//input[@name="formhash"]', timeout=180)).attrs["value"]
+
checkin_query = """
- (function (){
- var request = new XMLHttpRequest();
- var fd = new FormData();
- fd.append("formhash","%s");
- fd.append("qdxq","kx");
- request.open("POST","%s",false);
- request.withCredentials=true;
- request.send(fd);
- return request;
+ (async function() {
+ const formdata = new FormData();
+ formdata.append("formhash","%s");
+ formdata.append("qdxq","kx");
+
+ const result = await fetch('%s', {
+ method: 'POST',
+ body: formdata
+ })
+ .then(response => {
+ return response.text();
+ })
+
+ return result;
})();
""" % (formhash, checkin_url)
- checkin_query = checkin_query.replace("\n", "")
- driver.set_script_timeout(240)
- resp = driver.execute_script("return " + checkin_query)
- match = re.search('
\n(.*?)
\n', resp["response"], re.S)
+
+ resp = await tab.evaluate(checkin_query, await_promise=True, return_by_value=True)
+ match = re.search('\n(.*?)
\n', resp, re.S)
message = match[1] if match is not None else "签到失败"
print(f"【签到】{message}")
+
return "恭喜你签到成功!" in message or "您今日已经签到,请明天再来" in message
-def zodgame_task(driver, formhash):
-
- def clear_handles(driver, main_handle):
- handles = driver.window_handles[:]
- for handle in handles:
- if handle != main_handle:
- driver.switch_to.window(handle)
- driver.close()
- driver.switch_to.window(main_handle)
-
- def show_task_reward(driver):
- driver.get("https://zodgame.xyz/plugin.php?id=jnbux")
+async def zodgame_task(broswer):
+
+ async def show_task_reward(broswer):
+ tab = await broswer.get("https://zodgame.xyz/plugin.php?id=jnbux", new_tab=True)
try:
- WebDriverWait(driver, 240).until(
- lambda x: x.title != "Just a moment..."
- )
- reward = driver.find_element(By.XPATH, '//li[contains(text(), "点币: ")]').get_attribute("textContent")[:-2]
- print(f"【Log】{reward}")
+ reward_li = (await tab.find('//li[contains(text(), "点币: ")]', timeout=60))
+ print(f"【Log】{reward_li.text}")
except:
- pass
+ pass
- driver.get("https://zodgame.xyz/plugin.php?id=jnbux")
- WebDriverWait(driver, 240).until(
- lambda x: x.title != "Just a moment..."
- )
+ jnbux_tab = await broswer.get("https://zodgame.xyz/plugin.php?id=jnbux")
+
+ try:
+ join_task = await jnbux_tab.find_all('//a[text()="参与任务"]')
+ except:
+ join_task = []
+ success = True
- join_bux = driver.find_elements(By.XPATH, '//font[text()="开始参与任务"]')
- if len(join_bux) != 0 :
- driver.get(f"https://zodgame.xyz/plugin.php?id=jnbux:jnbux&do=join&formhash={formhash}")
- WebDriverWait(driver, 240).until(
- lambda x: x.title != "Just a moment..."
- )
- driver.get("https://zodgame.xyz/plugin.php?id=jnbux")
- WebDriverWait(driver, 240).until(
- lambda x: x.title != "Just a moment..."
- )
-
- join_task_a = driver.find_elements(By.XPATH, '//a[text()="参与任务"]')
- success = True
-
- if len(join_task_a) == 0:
+ if len(join_task) == 0:
print("【任务】所有任务均已完成。")
- return success
- handle = driver.current_window_handle
- for idx, a in enumerate(join_task_a):
- on_click = a.get_attribute("onclick")
+ #return success
+
+ for idx, a in enumerate(join_task):
+ print(a.attrs)
+ on_click = a.attrs["onclick"]
+ print(on_click)
+ #await a.click()
try:
- function = re.search("""openNewWindow(.*?)\(\)""", on_click, re.S)[0]
- script = driver.find_element(By.XPATH, f'//script[contains(text(), "{function}")]').get_attribute("text")
- task_url = re.search("""window.open\("(.*)", "newwindow"\)""", script, re.S)[1]
- driver.execute_script(f"""window.open("https://zodgame.xyz/{task_url}")""")
- driver.switch_to.window(driver.window_handles[-1])
+ tab = broswer.tabs[-1]
try:
- WebDriverWait(driver, 240).until(
- lambda x: x.find_elements(By.XPATH, '//div[text()="成功!"]')
- )
+ await tab.find('//div[text()="成功!"', timeout=240)
except:
print(f"【Log】任务 {idx+1} 广告页检查失败。")
pass
try:
- check_url = re.search("""showWindow\('check', '(.*)'\);""", on_click, re.S)[1]
- driver.get(f"https://zodgame.xyz/{check_url}")
- WebDriverWait(driver, 240).until(
- lambda x: len(x.find_elements(By.XPATH, '//p[contains(text(), "检查成功, 积分已经加入您的帐户中")]')) != 0
- or x.title == "BUX广告点击赚积分 - ZodGame论坛 - Powered by Discuz!"
- )
+ check_url = re.search("""showWindow('check', '(.*)');""", on_click, re.S)[1]
+ tab = await tab.get(f"https://zodgame.xyz/{check_url}")
+ await tab.find('//p[contains(text(), "检查成功, 积分已经加入您的帐户中")] | //title[text()="BUX广告点击赚积分 - ZodGame论坛 - Powered by Discuz!"]')
except:
print(f"【Log】任务 {idx+1} 确认页检查失败。")
pass
@@ -108,57 +82,44 @@ def show_task_reward(driver):
except Exception as e:
success = False
print(f"【任务】任务 {idx+1} 失败。", type(e))
- finally:
- clear_handles(driver, handle)
-
- show_task_reward(driver)
+
+ await show_task_reward(broswer)
return success
-def zodgame(cookie_string):
- options = uc.ChromeOptions()
- options.add_argument("--disable-popup-blocking")
- options.add_argument("--headless")
- driver = uc.Chrome(driver_executable_path = """C:\SeleniumWebDrivers\ChromeDriver\chromedriver.exe""",
- browser_executable_path = """C:\Program Files\Google\Chrome\Application\chrome.exe""",
- options = options)
+async def zodgame(cookie_string):
- # Load cookie
- driver.get("https://zodgame.xyz/")
+ browser = await nodriver.start(
+ headless = False,
+ sandbox = False,
+ browser_executable_path = """C:\Program Files\Google\Chrome\Application\chrome.exe""",
+ browser_args = ["--no-sandbox"]
+ )
+ tab = await browser.get('https://zodgame.xyz')
+ # Log in with cookie string
if cookie_string.startswith("cookie:"):
cookie_string = cookie_string[len("cookie:"):]
cookie_string = cookie_string.replace("/","%2")
- cookie_dict = [
- {"name" : x.split('=')[0].strip(), "value": x.split('=')[1].strip()}
+ cookie_dict = [
+ {"name": x.split('=')[0].strip(), "value": x.split('=')[1].strip()}
for x in cookie_string.split(';')
]
-
- driver.delete_all_cookies()
- for cookie in cookie_dict:
- if cookie["name"] in ["qhMq_2132_saltkey", "qhMq_2132_auth"]:
- driver.add_cookie({
- "domain": "zodgame.xyz",
- "name": cookie["name"],
- "value": cookie["value"],
- "path": "/",
- })
-
- driver.get("https://zodgame.xyz/")
-
- WebDriverWait(driver, 240).until(
- lambda x: x.title != "Just a moment..."
- )
- assert len(driver.find_elements(By.XPATH, '//a[text()="用户名"]')) == 0, "Login fails. Please check your cookie."
-
- formhash = driver.find_element(By.XPATH, '//input[@name="formhash"]').get_attribute('value')
- assert zodgame_checkin(driver, formhash) and zodgame_task(driver, formhash), "Checkin failed or task failed."
-
- driver.close()
- driver.quit()
+ cookies = [
+ cdp.network.CookieParam(domain = 'zodgame.xyz', name = cookie["name"], value = cookie["value"], path = '/')
+ for cookie in cookie_dict if cookie["name"] in ["qhMq_2132_saltkey", "qhMq_2132_auth"]
+ ]
+ #await browser.cookies.set_all(cookies)
+ await tab.send(cdp.storage.set_cookies(cookies))
+ await tab.reload()
+
+ task_manager = []
+ task_manager.append(await zodgame_checkin(tab))
+ task_manager.append(await zodgame_task(browser))
+ assert False in task_manager, "部分任务失败,请检查相关Log。"
-if __name__ == "__main__":
+if __name__ == '__main__':
cookie_string = sys.argv[1]
assert cookie_string
- zodgame(cookie_string)
+ asyncio.run(zodgame(cookie_string))