| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- # -*- coding: utf-8 -*-
- """
- enable_heal_existing.py —— 登录 → 连入已存在角色 → 开启喝药 → 保活
- 用法:
- .venv/bin/python enable_heal_existing.py --name 角色名 [--zone 区ID]
- """
- import argparse
- import os
- import socket
- import sys
- import threading
- import time
- import requests as rq
- import urllib3
- urllib3.disable_warnings()
- HERE = os.path.dirname(os.path.abspath(__file__))
- sys.path.insert(0, HERE)
- import login_996pc as L # noqa: E402
- import cq2_pure_enter as P # noqa: E402
- from combat_bot import enter_game_gate_v2, log # noqa: E402
- ZONE_19 = 14504561 # 逐鹿19区
- def main():
- ap = argparse.ArgumentParser()
- ap.add_argument("-u", "--user", default="longwu988")
- ap.add_argument("-p", "--password", default="Longwu1988")
- ap.add_argument("--zone", type=int, default=ZONE_19)
- ap.add_argument("--name", default="萌新4567")
- ap.add_argument("--port", type=int, default=0)
- args = ap.parse_args()
- # 1. 登录
- log(f"[1/5] 登录 {args.user} ...")
- s = rq.Session()
- j, _ = L.do_login(s, args.user, args.password)
- if j.get("code") != 200:
- raise SystemExit(f"[!] 登录失败: {j.get('msg')}")
- jwt = j["data"]["token"]
- uid = (j["data"].get("userInfo") or {}).get("id") or P.UID
- log(f" uid={uid}")
- # 2. EnterGameClient (zone)
- log(f"[2/5] EnterGameClient(zone={args.zone}) ...")
- r = P.enter_game(s, jwt, args.zone)
- if r.get("code") != 200:
- raise SystemExit(f"[!] 进区失败: {r.get('msg')}")
- # 3. 登录服握手 (重用已有角色)
- log(f"[3/5] 登录服握手 (重用角色 {args.name})...")
- ports = [args.port] if args.port else [8041, 8021, 8061, 8001]
- key32 = sid = tkey = game_port = None
- got_name = None
- for pt in ports:
- try:
- key32, sid, rname, tkey, game_port = P.login_gate(
- args.zone, jwt, args.name, pt, uid)
- if key32:
- got_name = rname
- log(f" 登录端口={pt} 角色={rname} 游戏端口={game_port}")
- break
- except SystemExit as e:
- log(f" 端口{pt}失败: {e}")
- except Exception as e:
- log(f" 端口{pt}失败: {str(e)[:80]}")
- if not key32:
- raise SystemExit("[!] 所有候选端口失败")
- name = got_name or args.name
- # 4. 连接游戏服
- log(f"[4/5] 连接游戏服 (v2)...")
- g = enter_game_gate_v2(args.zone, name, tkey, sid, game_port, uid)
- # 5. 开喝药
- log(f"[5/5] 开启自动喝药 ...")
- state = P.enable_auto_heal(g, sid, want_on=True)
- log(f" 喝药状态: {state} ✓ 已开启" if state == "on" else f" 喝药状态: {state} ⚠️ 请检查")
- # 心跳保活
- lock = threading.Lock()
- P.heartbeat_loop(g, sid, lock)
- log("[完成] 喝药开关已开启, 心跳保活中 (Ctrl+C 退出)...")
- # 让用户手动验证
- try:
- while True:
- time.sleep(60)
- # 周期性确认喝药状态
- new_state = P.game_action(g, sid, "@chiyao_kaiqi", 303, 901, wait=1.5)
- log(f" [心跳] 喝药状态: {new_state}")
- except KeyboardInterrupt:
- log("退出")
- if __name__ == "__main__":
- main()
|