"""5014 零等待换号循环:失败 → 立即重载页面换新随机号重试,PASS 即停。 用户指令:不需要等待冷却时间,风控(5014)就直接换账号触发。 每次尝试 = Page.reload(清 session)→ 新随机手机号/密码 → 触发 → solve → xdotool 拖动。 """ import asyncio, sys, time sys.path.insert(0, "/home/yanghao05/Workspace/dy-captcha/try") sys.path.insert(0, "/home/yanghao05/Workspace/dy-captcha/src") import os os.environ["XDOTOOL"] = "1" os.environ["REPLAY"] = "1" os.environ["REPLAY_FILE"] = "/home/yanghao05/Workspace/dy-captcha/try/human_trace_pass.json" os.environ["REPLAY_SEG"] = "last" os.environ["REPLAY_MS"] = "2600" import cold_start_attempt as cs async def reload_page(): """Page.reload 清 session,等加载完成。""" import json, urllib.request as ur try: with ur.urlopen("http://127.0.0.1:9222/json/version", timeout=5) as r: ver = json.load(r) except (OSError, ValueError) as e: print(f"CDP 不可达: {e}", flush=True) return False targets = cs._json("/json/list") or [] page = next((t for t in targets if t["type"] == "page" and "douyin" in t.get("url", "")), None) if not page: return False import websockets async with websockets.connect(ver["webSocketDebuggerUrl"], max_size=64*1024*1024) as ws: mid = [0] async def cdp(method, params=None, sid=None): mid[0] += 1 m = {"id": mid[0], "method": method, "params": params or {}} if sid: m["sessionId"] = sid await ws.send(json.dumps(m)) while True: try: resp = json.loads(await ws.recv()) except (json.JSONDecodeError, asyncio.TimeoutError): continue if resp.get("id") == mid[0]: return resp psid = (await cdp("Target.attachToTarget", {"targetId": page["id"], "flatten": True})).get("result", {}).get("sessionId") # 清 cookie(用户指令:限流时清 cookie 即可解除触发限制) await cdp("Network.enable", sid=psid) await cdp("Network.clearBrowserCookies", sid=psid) await cdp("Page.enable", sid=psid) # cookie 清空后 session 失效可能跳转 —— 直接导航回目标页(比 reload 稳) await cdp("Page.navigate", {"url": "https://www.douyin.com/jingxuan"}, sid=psid) # 等主 frame 加载完成(最多 15s) for _ in range(60): try: ev = json.loads(await asyncio.wait_for(ws.recv(), timeout=2)) except (asyncio.TimeoutError, json.JSONDecodeError, ValueError): continue if ev.get("method") == "Page.loadEventFired" and ev.get("sessionId") == psid: break await asyncio.sleep(3) return True async def main(): for i in range(20): print(f"\n=== 尝试 {i+1} @ {time.strftime('%H:%M:%S')} ===", flush=True) # 失败后换号:重载页面(首次不重载,页面已是干净状态则直接用) if i > 0: try: ok = await reload_page() if not ok: print("页面未找到,跳过", flush=True) continue except Exception as e: print(f"reload 异常: {e}", flush=True) try: r = await cs.main_once(3, 9) except Exception as e: print(f"异常: {e}", flush=True) r = "error" print(f"结果: {r}", flush=True) if r == "PASS": print("*** CLOSED LOOP! ***", flush=True) return # 5014/500/502 全部立即换号重试,无等待 print("20 次尝试完毕", flush=True) if __name__ == "__main__": asyncio.run(main())