github: https://github.com/zouhuidong/HDQQRobot
最近QQ打击第三方QQ机器人,因为QQ提出了官方的机器人接口。
但是使用它的接口需要申请,很麻烦。
于是我想,可以用粗暴的方式实现第三方(非官方)机器人,虽然功能没有那么全面,但是还是勉强够用,还不会被腾讯限制。
就是:
HuiDong QQ Robot
原理是用win api模拟鼠标移动到QQ窗口,不停地模拟键盘按下 Ctrl + A , Ctrl + C 把消息内容放到剪贴板,然后再从剪贴板取消息内容
取得消息内容后进行分析,以获取消息的详细信息
得到消息之后可以做回复,回复的原理是把消息内容放进剪贴板,再模拟鼠标点击消息输入框,再然后模拟按下Ctrl + V 和 Enter 来发送消息。
所以,这个机器人的运行需要占用鼠标、键盘以及剪贴板,可以开个虚拟机挂在后台。
以下项目都在 VS2019 编译通过,win7 和 win10 + TIM(QQ的办公版)测试通过。
Ver 0.5
仅库文件:
HDQQRobot_ver0.5.zip
包含例子:
QQRot_WoofKillGame.zip
这个例子是一个单机狼人杀游戏移植而成的,原程序:http://www.huidong.xyz/?mode=2&id=147
该程序使用了EGE图形库,此库官网:http://xege.org
更新内容:
可以通过QQGetVersionString或QQGetVersionFloat函数得到HDQQRobot版本。
更新QQStartMenu函数,现在可以显示HDQQRobot版本。
删除QQLexMessage函数,并只需要调用QQGetMessage函数即可。且QQGetMessage函数不再需要传参了。
不需要用户自己创建QQMsg类型的链表头结点以及用以存储QQ消息的string类型变量。
移除了HDQQMsg.cpp。
删除了QQMsgAddNode函数。
QQMsgGetLast更名为QQGetLastMsg且不需要再传参了。
新增QQGetMsgHead函数,用以得到QQMsg链表的头结点指针。
移除QQGotoMsgWnd函数和QQGotoSendMsgWnd函数。
可以用QQSetMyName设置自己的名称,用QQGetMyName得到自己的名称(前提是设置了)。
可以使用QQSetIsGetMyMsg函数设置是否接收自己的消息,如果为false,则QQGetMessage函数若得到自己的消息将返回false,但仍将消息存入消息链表。可以使用QQGetIsGetMyMsg函数得到当前是否获取我的消息
更新QQMessageBox函数,可以将MessageBox函数方便地替换为QQMessageBox函数。
由于群昵称中有时带有如“【潜水】”的前缀,为了得到更准确的用户昵称,从此版本开始将过滤掉名称前缀。
默认按键延时改为50ms
Ver 0.4
仅库文件:
HDQQRobot_Ver0.4.zip
包含例子:
HDQQRobot_Ver0.4_with_example.zip
此例子用到了EasyX图形库以绘制图像,此库官网:www.easyx.cn
这个例子是一个多人游戏的机器人,可以输入 ".help" 来查看命令菜单
Ver 0.4 更新:
更新发送图片(图文混合消息)的功能
修复空白消息读取错误的bug
默认按键延时改为30ms
要发送图片消息,可以使用QQSendMsg函数并传入一个HBITMAP参数
要发送图文混合消息,可以使用QQAddMsg函数添加图片或文字消息,待消息添加完毕后可以使用QQFlushMsg函数输出待发送的消息
Ver 0.3
HDQQRobot_Ver0.3_with_example.zip
Ver 0.3 更新了许多功能:
剪贴板防内存非法访问保护
QQ窗口位置,大小锁定,且会顶置窗口,防止鼠标乱点
以QQMsg结构链表来存储QQ消息,这样就可以存储之前的消息了
支持读取多行消息、用户名、消息发送时间
消息响应函数需要自己调用,无需使用HDQQSetResponseFunc函数设置了
所有函数进行更名,删除了HD前缀
QQ消息分析原理
QQ的消息举例
huidong 8:20:33
ckj,出来玩吗?
ckj 8:21:12
不了
每次得到的消息末尾会多出两个换行,所以需要去除末尾的换行。
换行是\r\n式,所以删除所有\r,仅保留\n。
然后开始从后往前读取消息内容,一直到读完一条消息,把它存入链表,这次的分析就算结束。
当我们读取到换行时,得到接下来的一串以空格或换行结束的字符串(注意是从后往前读取),
然后对此字符串进行格式判断,判断它是不是时间格式(xx:xx:xx),如果是的话,就继续往后读,
以此类推得到字符串,判断它是不是日期格式(xxxx/xx/xx)(日期格式只有在消息不是今日发送的情况下才会出现),
如果也是,那就保存为日期,如果不是,那就取今天的日期为消息发送日期,继续读,剩下的最后一串
以换行结尾的字符串就是用户名了,如果用户名不为空,那么时间、日期、用户名、消息内容,我们就都读取到了。
这样的做法可能会无法识别他人造假别的用户发送信息,但是也没有再更好的办法了。
根据我的研究,xx:xx:xx中,小时可能只有一个数字,而分钟、秒是肯定有两个数字;
xxxx/xx/xx中,月数和号都有可能只有一个数字,据此,可以进行格式判断。
Ver 0.1 - 0.2
Ver 0.1 HDQQRobot.zip
这个项目是一个使用HDQQRobot的走迷宫机器人。
Ver 0.2 HDQQRobot_Ver0.2.zip
此项目仅包含库文件
Ver 0.2 更新:
新增函数 HDQQIsPause(); 可以自动检测F8的按下来暂停机器人,且判断F7的按下来使机器人继续工作
修复部分机器人在部分QQ版本上运行无效的bug
适用于Ver 0.2 的例子程序:
huidong编写,功能:走迷宫,判断脏话,以及几个小功能
source.zip
ckj编写( 有改动 ),功能:判断脏话,猜数字
source_ckj.zip
使用教程(请仔细看,不然不会使用):
首先:将鼠标移动到QQ消息窗口上,按下F11,注意:按下F11的时候不需要点击cmd窗口,程序会全局捕获按键,下面也一样,按键都是全局捕获的。
然后将鼠标移动到QQ输入框上,按下F12。
因为这个机器人的实现需要模拟鼠标键盘,所以按F11的时候推荐将鼠标放到消息框的右下角,这样鼠标不会点到消息
按F12的时候,就把鼠标放在输入框内就好,没什么要特别注意的。
如下图:
然后按下F10开启机器人
按下F8暂停机器人,然后按下F7使机器人继续工作(Ver 0.2新增)
按下F9来停止机器人(可能需要长按一下)
开启机器人之后,你无法控制你的鼠标,如果需要停止,请务必按F9
保证启动机器人时,没有别的程序有快捷键冲突。
有的时候,开启了机器人,对方说了指令,可机器人没反应怎么办?
下面的教程很重要:
两种可能:
1. 鼠标位置不太对,【稍微】 移动鼠标,然后可能就可以
2. 模拟 Ctrl+C 时复制聊天内容失败,此时请先按F9关闭机器人,然后在一个文本框按Ctrl+V检测剪贴板内是否有信息,
如果没有信息,说明Ctrl+C时获取信息失败,措施如下:
先看下机器人启动的时候输入法关了没,如果没关,把它关掉。
然后手动在QQ消息框里Ctrl + A, Ctrl + C,再到一个文本框里粘贴出来看看有没有信息,如果有信息,那可以了,重启机器人再继续就行。
如果手动复制出来什么也没有,说明你可能打开了什么程序,检查一下,把它关掉再试。
还不行的话,重启电脑试试。