smoke.py 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. """End-to-end smoke test — REAL 996box protocol (HTTP part).
  2. USAGE:
  3. # Password login + list today's servers + launch (all HTTP)
  4. uv run python scripts/smoke.py
  5. Requires .env with CQ2_ACCOUNT / CQ2_PASSWORD.
  6. Geetest captcha: server may demand behavior check (code 101000);
  7. ManualGeetestSolver will prompt on stdin when that happens.
  8. """
  9. import argparse
  10. import asyncio
  11. import os
  12. import sys
  13. sys.path.insert(0, os.path.join(os.path.dirname(__file__), os.pardir, "src"))
  14. async def main() -> int:
  15. parser = argparse.ArgumentParser(description="cq2_sdk HTTP smoke test")
  16. parser.add_argument("--game-id", type=int, default=206923)
  17. args = parser.parse_args()
  18. from cq2_sdk.env_loader import load_env
  19. load_env()
  20. account = os.environ.get("CQ2_ACCOUNT") or os.environ.get("CQ2_PHONE")
  21. password = os.environ.get("CQ2_PASSWORD")
  22. if not account or not password:
  23. print("error: CQ2_ACCOUNT / CQ2_PASSWORD required in .env", file=sys.stderr)
  24. return 1
  25. from cq2_sdk.client import Cq2Client
  26. print(f"[smoke] login as {account!r} (real protocol: api.jiyuhz.cn)")
  27. async with Cq2Client(account=account, password=password) as cli:
  28. assert cli.box_session is not None
  29. print(f"[smoke] login OK: uid={cli.box_session.uid}")
  30. servers = await cli.launcher.get_today_servers(args.game_id)
  31. print(f"[smoke] today's servers: {len(servers)}")
  32. for s in servers[:5]:
  33. print(f" {s.server_name} sid={s.serverid} opens={s.section.strip()}")
  34. if servers:
  35. target = servers[-1]
  36. print(f"[smoke] EnterGameClient -> {target.server_name} (sid={target.serverid})")
  37. data = await cli.launcher.enter_game(target.serverid, game_id=args.game_id)
  38. print(f"[smoke] launch OK: {str(data)[:120]}")
  39. print("[smoke] HTTP chain complete. TCP part awaits Step 2 (Frida).")
  40. return 0
  41. if __name__ == "__main__":
  42. sys.exit(asyncio.run(main()))