All Projects → CyrilFeng → Foolqq

CyrilFeng / Foolqq

Licence: bsd-2-clause
使用图像识别操作QQ收发消息,如果你读完readme觉得idea不错,请star

Programming Languages

java
68154 projects - #9 most used programming language

Labels

Projects that are alternatives of or similar to Foolqq

Miraiandroid
QQ机器人 /(实验性)在Android上运行Mirai-console,支持插件
Stars: ✭ 188 (-25.4%)
Mutual labels:  qqbot, qq
Ichunqiu qqbot
i春秋社区机器人自2018年02月04日开始服务于i春秋社区,每日文章推送、文章查询、魔法币查询、作者信息查询、作家团奖金余额查询、奖金排行榜、i春秋课程查询等一列功能。据不完全统计,使用人数已经超过3.5万,使用次数达到20万,最大覆盖700+个群。
Stars: ✭ 79 (-68.65%)
Mutual labels:  qqbot, qq
Miraigo Template
A template for MiraiGo
Stars: ✭ 47 (-81.35%)
Mutual labels:  qqbot, qq
Teamhelper
A robot software that helps a team leader automatically send notifications to QQ group and Emails for weekly meeting.
Stars: ✭ 201 (-20.24%)
Mutual labels:  qqbot, qq
Coolq Http Api
为 酷Q 提供通过 HTTP 或 WebSocket 接收事件和调用 API 的能力
Stars: ✭ 1,787 (+609.13%)
Mutual labels:  qqbot, qq
Gomirai
适配于Mirai HTTP API的Golang SDK
Stars: ✭ 39 (-84.52%)
Mutual labels:  qqbot, qq
Mojo Webqq
【重要通知:WebQQ将在2019年1月1日停止服务,此项目目前已停止维护,感谢大家四年来的一路陪伴】使用Perl语言(不会没关系)编写的smartqq/webqq客户端框架(非GUI),可通过插件提供基于HTTP协议的api接口供其他语言或系统调用
Stars: ✭ 1,755 (+596.43%)
Mutual labels:  qqbot, qq
Qqbot
QQBot: A conversation robot base on Tencent's SmartQQ
Stars: ✭ 3,643 (+1345.63%)
Mutual labels:  qqbot, qq
Elf rss
QQ机器人 RSS订阅 插件,订阅源建议选择 RSSHub
Stars: ✭ 133 (-47.22%)
Mutual labels:  qqbot, qq
Qqlight Websocket
QQLight机器人WebSocket-RPC插件,让你能够使用任何语言编写QQ机器人程序
Stars: ✭ 118 (-53.17%)
Mutual labels:  qqbot, qq
Python Mirai
以 OICQ(QQ) 协议驱动的高性能机器人开发框架 Mirai 的 Python 接口, 通过其提供的 `HTTP API` 与无头客户端(Mirai)交互.
Stars: ✭ 155 (-38.49%)
Mutual labels:  qqbot, qq
Spring Cq
新框架 https://github.com/ProtobufBot/ProtobufBot 。这是一个spring boot starter。基于SpringBoot的QQ机器人框架,demo分支是例子,jar分支是框架。
Stars: ✭ 161 (-36.11%)
Mutual labels:  qqbot, qq
Mirai Console
mirai 的高效率 QQ 机器人控制台
Stars: ✭ 764 (+203.17%)
Mutual labels:  qqbot, qq
Pcqq Protocol
PCQQ协议 机器人
Stars: ✭ 237 (-5.95%)
Mutual labels:  qqbot, qq
Miraigo
qq协议的golang实现, 移植于mirai
Stars: ✭ 404 (+60.32%)
Mutual labels:  qqbot, qq
Mirai Plugins
🌠一个用于收录Mirai插件的仓库|mirai|plugins|mirai plugins|mirai-plugins
Stars: ✭ 55 (-78.17%)
Mutual labels:  qqbot, qq
Go-Mirai-Client
基于MiraiGo的客户端,使用反向 websocket 收发私聊、群聊消息,消息格式类似onebot。支持多账号,很稳定
Stars: ✭ 90 (-64.29%)
Mutual labels:  qq, qqbot
Application
一个设计精巧, 协议实现完备的, 基于 mirai-api-http 的即时聊天软件自动化框架.
Stars: ✭ 307 (+21.83%)
Mutual labels:  qqbot, qq
Qqbot
使用QQ PC协议的机器人
Stars: ✭ 99 (-60.71%)
Mutual labels:  qqbot, qq
Picqbotx
基于 CQHTTP 插件的 Java QQ 机器人类库
Stars: ✭ 218 (-13.49%)
Mutual labels:  qqbot, qq

基于图像处理操作QQ的工具foolqq

目前读写QQ的机器人都是基于爬虫分析smartqq报文来实现的,然而smartqq腾讯已经下线,foolqq应运而生!

image

原理概述

定时截取屏幕,并识别图片关键点像素,确定群会话窗口的位置,并通过剪贴板实现JVM消息和屏幕消息的交换。通过Robot类操作鼠标和键盘。

准备工作

1 运行QQcls.exe,这是一个一键清屏(F10键)的程序,简化了清屏的步骤。

2 打开你要监控的群或讨论组,截取群或讨论组的头像,截取的范围不要超出头像的范围,如下红色框中范围差不多即可。将截取后的图像另存为png格式,截取后的图像不能有压缩(将图片放大,棱角分明不模糊),并为图片起个英文名字(如下是gj.png),这个名字很重要,对foolqq而言,相当于当前群的id。如果你有多个群,重复此步骤。

image

3 经过步骤2,foolqq可以找到qq对话框,接下来需要找到输入和输出的位置,如下图所示,工具栏之上的部分是输出,下方是我们的输入,由于qq会话窗口可以自定义大小且工具栏也可以上下拖动,因此对不同用户而言,窗口的位置信息是不一定的,因此,我们需要一张关键图片来描述输入和输出的位置,且这张图片的名字必须是point.png

image

关于point.png,我们选择红色框中的A字体标签,截取其中间的横线部分,如下图红色区域所示,务必保证截图中不要包含背景的任何一个像素,这么做的原因是,QQ的背景面板颜色会根据窗口大小、当前群的头像进行渐变色计算,为了提供公共可用的识别点,我们使用下图红色区域的部分。

image

4 最后请不要使用QQ的合并窗口功能,如果你有多个群,将他们平铺在桌面上,这样foolqq可以监控多个群面板、并保证使用enter键可以发送消息而不是enter+ctrl,关闭多彩气泡功能。上述所有图片路径需要放在工程的根目录下。

image

用法

public static void main(String[] args) throws AWTException, IOException, NativeHookException {

//创建BaseQQWindowContext的实例、传入之前做好的point.png文件

BaseQQWindowContext context=new BaseQQWindowContext(new File("point.png")) {
	@Override
	public void onMessage(String name, QQMsg msg) {
	
        //name是图片名称(不包括扩展名),对前面提到的gj.png图片而言这里name就是gj,因此可以根据name判断到底是哪个群的消息
	
	System.out.println(msg);   //msg包括内容、发送人QQ、昵称、时间
	}
};
}
  

全局锁——BaseQQWindowContext

你可能注意到了,我们操作的鼠标和键盘是特殊共享资源,如果需要在另一个线程中使用robot类进行自定义操作,可能和foolqq的内部方法冲突,而我们上一步创建的context对象可以作为锁,避免冲突。

//如果你需要使用robot类,你的代码必须是这样

synchronized(context){
robot...

}

interval与checkInterval

context提供setInterval来设置一系列操作的间隔时间,如双击后等待interval按键,这是一个细粒度的时间控制,目的是给显卡一个缓冲,我们知道电脑操作过快可能会导致无法响应,默认是200ms,而checkInterval是一个完整的周期时间,如果你有3个群,应保证checkInterval大于读取并处理完这3个群的消息所耗的总时间,默认是5秒。

writeQQMsg

context的writeQQMsg可以向指定群写入消息,并且是线程安全的,使用这个方法的缘由一定是定时执行任务,比如定时向群里推送消息,而这个功能对于以往的smartqq而言是非常奢侈的,因为smartqq需要不定时的重启。writeQQMsg有两个String类型参数,前者是图片的名称,上文中是gj,后者则是消息内容。

context.writeQQMsg("gj","大家好啊"); //发送文本
context.writeQQMsg("gj",new File("d:/img/logo.jpg"));  //发图片

退出

robot类控制着你的鼠标和键盘,如果想要退出程序,请使用ESC键,这个功能能用java实现,得益于jnativehook

场景

foolqq的应用场景包括工单自动处理、群里常见问题答复、定时告警推送、日报填写等丰富应用,当然这其中涉及NLP的部分不在本文讨论的范畴。

设计不足

foolqq面向桌面的会话窗口,对一台电脑而言,根据分辨率不同,桌面上同时打开的群个数有限,此外如果你有多个业务qq号操作不同的业务,则需要虚拟不同的桌面。

常见问题

问题大多数是由于截取的图片不够清晰,导致无法识别,你可以使用ImgChkHelper类的validImage方法来判断图片是否有效(若有效则返回true)

ImgChkHelper.validImage(printscreen截屏的路径,你截取的局部图片路径);

不要使用QQ截图,建议使用Photoshop,如果不是那么专业,推荐使用光影魔术手,并另存为质量为100%的图像。

演进计划

v2.0 对window8.1以及以上版本将基于uiautomcation重新实现

写在最后

相比于这个组件本身,我更关注于它背后的方法论,利用图像处理可以帮我们做很多事情,foolqq的代码非常精简,强烈建议你能够通读一遍,也欢迎和我交流,我的邮箱[email protected]

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].