probe_npc_index.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. # -*- coding: utf-8 -*-
  2. """probe_npc_index.py —— 暴力扫描 CS1010 index 参数, 找服务器接受的组合。
  3. 用法: .venv/bin/python probe_npc_index.py [zone] [aid]
  4. """
  5. import json
  6. import sys
  7. import time
  8. HERE = __file__.rsplit("/", 1)[0]
  9. sys.path.insert(0, HERE)
  10. import requests as rq
  11. import urllib3
  12. urllib3.disable_warnings()
  13. import login_996pc as L
  14. import cq2_pure_enter as P
  15. from combat_bot import enter_game_gate_v2, send_init_frames, log
  16. from quest_bot3 import PushBot
  17. def connect(zone, user, pwd):
  18. s = rq.Session()
  19. j, _ = L.do_login(s, user, pwd)
  20. assert j.get("code") == 200, j.get("msg")
  21. jwt = j["data"]["token"]
  22. uid = str(j["data"]["userInfo"]["id"])
  23. r = P.enter_game(s, jwt, zone)
  24. assert r.get("code") == 200, r.get("msg")
  25. got = None
  26. for pt in (8021, 8061, 8001, 8041):
  27. try:
  28. r = P.login_gate(zone, jwt, "__probe__", pt, uid)
  29. if r[0]:
  30. got = r
  31. break
  32. except SystemExit as e:
  33. log(f"port {pt}: {e}")
  34. except Exception as e:
  35. log(f"port {pt}: {str(e)[:50]}")
  36. time.sleep(3)
  37. assert got, "[!] 所有登录端口失败"
  38. key32, sid, rname, tkey, gp = got
  39. g = enter_game_gate_v2(zone, rname, tkey, sid, gp, uid)
  40. bot = PushBot(g, sid, rname)
  41. P.heartbeat_loop(g, sid, bot.lock)
  42. t0 = time.time()
  43. while time.time() - t0 < 12:
  44. bot.pump(0.3)
  45. if 658 in bot.frame_log:
  46. break
  47. assert 658 in bot.frame_log, "[!] SC658 超时"
  48. send_init_frames(bot, uid)
  49. for _ in range(20):
  50. bot.pump(0.5)
  51. if bot.me["id"] and bot.me.get("mapname"):
  52. break
  53. return g, bot
  54. def main():
  55. zone = int(sys.argv[1]) if len(sys.argv) > 1 else 14504561
  56. g, bot = connect(zone, "longwu988", "Longwu1988")
  57. log(f"进世界: {bot.me.get('mapname')} @{bot.me['x']},{bot.me['y']}")
  58. t0 = time.time()
  59. while time.time() - t0 < 8 and not bot.npcs:
  60. bot.pump(0.4)
  61. npc = bot.find_guide_npc()
  62. assert npc, "[!] 无 NPC"
  63. t_end = time.time() + 40
  64. while time.time() < t_end and bot.alive:
  65. bot.pump(0.1)
  66. bot.tick_step_ack()
  67. _, arrived = bot.walk_step_toward(npc["x"], npc["y"], run=False)
  68. if arrived:
  69. break
  70. time.sleep(max(0.0, 0.547 - (time.time() - bot._last_step_t)))
  71. log(f"就位: pos=({bot.me['x']},{bot.me['y']}) npc@({npc['x']},{npc['y']}) "
  72. f"aid={npc['aid']} index={npc['index']}")
  73. hits = []
  74. for idx in list(range(0, 300)):
  75. before = dict(bot.frame_log)
  76. bot.send(1010, 0, 0, 0, bot.sid, json.dumps(
  77. {"UserID": npc["aid"], "index": idx},
  78. separators=(",", ":")).encode())
  79. talk = None
  80. t0 = time.time()
  81. while time.time() - t0 < 0.9:
  82. evs = bot.pump(0.2)
  83. bot.tick_step_ack()
  84. talk = next((e[1] for e in evs if e[0] == "npc_talk"), None)
  85. if talk or bot.teleports and bot.frame_log.get(800, 0) > before.get(800, 0):
  86. break
  87. new = {k: v - before.get(k, 0) for k, v in bot.frame_log.items()
  88. if v > before.get(k, 0)}
  89. if talk or new.get(643) or new.get(800) or new.get(51):
  90. log(f"*** index={idx} 响应! talk={'Y' if talk else 'N'} new={new}")
  91. if talk:
  92. log(f" sMsg: {str(talk.get('sMsg'))[:300]}")
  93. hits.append(idx)
  94. break
  95. if idx % 40 == 0:
  96. log(f" 已试到 {idx} ... pos=({bot.me['x']},{bot.me['y']})")
  97. time.sleep(0.05)
  98. log(f"完成, 命中: {hits}")
  99. g.close()
  100. if __name__ == "__main__":
  101. main()