This commit is contained in:
ddrwode
2026-02-27 18:20:14 +08:00
parent db0fa81b2e
commit 9c3f87bf93
2 changed files with 31 additions and 15 deletions

View File

@@ -15,7 +15,13 @@ from pathlib import Path
import numpy as np
from PIL import Image, ImageDraw
from tyyp_app.config import GET_YAN_ZHEN_MA_URL, ORDER_PACKET_URL, PROJECT_ROOT
from tyyp_app.config import (
GET_YAN_ZHEN_MA_URL,
ORDER_PACKET_URL,
PROJECT_ROOT,
UI_SLEEP_FACTOR,
UI_SLEEP_MIN_SECONDS,
)
# ---------- 拼图验证码计算 ----------
@@ -160,7 +166,13 @@ def find_first(page, selectors: list[str], timeout: float = 5):
return None
def wait_for_data_src(img_ele, timeout: float = 6, interval: float = 0.12) -> str:
def _sleep_ui(seconds: float, floor: float = UI_SLEEP_MIN_SECONDS) -> None:
if seconds <= 0:
return
time.sleep(max(float(floor), float(seconds) * float(UI_SLEEP_FACTOR)))
def wait_for_data_src(img_ele, timeout: float = 6, interval: float = 0.08) -> str:
"""轮询等待 img 元素的 src 变为有效 data:image URL。"""
deadline = time.time() + timeout
while time.time() < deadline:
@@ -169,7 +181,7 @@ def wait_for_data_src(img_ele, timeout: float = 6, interval: float = 0.12) -> st
_prefix, _, b64 = src.partition(",")
if b64.strip():
return src
time.sleep(interval)
_sleep_ui(interval, floor=0.01)
raise RuntimeError(
f"等待 data:image src 超时({timeout}s),当前 src 前80字符: {(img_ele.attr('src') or '')[:80]}"
)
@@ -664,13 +676,13 @@ def submit_phone(
url: str = "http://yscnb.com/tyyp/",
alpha_threshold: int = 12,
distance_adjust: int = 0,
wait_page: float = 0.3,
wait_page: float = 0.15,
) -> Any:
"""
填写手机号、点击获取验证码、执行滑块,返回 getYanZhenMa/v2 接口响应体。
"""
page.get(url)
time.sleep(wait_page)
_sleep_ui(wait_page, floor=0.03)
# 1. 勾选协议
agree_checkbox = find_first(
@@ -685,7 +697,7 @@ def submit_phone(
)
if agree_checkbox:
click_safe(agree_checkbox)
time.sleep(0.4)
_sleep_ui(0.4, floor=0.04)
# 2. 立即订购
order_btn = None
@@ -710,16 +722,16 @@ def submit_phone(
)
if order_btn:
break
time.sleep(0.25)
_sleep_ui(0.25, floor=0.03)
if order_btn:
try:
order_btn.run_js("this.scrollIntoView({block:'center'})")
time.sleep(0.05)
_sleep_ui(0.05, floor=0.008)
except Exception:
pass
click_safe(order_btn)
time.sleep(0.4)
_sleep_ui(0.4, floor=0.04)
else:
try:
page.run_js("""
@@ -736,7 +748,7 @@ def submit_phone(
""")
except Exception:
pass
time.sleep(0.4)
_sleep_ui(0.4, floor=0.04)
# 3. 输入手机号
phone_input = find_first(
@@ -886,7 +898,7 @@ def submit_phone(
last_move_distances = move_distances
drag_slider(page, slider, move_distance)
time.sleep(0.2)
_sleep_ui(0.2, floor=0.03)
remaining = max(0.1, deadline - time.time())
packet, toast_text = _wait_packet_or_feedback(page, timeout=min(4.0, remaining))
@@ -975,7 +987,7 @@ def submit_code(page, code: str) -> dict:
raise RuntimeError("未找到验证码输入框")
code_input.input(code, clear=True)
time.sleep(0.2)
_sleep_ui(0.2, floor=0.03)
confirm_btn = find_first(
page,
@@ -992,7 +1004,7 @@ def submit_code(page, code: str) -> dict:
try:
confirm_btn.run_js("this.scrollIntoView({block:'center'})")
time.sleep(0.05)
_sleep_ui(0.05, floor=0.008)
except Exception:
pass
@@ -1002,11 +1014,11 @@ def submit_code(page, code: str) -> dict:
def input_code(page, code):
page.ele('x://input[@placeholder="请输入验证码"]').input(code, clear=True)
time.sleep(0.5)
_sleep_ui(0.5, floor=0.06)
page.listen.start(ORDER_PACKET_URL)
page.ele('x://*[@id="app"]/div/img').click(by_js=True)
time.sleep(0.5)
_sleep_ui(0.5, floor=0.06)
page.ele('x://*[@id="app"]/div/div[7]/div/div[3]/button[2]').click(by_js=True)
res = _normalize_listen_packet(page.listen.wait(timeout=15, fit_count=False))
if res is None:

View File

@@ -17,6 +17,10 @@ PROXY_SOURCE_URL = "http://47.109.106.79:7002/ProxIpServiceTxt"
SESSION_IDLE_SECONDS = 180
FLOW_CLEANUP_INTERVAL_SECONDS = 15
# 自动化交互节奏(用于缩短按钮前后固定等待)
UI_SLEEP_FACTOR = 0.4
UI_SLEEP_MIN_SECONDS = 0.015
MOBILE_UA_POOL = [
"Mozilla/5.0 (Linux; Android 14; Pixel 8 Pro) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Mobile Safari/537.36",
"Mozilla/5.0 (Linux; Android 13; M2012K11AC) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Mobile Safari/537.36",