大家好,我是库安文仔,今天我们来做一个微信消息控制操作的脚本,意思就是我通过微信给文件传输助手发送指令, 脚本就会根据我的指令执行相应的操作。这种脚本的难度可大可小,取决于你打算实现多少指令,以及指令要细化到何种程度。这期视频作为示范的话,我这个脚本的难度应该说是中规中矩,还是先做一个方案设计。 首先我们假设这个聊天窗口他已经被拖出来,作为一个独立的窗口,如果是写前台脚本的话,还要确保这个窗口是处于置顶状态。但是我这里写的是后台脚本, 主要有两个原因,第一个是不希望这个聊天窗口他遮挡到我要操作的地方。第二个就是我的指令可能会包括一些鼠标移动的操作,如果是 前台脚本的话,那必然还需要移动鼠标去操作这个聊天窗口,这可能会影响到一些指令的执行。那么回到我们方案这里,不管是前台脚本还是后台脚本,第一步毫无疑问都是先定位窗口,然后就是一个获取、分析、执行反馈的四步循环。 首先是获取指令,这一步我想过有很多种方法,第一种就是距离这个聊天窗口的底部一定距离去获取,但是聊天窗口里面这个输入框的高度是可以改变的,就会影响到这个距离。 第二种方法是用找图去找这个绿色的箭头,这种方法的弊端就是如果他是图片或者文件消息的话,他是没有这个绿色箭头的。我还想到过用找头像的方法去解决,但是这种方法太 low 了,限制条件 太多。最后我想到了用区域色块去判断的方法。首先我们通过按键抓抓,确定这个聊天窗口的背景颜色是单一的,然后回想起找不同颜色的游戏脚本,那一期视频,我提到了色块这个概念, 只要是同一种颜色形成的一块整体,他就是一个色块。比如我框选的这一块区域,这里面所有的像素都是同一种颜色,他就是一个色块。那如果我框选的是这一块区域,这两块灰色之间隔着其他的颜色没有连续起来,他俩就不是同一个色块。 之前我们是用色块的数量来解决问题,这一次我们可以获取色块的具体坐标,只要拿到最后一个色块的坐标,再往上一点点就是这条最新消息的位置了。定位到消息位置之后, 还要确定获取指令的方式。针对这种文本消息,第一时间想到的是文字识别,但是用在这里的话,感觉就是杀鸡用牛刀,小题大做。其实微信他有一点设计的很好, 只要我在这条消息这里,鼠标右键,他就会自动全选这一段消息文本,这时候再点一下复制这个文本就会到剪切版里面了。按键精灵是有能力获取剪切版里面的内容的。 通过这种手段,我们就可以很轻松的拿到指令。拿到指令之后就要对他做分析,因为这个指令是比较羽翼化的,不可能和脚本的代码完全一致。比如说就只有左键单击四个字, 那脚本要怎么理解这个指令呢?我们就要自己设计一套规范,我这里打算把指令分为两部分,第一部分是动作, 比如说鼠标移动,第二部分就是参数,就是你要移动到哪个坐标,不同的动作对应不同的参数,当然也可能没有参数。动作和参数之间用一个管道符进行分割,多个参数之间就用逗号进行分割。分析完成之后就要执行指令, 根据不同的动作调用不同的子程序,并且把参数带过去。执行完之后需要一个反馈,就是脚本会给我回复一个 over。 这个反馈主要起两个作用,第一个是让我知道脚本有在运作,而且已经执行完了最新的指令,这时候我就可以给他发送下一个指定了。 第二个作用是因为这里是循环获取指令的,如果我没有给他发送后续的指令,这个脚本会一直获取到上一个指令,就会出现重复执行同一个指令的情况。 反馈一个 over 之后,他就可以把上一条消息顶上去,这样他下次获取到的最新指令就是 over, 这个指令他不会触发任何动作,也不需要任何反馈,那么接下来就开始写代码。 首先是定位窗口的子程序,这部分已经滚瓜烂熟了,不需要再解释了吧?获取到的窗口句柄、窗口左上角的坐标,右下角的坐标以及窗口的宽高,我们都定义为全局变量,写在这个子程序的外面。这个子程序我们在一开始就调用它。 根据方案定位窗口之后是一个永久循环,永久循环分为四步,第一步是获取消息内容,调用一个叫获取消息内容的指程序,后台插件有一个 get block ranch 的命令,可以获取每个色块的坐标范围。要注意这个名字的命令有两个,第一个 收到的就是属于后台插件的命令,如果你写前台脚本的话,再搜一次,第二个收到的才是属于颜色插件的命令。这两个命令的原理是一样的,我要写后台脚本,这里就用后台的命令。 首先确定获取色块的区域,这个区域他只需要一个像素框,而且必须要覆盖到最短的文本消息,所以是接近头像的这个位置。 消息框跟窗口右边框的距离是固定的,大概是九十个像素,所以相对坐标就是这个窗口宽度减九十,区域高度直接覆盖整个窗口高度就行了, 相对坐标就是从零到窗口高度,相似度直接给一,因为下面这一块的颜色跟这个背景色还是比较接近的。把这个结果打印出来调试一下, 这个调试结果很长,但是它的格式不复杂,其实就是输出每个区域的横纵坐标以及宽高,所以是四个数字为一组,然后用这个管道符进行分割,重点先看纵坐标, 第一个中坐标是二七八,第二个中坐标是幺九五。发现第一个中坐标比第二个中坐标要大,说明这个输出结果是从下往上的。第一组数字代表的就是最下面的这一块区域, 那就正合我意了,直接用管道符进行拆分,取第一项,然后再用逗号拆分,第一个就是横坐标,第二个就是重坐标, 为了能够选择到这条消息,还要再往上偏移一点,也就是这个重坐标再减五个像素,然后再用后台插件,你的鼠标右键单击, 这个时候就会出来一个菜单,注意这个菜单他是一个子窗口,他的锯柄和副窗口不一样,而且一点外面这个窗口就会消失,想抓这种窗口的锯柄要用热键才行, 按键抓抓,这里他有一个热键是 f 八,按下 f 八启动,他就会获取鼠标所指向窗口的信息,这时候再打开菜单,把鼠标放上去,再按 f 八结束获取。 可以看到他的窗口内名是 cmewwnd, 因为这个是新打开的窗口,如果马上获取聚饼的话可能会拿不到,所以先延时三百毫秒,确保这个窗口创建完成, 然后再通过类名去获取窗口句柄复制给一个新的变量 h w n d menu, 然后再用后台插件的鼠标左键单击命令,点击复制按钮,这样就把指令复制进减 剪切版了。然后在系统插件里面有一个 get c l b 命令,可以得到剪切版的内容,我们获取之后把它打印出来,然后用管道符对它进行拆分。根据事先定义好的格式,第一部分获取到的是动作,第二部分获取到的是参数,但是参数不一定会有, 如果没有参数的话,他也就没有这个管道符。没有管道符的时候,拆分出来的数组最大可用下标是零,如果这时候要获取下标一的值,就会造成下标越界, 所以还需要判断一下这个数组的最大可用下标。如果最大可用下标是一,那就可以去获取这个参数,否则就把它设为空字符串,接下来判断动作,比如说双击,为了方便我自己的双击动作,也可以附带坐标参数,这样就不用专门执行移动命令。 具体执行就是先移动到参数指定的坐标,然后再执行左键双击,然后再来一个文字识别,我这里把之前做的文字识别的脚本代码复制过来。 具体文字识别的实现我这里就不再讲了,把这个文件引入放到顶部。 文字识别这里分为两步,第一步是获取 ss token, 第二步就是区域截图, o c r o c r 的时候需要把参数传过去,同样这里要接收相应的参数,参数一共有五个,前面四个就是要识别的区域, 第五个参数就是要识别的文字,我这里不需要对单个文字进行定位,文字识别力度 就改回大。找到对应的文字之后,我这里就不操作鼠标了,先把文字所在的坐标反馈给我,调用一个指程序专门回复内容,把横中坐标拼接成字符串传过去 回复内容。首先要后台鼠标左键单击激活这个输入框,然后用后台的发送文本消息命令输入消息,最后再用后台按键按回车键进行发送。 最后再来一个截屏,这个非常重要,如果不能看到桌面的话,解释再多的指令也是意义不大的。 截屏操作就是先按一下键盘上面的截屏键,然后用同样的方法激活输入框粘贴内容,这里比较麻烦,按键精灵自带的后台插件没有办法实现 ctrl 加 v 的组合键,如果用三六一度窗口插件的话, 可以实现后台组合键,但是在 ctrl 加 v 组合的时候,除了粘贴内容,那个 v 他也会作为文字被输入进去,所以我决定还是在输入框这里后台右键换出菜单,然后再用同样的方法获取这个菜单的窗口据柄,然后再用后台左键点击这个粘贴, 最后回车键发送。所以这一段代码跟刚才是一样的,那么作为视力,我就只写这三个指令,指令执行完后等待半秒钟,然后回复一个 over, 这里可以服用刚才回复内容的指程序,注意要判断这个指令是不是本身就是 over, 如果是的话就不要再刷屏了, 最后等待两秒钟再进行下一次获取消息内容,好调试一下。为了让你们看到效果,我这里就先不遮挡这个聊天窗 口。执行脚本好,他第一次获取到的指令是一个制服一,这个指令是匹配不上任何动作的,所以他直接什么都不做,给我回复了一个 over, 这时候我就知道这个脚本他有在正常运作了。 那假如说我想让他打开回收站的话,但是我不知道回收站在桌面的哪个地方,所以我就先执行一个文字识别零零三百,三百,大概是左上角的那个位置,然后识别回收站三个字。 好,这时候他就给我回复了一个坐标,一九幺六零,然后回复了一个 over, 那这时候就要双击去打开它了,双击幺九幺六零 好,回收站正常打开没有问题,但是实际情况 我是看不到这个电脑屏幕的,所以我不知道他执行情况怎么样了,所以我还要再执行一个截屏。 好,这时候他给我回复了一个图片,再回复了一个 over, 然后我们看看这个图片是不是正确的。 好,这个图片跟我们当前桌面的情况一致,没有问题。好,脚本演示就到这里, 其实这个脚本还有很大的提升空间,比如说我不知道现在鼠标在哪了,我是不是可以再单独做一个区域截图的指令,这样就可以直观感受到鼠标所在的位置, 甚至还可以做一个找图指令。但是这个比较麻烦,因为微信图片直接保存的话,只能保存成 jpg 格式,所以只能先打开图片,然后用区域截图,把它存成 b p 格式的图片,再去找图。总之,这种脚本的自由度很高,没有什么条条框框的限制,只要你设计的好,几乎什么都能做。 ok, 那么这期视频就先到这里,谢谢大家。