# protocol_bot — 传奇纯协议客户端(Python) > 迁移自实验工程 `传奇_bak`(2026-09 实测验证),2026-09-21 在本目录复验通过。 > 能力:HTTP 登录(极验滑块自动破解)→ 选区 → 创角 → 进游戏 → 开喝药,全程无游戏客户端。 > **2026-09-22: quest_bot3.py 端到端打通新手任务全流程(等待图→NPC传送→比奇→杀2怪), > 42 秒完成,基于"实时虚拟环境"架构(见下)**。 ## quest_bot3 — 推送驱动微缩客户端(虚拟环境架构) ```bash .venv/bin/python quest_bot3.py --zone 14492165 --name <角色> -u z1098210167 -p yang535006 --kill 2 # 删角重创(新手任务重置): .venv/bin/python reset_role.py --zone 14492165 --name <角色> ... ``` 架构原则(对照客户端 recv_loop+Lua 消息订阅): bot = 无渲染的虚拟世界镜像, 收帧泵持续把服务器推送解析进虚拟环境(怪/玩家/NPC/任务/HP), 决策循环每个 节拍(150ms)读最新状态并发反馈帧, 绝不 sleep 失明。 已破译机制(全部实测, 详见 quest_bot3.py 注释): - **任务链**: SC55 推任务体 → CS3031 回构造(实时body,非模板) → CS1011 @renwu_mov,1 → SC800 传送(body JSON UserID=自己uid; SC801 是他人飞入广播勿混) → CS1010 {UserID:NPC aid(动态,每角色不同), index:35} → 传送比奇(289-293,615-621 杀怪区) - **传送 ACK**: SC800/SC51 到达即发 CS5012+CS5027(body=协议图名: 比奇'0' 盟重'3' 等待图中文名)+CS5012('cTh'); 不发则服务器不下发该图视野推送(SC10 一帧不来) - **怪物双雷达**: SC10 进视野(race>1000=怪)+SC14 攻击广播(怪打人时 UserID=怪短ID, X/Y=怪坐标) 补录 — 传送瞬间批量帧里的 SC10 会丢, 雷达互备 - **怪物移动**: SC11/13 = 全体 actor 移动广播(body.UserID 查表更新, Lua 真源 netActorController handle_MSG_SC_ACTOR_WALK) - **挂机 = 客户端 AI**: @startguaji/CS9102 只是声明, 打怪是客户端行为树 (AutoController: 选怪→走位→CS3014 攻击{skillID:0,targetID:字符串短ID}), bot 复刻此 AI, 0.65s/刀(HitTime) - **走路帧**: CS3013 跑 p1=dir,p2=起点point(Y<<16|X),p3=sid; CS3011 走 recog=point,p2=dir,p3=起点point; body=地图名(容忍过期缓存) - **死亡**: SC32 body=死亡actorID(主玩家/怪共用); 自己死→等SC27复活; - **必处理帧**: SC31(受击HP)/SC53(HP恢复,管道格式); SC881/14表现帧可弃(但14可当雷达) 已知问题: ~~位置偶发漂移 (1,1)~~ 已修复(两类SC28异常帧: X/Y反序帧按就近解读采信, (0,0)清位帧忽略, run28/30/32/37 四轮验证零漂移); 新手任务怪池有限 — 账号杀满后 该区域不再刷怪(游戏机制, 非bot缺陷), 换号/reset_role 即可; SC14 自ID学习 (攻击回显匹配自身短会话ID, 供SC11自回显精确匹配)已加入, 怪密集场景下生效。 ## 快速使用 ```bash cd protocol_bot .venv/bin/python run_create_role_and_autoheal.py --zone <区ID> [--name 角色名] [--port 8041] ``` - 区 ID 来源:`https://list-box.dhsf.xqhuyu.com/box_serverlist/206923.txt`(state=1 的 serverid) - 端口默认自动轮询 8041/8021/8061/8001;游戏端口由 SC525 自动下发 - 角色名缺省随机"萌新XXXX";角色已存在时自动复用列表内角色(522=名字重复,属正常) ## 文件说明 | 文件 | 职责 | |---|---| | `run_create_role_and_autoheal.py` | 入口:登录→创角→进游戏→开喝药→心跳保活60s | | `login_996pc.py` | 996盒子 HTTP 登录(RSA+极验v4滑块求解+token 管理) | | `cq2_pure_enter.py` | TCP 协议链:2001→529→104→530→100→520→101→521→103→525→CS20 握手→17帧初始化→`enable_auto_heal` | | `encode6bitbuf_final.py` | 协议头 Encode6BitBuf 编解码(算法文档见 docs/) | | `Encode6BitBuf_替换表.bin` | 编码替换表(运行时必需,勿删) | | `vendor/geeked/` | 极验 v4 滑块求解器(onnx 模型+签名,来自 GeekedTest) | | `docs/ui60_初始化模板.json` | 17 帧初始化之 5277 功能位图模板(缺则服务器静默) | | `.venv/` | Python 3.12,site-packages 符号链接至 `传奇_bak/.venv-mac`(共享依赖,勿单独删除源) | ## 关键协议备忘 - **开喝药**:CS3199 `{"index":109,"act":"@openmianban,23"}` → `{"index":303,"act":"@chiyao_kaiqi"}`,回包 zlib 面板中 `yd_cy1` 控件 `but_1.png`=on - **创角**:CS101 JSON(`server_name/chr/job/sex/account/sdkid`)→ SC521 票据 `名/UserID` - **心跳**:CS60000(recog=unix秒),≥2s 间隔 - **17 帧初始化**:1018/1046×4/2020/5026(145B指纹)/5028/5027/5260/1078/1079/5148/5277(415B位图)/1103/1151/6209/6208/5027 — 不发则服务器丢弃 UI 交互 - 端口陷阱:SC60005≠占线,可能是错端口假响应→换端口重试 ## 依赖(共享自 传奇_bak/.venv-mac) requests / pycryptodome / pymysql / opencv-headless / numpy / curl_cffi ## 注意 - DB_CONFIG(公钥缓存源)在 `login_996pc.py`,可用环境变量 CQ2_DB_* 覆盖 - 测试账号 longwu988(自己注册);token 缓存 token_pc.txt(未迁移,登录自动重取) - ⚠️ 仅限学习研究,勿高频调用/勿用于商业用途