# -*- coding: utf-8 -*- """probe_npc_index.py —— 暴力扫描 CS1010 index 参数, 找服务器接受的组合。 用法: .venv/bin/python probe_npc_index.py [zone] [aid] """ import json import sys import time HERE = __file__.rsplit("/", 1)[0] sys.path.insert(0, HERE) import requests as rq import urllib3 urllib3.disable_warnings() import login_996pc as L import cq2_pure_enter as P from combat_bot import enter_game_gate_v2, send_init_frames, log from quest_bot3 import PushBot def connect(zone, user, pwd): s = rq.Session() j, _ = L.do_login(s, user, pwd) assert j.get("code") == 200, j.get("msg") jwt = j["data"]["token"] uid = str(j["data"]["userInfo"]["id"]) r = P.enter_game(s, jwt, zone) assert r.get("code") == 200, r.get("msg") got = None for pt in (8021, 8061, 8001, 8041): try: r = P.login_gate(zone, jwt, "__probe__", pt, uid) if r[0]: got = r break except SystemExit as e: log(f"port {pt}: {e}") except Exception as e: log(f"port {pt}: {str(e)[:50]}") time.sleep(3) assert got, "[!] 所有登录端口失败" key32, sid, rname, tkey, gp = got g = enter_game_gate_v2(zone, rname, tkey, sid, gp, uid) bot = PushBot(g, sid, rname) P.heartbeat_loop(g, sid, bot.lock) t0 = time.time() while time.time() - t0 < 12: bot.pump(0.3) if 658 in bot.frame_log: break assert 658 in bot.frame_log, "[!] SC658 超时" send_init_frames(bot, uid) for _ in range(20): bot.pump(0.5) if bot.me["id"] and bot.me.get("mapname"): break return g, bot def main(): zone = int(sys.argv[1]) if len(sys.argv) > 1 else 14504561 g, bot = connect(zone, "longwu988", "Longwu1988") log(f"进世界: {bot.me.get('mapname')} @{bot.me['x']},{bot.me['y']}") t0 = time.time() while time.time() - t0 < 8 and not bot.npcs: bot.pump(0.4) npc = bot.find_guide_npc() assert npc, "[!] 无 NPC" t_end = time.time() + 40 while time.time() < t_end and bot.alive: bot.pump(0.1) bot.tick_step_ack() _, arrived = bot.walk_step_toward(npc["x"], npc["y"], run=False) if arrived: break time.sleep(max(0.0, 0.547 - (time.time() - bot._last_step_t))) log(f"就位: pos=({bot.me['x']},{bot.me['y']}) npc@({npc['x']},{npc['y']}) " f"aid={npc['aid']} index={npc['index']}") hits = [] for idx in list(range(0, 300)): before = dict(bot.frame_log) bot.send(1010, 0, 0, 0, bot.sid, json.dumps( {"UserID": npc["aid"], "index": idx}, separators=(",", ":")).encode()) talk = None t0 = time.time() while time.time() - t0 < 0.9: evs = bot.pump(0.2) bot.tick_step_ack() talk = next((e[1] for e in evs if e[0] == "npc_talk"), None) if talk or bot.teleports and bot.frame_log.get(800, 0) > before.get(800, 0): break new = {k: v - before.get(k, 0) for k, v in bot.frame_log.items() if v > before.get(k, 0)} if talk or new.get(643) or new.get(800) or new.get(51): log(f"*** index={idx} 响应! talk={'Y' if talk else 'N'} new={new}") if talk: log(f" sMsg: {str(talk.get('sMsg'))[:300]}") hits.append(idx) break if idx % 40 == 0: log(f" 已试到 {idx} ... pos=({bot.me['x']},{bot.me['y']})") time.sleep(0.05) log(f"完成, 命中: {hits}") g.close() if __name__ == "__main__": main()