LP机器人/机器人.e,2016-06-03,10,763 字节,扫描产出 82 条串。

方法在旗舰篇。这一篇想说一件更实用的事:当一个工程的串少到 82 条,你不需要筛选,需要的是把它摆成四栏。


把 82 条串摆成四栏

界面事件状态变量用户文案
超级列表框1__启动窗口_创建完毕钱数,报到成功!
TA发送的信息_按钮1_被单击钱总,您已经报到过了
编辑框1 / 2 / 3(只有这两个事件名)钱分请用 收杆 结束钓鱼。
标签1 / 2 / 3鱼儿分2:签到(每日一签~)
按钮1 / 2(确定)签到人总功能:
返回信息钓鱼人总帮助
机器人控制区(分组框)句柄分钱了!
其他区(分组框)句柄QQ记录分钱了。
读取在哪记录 / 记录类型删除成员 (j, , )
想读取的索引 / 刷新
要判断的功能:
线程 / 常量1

支持库:系统核心支持库、扩展界面支持库一、多线程支持库、特殊功能支持库。

编译产物叫 机器人.exe。

光是这张表,就已经能说出这个程序长什么样:左边一个 超级列表框 当消息流,右边三个 编辑框 + 两个按钮当操作面板,界面分成 机器人控制区 和 其他区 两块,底下有一堆按成员记账的数值。

分栏这件事之所以有效,是因为易语言的命名规范强制了形状:事件一定是 _控件名_事件名,控件一定是 中文类别+数字,常量一定是 常量N 或全大写语义名。也就是说,命名本身就带着类型标签 —— 你不认识格式,但认识命名。


功能:三件

1. 签到

报到
签到
,报到成功!
,您已经报到过了
签到人总
2:签到(每日一签~)

功能: 下面能扫到的只有第 2 项 —— 2:签到(每日一签~)。这意味着帮助文本是个编号列表,而 1 和 3 的正文没有被扫出来(很可能就在同一条串里被我的截断切掉了,也可能当时只写了 2)。我不给它们编内容。

报到 / 签到 两个词同时存在,报到成功! / 您已经报到过了 是应答 —— 说明命令词是"报到",而功能名/帮助里叫"签到"。同一个东西两个名字,是我写代码时的习惯:功能列表里用正式名,实际命令用短词。

2. 钓鱼

钓鱼
收杆
请用 收杆 结束钓鱼。
鱼儿分
钓鱼人总

这三条凑起来是一个有开始、有结束指令的会话状态:

  • 发"钓鱼"进入钓鱼状态
  • 界面提示你 请用 收杆 结束钓鱼。
  • 结束时按结果给 鱼儿分

也就是说我的机器人在那段时间已经做了多轮交互而不是单条命令匹配 —— 它得记住"这个人现在正在钓鱼",否则 收杆 这句话无法处理。配合 记录 / 记录类型 两个变量名,这个"当前状态"大概就是按 记录类型 分类存起来的。

(这套状态存在哪、怎么判断超时,扫不出来 —— 控制流是这套方法的死区。)

3. 一套积分货币

钱数
钱总
钱分
句柄分
句柄QQ记录分
钱了!
钱了。
索引
刷新
删除成员 (j, , )

钱数 是 编辑框 的标签(界面上看得见的余额),钱总/钱分/鱼儿分 是分项账,句柄分/句柄QQ记录分 名字里的"句柄"指的是 QQ 号 —— 按成员建的两张表。

钱了! 和 钱了。 两条几乎一样的文案同时存在(一个感叹号一个句号),说明这是两个不同分支的提示,我当时没有把它们合并 —— 很典型。

删除成员 (j, , ) 这条我差点读错。第一眼看到括号,我以为是自己某个函数的签名被存了一份。回去对了一下偏移:

7996  帮助
8089  功能:
8164  2:签到(每日一签~)
8300  收杆
8686  删除成员 (j, , )      ← 就在这个块里
9576  记录

它夹在 帮助 / 功能: 那一段中间,和 2:签到(...) 是同一条编号列表的邻居。所以它不是函数签名,是给用户看的命令用法 —— 一条 删除成员 的管理员命令,括号里是参数位(其中一个占位是 j,另两个空着)。

判断依据完全不是内容,是位置。 同一句话在 帮助 块里就是说明书,在代码区里才是签名。这条又一次印证了那篇播放器文章说的"先看分布再看内容"。


那三件套:读取在哪 / 想读取的 / 要判断的

读取在哪
想读取的
要判断的

这三个不是界面控件,是三个通用参数名。它们凑出来的是我自己造的微型配置读取协议:

读取在哪  ← 去哪个文件/哪一段读
想读取的  ← 读哪个键
要判断的  ← 读回来的值要等于什么

这是**“关键词 → 行为"机器人最原始的形状**:配置里存一堆 (在哪, 键, 期望值) 三元组,消息进来先匹配,匹配上就执行。酷Q、各种群框架后来的插件系统干的是同一件事,只是把这三件套变成了正式的事件注册接口。

我能扫到这三件套的变量名、但扫不到它们的调用点 —— 所以"消息进来先比配置"这一步是我的推断,依据是这三个名字凑在一起只可能是这个用途。


有一件事我读不出来,而且必须说清楚

全文 82 条串里,没有任何一条和网络或 QQ 有关。

具体说:

  • 没有 客户1 / 服务器1 网络控件(同批归档里的聊天器、远程控制、端口映射都显式声明了这类控件,所以这不是扫描器漏了)
  • 没有 http、没有 URL、没有 QQ 协议相关的 API 名
  • 没有 dll 声明(机器人.e 里连一个 .dll 字符串都没有)
  • 没有酷Q 的任何痕迹(CoQ / koocq / 插件接口名,命中数全是 0)
  • 也没有 FindWindow / GetWindowText / EnumChildWindows 这类读屏会用到的 API 声明

它有的只是 多线程支持库(EThread)、一个 线程 变量、特殊功能支持库,以及 TA发送的信息 这个装别人消息的列表框。

所以我能确定的是:它不是靠网络协议工作的。至于是靠读 QQ 窗口(特殊功能支持库 有取窗口/找控件的能力)、靠键盘鼠标模拟、还是靠一个我没扫出来的外部组件,我没法定死。

机器人控制区 和 其他区 这两个分组框名暗示还有第二块功能面板,但里面具体有什么,只有那三个编辑框和标签的名字,没有说明。

这就是"用字节扫描读旧代码"的真实精度:一个 10 KB、82 条串的小程序,我能还原出它的功能清单、界面结构、数据结构命名、甚至一条命令用法,但仍然说不出它是怎么连上 QQ 的。 而后者才是这个程序最关键的部分。


为什么发

2016 年 6 月,我还没听说过酷Q(那套东西 2016 年已经有插件生态了)。所以这是一个从零造的轮子,而且造到了能用:签到、积分、钓鱼小游戏,三件都是那时候群机器人最标准的功能。

它现在没有任何实用价值 —— 换 QQ 版本大概第一天就失效了。发出来是为了那份"我当时不知道有现成的,于是我照着想象中的样子自己实现了一遍"的记录,以及上面那张四栏表:怎么在只有 82 条串的条件下把一个工程读成一个骨架。


仓库

https://cnb.cool/t1mmoc/tspace/eyuyan/lp-qq-bot

只有一个 .e。里面留过一个 句柄QQ记录分 这类以 QQ 号为键的变量名,但没有真实的号或群;标题类文案里的 QQ 号统一等长替换成了 XXXX。