基于SmartQQ协议的QQ聊天机器人-3

今天的主题是:针对【消息回复模块】的代码分析及问题记录。

1. 核心文件分析:

  1. 核心是:QQService.java、SmartQQClient.java、Application.java。需要搞清楚的问题:
  1. 为何用户发送消息,机器人就能监听到了呢?
  2. 监听在哪几个函数里面实现的呢?
  3. 我猜是建立一个Client新对象,默认传入了处理消息的回调函数,然后按照这个猜想我去跟踪代码。但有个问题是:我还是没搞清楚这个项目的入口在哪里?【后来发现,jsp文件不需要像python那样有app.py,那个webinfo.xml其实就等价于是入口文件,由它再去加载其他模块,比如:含有main方法的主类】

2. 作者源码中存在的bug:

2.1 编码以及try-catch存在的问题:

作者代码默认在myeclipse15中展示出来的是乱码,
解决方案是:encode和decode,以及加try-catch包住编码和解码的代码段(不包住就会报“decode 和encode相关的错误”-->这是JDK8的强迫症,我们遵守它的规矩就好了)

2.2 机器人出现“死循环-->机器人自问自答,无穷无尽”:

问题的根源是QQService.java里面的onQQGroupMessage函数

  • bug根源:
    机器人回复用户的提问生成的答案会被监听程序当做一个新的提问,因为这个“提问”里面一般都含机器人“感兴趣”的key word(后面我会解释这个“感兴趣”的内涵),所以又被机器人回复;最后等价于【机器人自问自答】。。。死循环!!!
  • 解决方案:

第一次尝试:
用最蠢的办法,加入?作为提问的标志(或者还是把@机器人作为提问的标志),但是这种解决方案显然也有问题:如果回答的答案中也有号或者@符号呢

第二次尝试:
我想到一个好办法:就是每次检查提问时,检测下这个提问来自哪个QQ号(但是这个获取消息的发送者QQ号的函数以及机器人的【检测提问是否合法及对应如何回复】的函数我还不懂,我还要再看看)。
但解决思路已经很明确了:只有【非机器人的QQ】的消息才被当做提问,机器人自己发的消息默认被屏蔽

2.3 大整形溢出的bug:

  • 当我尝试用getQQById(msg)来获取每条消息的UserID(即用户QQ号),然后与我的【作为机器人的小号QQ】(注意,这个QQ号要写在xiaov.properties文件中的qq.bot.id中)作比较,进而分析本条消息是否来自机器人。

  • 但是,遭遇了一个Long溢出的bug:因为我的小号作为机器人,QQ号是2872995315,所以一直报错整形溢出,后来我把它直接写成string,后面把user_id也改成string,让两者以string作比对。

2.4 SmartQQ协议对单条消息的字数限制:

导致太长的答案显示不出来,我考虑两种方案:第一,看懂SmartQQ的api,把内容分拆成多条,然后逐个发送到群;第二,后面再基于这个小项目,搭建个微型的web项目(类似于留言板),把答案放到一个页面,每次针对提问返回这个答案页面的超链接到群里,用户点击链接查看这个答案。

2.5 速度的问题:

不知道是超大hash引入程序以及其他代码加入的原因,现在机器人反应比以前慢多了,后面要用profiler来测试是哪一环节拖慢速度了。

posted @ 2018-05-15 11:40  hzhang_NJU  阅读(1220)  评论(0编辑  收藏  举报