基於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作比對。{即暫時解決bug}

2.4 SmartQQ協議對單條消息的字數限制:

導致太長的答案顯示不出來,我考慮兩種方案:第一,看懂SmartQQ的api,把內容分拆成多條,然后逐個發送到群;第二,后面再基於這個小項目,搭建個微型的web項目(類似於留言板),把答案放到一個頁面,每次針對提問返回這個答案頁面的超鏈接到群里,用戶點擊鏈接查看這個答案。

2.5 速度的問題:

不知道是超大hash引入程序以及其他代碼加入的原因,現在機器人反應比以前慢多了,后面要用profiler來測試是哪一環節拖慢速度了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM