QQ机器人{应用设计篇}

来源:互联网 发布:java接口上传文件 编辑:程序博客网 时间:2024/05/01 10:09

新年好啊~今天正月初二,昨天大年初一 ,就没写博客,怕太积极了,各位受不了,哈哈~

今天就来聊聊整个QQ机器人的概要设计吧,按照上一篇QQ机器人{登录流程篇}来说一下应用的设计。细节就不细聊了,往后可以再起新篇章,针对某个技术点进行总结。

第一次看到QQ机器人是公司一个项目小组用来做系统监控的,就是在一个群里,QQ机器人不断把一些告警或异常信息发出来,这样项目人员就能随时了解系统的状况。当时我觉得挺好玩挺智能的,很好奇他们怎么做到的,后来一忙也就没再继续关注这东西。过了一阵,一个群里又有人在调试QQ机器人,而且是测试组,用来做自动化运维的。比如要去数据库捞个资源或者做下回归测试,只要在群里发一条命令,QQ机器人就会自己去做了。这时,我按捺不住了,去搜索了下QQ机器人,发现腾讯并没有提供接口啊,官方也没提供任何能力,到是看到有网友讨论过这东西。后来私聊了下项目组的人员,发现这确实是个江湖派的东西,一般都是利用webQQ接口来开发的。

最后决定自己去扒webQQ HTTP接口协议(为什么不去问同事要?我喜欢一手资料,还有就是作为一枚程序员的自尊心,相信自己有这能力~),看到网上经常有人扒吉他谱,好牛,现在我也总算能扒点东西了,哈哈~关于协议的内容不在这篇文章说了,期待协议篇吧(或者你也可以自己去扒)!

该怎么设计这个机器人呢?当时也想了好久,一开始考虑也就像其他项目组一样,申请个新QQ号,作为机器人。但后来想想,这样不是很好玩,得加好友才行,麻烦,要是能让自己的QQ变成机器人,也就是把自己的QQ托管给机器人,这样或许会好玩些吧,技术层面也多些挑战。

所以最后决定这么设计:

给用户提供访问链接,用户进入页面后,扫描二维码,确认登录,到此用户QQ机器人托管完成。如果用户不玩了,想退出,那么再次访问刚刚的页面,点击退出按钮即可。用户也可以设置回复选项,比如是否允许机器人自动回复、设置允许自动回复的好友等(具体流程可以见QQ机器人,功能介绍篇)。

上面只谈了流程,程序怎么设计呢?每当有一个用户登录,就需要维护这个用户的消息收发,设置选项等,多线程应用不可避免了。当用户访问登录页面后,服务端去QQ服务请求一个二维码,返回给用户,同时异步启动一个线程去轮询检测这个二维码的状态,如果用户授权登录了,那么这个二维码状态将会返回登录成功的标识,然后线程继续一系列QQ服务请求,期间会异步记录用户登录信息,初始化回复标识等,最后再起一个独立线程,进行消息的收发轮询。

如果以上的流程每一步都成功了,那么用户的QQ机器人托管就成功了。当用户再次访问该链接,将会出现退出按钮和回复设置选项。用户的设置操作相关数据都会记录在数据库中,下次该QQ号登录仍然有效。如果登录过程中的某一步发生了异常,那么登录将会失败,用户再次访问该链接仍会显示二维码而不是设置页面。

登录过程中的一系列数据以及再次访问该链接,如何判断是否登录成功或失败这些标识,都保存在一个对象(可以称之为”过程数据“)中,这个对象同时缓存在map中,key以QQ号为键记录,同时也记录在session中,对应登录用户。用户访问链接时首先会去session查找该用户的过程数据对象,如果存在则可以判断出该用户的登录状态;如果不存在,要么就是未登录,按照登录流程登录即可,要么就是之前已登录,session失效或者异地登录。此时用户再次按照登录流程登录,获取到用户QQ号后去map缓存查找该用户的过程数据,如果存在,则直接用于更新当前session,登录结束;如果不存在,则启动消息轮询线程,收发消息,同时把过程数据存入缓存map(缓存map的作用就是防止用户session失效后重复登陆,避免启动多个消息轮询线程)。

上面的逻辑文字表述可能不是很清晰,而且很多判断依据未明确细说,最好结合QQ机器人{登录流程篇}的流程图来看。一句话简单说下就是一个用户对应一个线程,该线程用于该用户的消息收发,至于回复的内容可以是第三方提供,这里用的是图灵机器人。

每一个消息收发轮询线程对象的引用也会存到map缓存,key值为QQ号,所以用户想退出,服务端直接结束该线程即可,当然同时会清除相应过程数据对象。

最后说下相应技术应用吧:

web应用,服务端语言是Java,http请求用的是Apache HttpComponents httpClient,框架Spring mvc,Spring,myBatis,数据库mysql;前端Bootstrap,JQuery(我自封全栈,哈哈)。

好了,上午相亲,下午写博客,厉害吧~

0 0
原创粉丝点击