enable_heal_existing.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. # -*- coding: utf-8 -*-
  2. """
  3. enable_heal_existing.py —— 登录 → 连入已存在角色 → 开启喝药 → 保活
  4. 用法:
  5. .venv/bin/python enable_heal_existing.py --name 角色名 [--zone 区ID]
  6. """
  7. import argparse
  8. import os
  9. import socket
  10. import sys
  11. import threading
  12. import time
  13. import requests as rq
  14. import urllib3
  15. urllib3.disable_warnings()
  16. HERE = os.path.dirname(os.path.abspath(__file__))
  17. sys.path.insert(0, HERE)
  18. import login_996pc as L # noqa: E402
  19. import cq2_pure_enter as P # noqa: E402
  20. from combat_bot import enter_game_gate_v2, log # noqa: E402
  21. ZONE_19 = 14504561 # 逐鹿19区
  22. def main():
  23. ap = argparse.ArgumentParser()
  24. ap.add_argument("-u", "--user", default="longwu988")
  25. ap.add_argument("-p", "--password", default="Longwu1988")
  26. ap.add_argument("--zone", type=int, default=ZONE_19)
  27. ap.add_argument("--name", default="萌新4567")
  28. ap.add_argument("--port", type=int, default=0)
  29. args = ap.parse_args()
  30. # 1. 登录
  31. log(f"[1/5] 登录 {args.user} ...")
  32. s = rq.Session()
  33. j, _ = L.do_login(s, args.user, args.password)
  34. if j.get("code") != 200:
  35. raise SystemExit(f"[!] 登录失败: {j.get('msg')}")
  36. jwt = j["data"]["token"]
  37. uid = (j["data"].get("userInfo") or {}).get("id") or P.UID
  38. log(f" uid={uid}")
  39. # 2. EnterGameClient (zone)
  40. log(f"[2/5] EnterGameClient(zone={args.zone}) ...")
  41. r = P.enter_game(s, jwt, args.zone)
  42. if r.get("code") != 200:
  43. raise SystemExit(f"[!] 进区失败: {r.get('msg')}")
  44. # 3. 登录服握手 (重用已有角色)
  45. log(f"[3/5] 登录服握手 (重用角色 {args.name})...")
  46. ports = [args.port] if args.port else [8041, 8021, 8061, 8001]
  47. key32 = sid = tkey = game_port = None
  48. got_name = None
  49. for pt in ports:
  50. try:
  51. key32, sid, rname, tkey, game_port = P.login_gate(
  52. args.zone, jwt, args.name, pt, uid)
  53. if key32:
  54. got_name = rname
  55. log(f" 登录端口={pt} 角色={rname} 游戏端口={game_port}")
  56. break
  57. except SystemExit as e:
  58. log(f" 端口{pt}失败: {e}")
  59. except Exception as e:
  60. log(f" 端口{pt}失败: {str(e)[:80]}")
  61. if not key32:
  62. raise SystemExit("[!] 所有候选端口失败")
  63. name = got_name or args.name
  64. # 4. 连接游戏服
  65. log(f"[4/5] 连接游戏服 (v2)...")
  66. g = enter_game_gate_v2(args.zone, name, tkey, sid, game_port, uid)
  67. # 5. 开喝药
  68. log(f"[5/5] 开启自动喝药 ...")
  69. state = P.enable_auto_heal(g, sid, want_on=True)
  70. log(f" 喝药状态: {state} ✓ 已开启" if state == "on" else f" 喝药状态: {state} ⚠️ 请检查")
  71. # 心跳保活
  72. lock = threading.Lock()
  73. P.heartbeat_loop(g, sid, lock)
  74. log("[完成] 喝药开关已开启, 心跳保活中 (Ctrl+C 退出)...")
  75. # 让用户手动验证
  76. try:
  77. while True:
  78. time.sleep(60)
  79. # 周期性确认喝药状态
  80. new_state = P.game_action(g, sid, "@chiyao_kaiqi", 303, 901, wait=1.5)
  81. log(f" [心跳] 喝药状态: {new_state}")
  82. except KeyboardInterrupt:
  83. log("退出")
  84. if __name__ == "__main__":
  85. main()