生活随笔
收集整理的這篇文章主要介紹了
基于SmartQQ协议的QQ聊天机器人-4
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
本節(jié)的主題是:結(jié)合上節(jié)的分析,具體分析函數(shù)的實(shí)現(xiàn)
1. 回復(fù)消息模塊:
集中在org.b3log.xiaov.service包。主控文件是QQService.java,其他只是回復(fù)算法的api和一些支持工具utils,不用管。目前我在研究怎么改寫它——支持“基于文本的一問一答”
配置文件有兩個(gè)目前用得上:
src/main/resources下面的xiaov.properties(針對機(jī)器人功能做的一些配置);
log4j.properties(定制整個(gè)項(xiàng)目中的Logger模塊在各個(gè)文件中的級別,用于調(diào)試和寫日志)
xiaov.properties中設(shè)置了bot.follow.keywords和bot.follow.keywordAnswer,就是【捕獲關(guān)鍵字】+【返回對應(yīng)答案魔板】,但是它只是個(gè)demo,我要讓他支持海量文本,并結(jié)構(gòu)化輸入和結(jié)構(gòu)化輸出。更多參數(shù)的解釋見我的代碼注釋。
2. 下面針對上述3點(diǎn)進(jìn)行操作:
發(fā)送消息與回復(fù)消息的調(diào)用關(guān)系:{結(jié)合viso繪制調(diào)用流程圖}見代碼的修改我修改了兩個(gè)函數(shù):
- answer里面回復(fù)的邏輯+解決編碼問題+try-catch;
- QQService.java里面的onQQGroupMessage對問題的驗(yàn)證邏輯
/*
// answer里面回復(fù)的邏輯+解決編碼問題+try-catch;
// xiaov_1_0\src\main\java\org\b3log\xiaov\service\QQService.java* 這是我對xiaov-1.0的注釋1.0* 這個(gè)函數(shù)非常重要,定義了提問和回答這兩個(gè)功能的數(shù)據(jù)結(jié)構(gòu)及數(shù)據(jù)來源* 我會抽時(shí)間把這個(gè)函數(shù)講清楚 TODO* */private String answer(final String content, final String userName) throws SQLException {if (keywords.size() == 0) // 加載一次即可{// 獲取keys,只調(diào)用一次keywords = AnswersFromSQLite.getAllKeys();}// LOGGER.debug(keywords.get(0));// 測試下contentString keyword = "";for (final String kw : keywords) {if (StringUtils.containsIgnoreCase(content, kw)) {keyword = kw;break;}}// LOGGER.debug(content);// 測試下content// LOGGER.debug(keyword);// 測試下keyword有沒有捕捉到String ret = "";String msg = replaceBotName(content);if (StringUtils.isNotBlank(keyword)) {try { // 這部分是我的改寫ret = AnswersFromSQLite.getValue(keyword);// 自定義回復(fù)消息ret= URLEncoder.encode(ret, "UTF-8");} catch (final UnsupportedEncodingException e) {LOGGER.log(Level.ERROR, "Search key encoding failed", e);}} else if (StringUtils.contains(content, XiaoVs.QQ_BOT_NAME) && StringUtils.isNotBlank(msg)) {...// 這部分和作者源碼一致,省略了}try {ret= URLDecoder.decode(ret, "UTF-8");} catch (final UnsupportedEncodingException e) {LOGGER.log(Level.ERROR, "ret decoding failed", e);}return ret;}// E:\Software_install\MyEclipse15_20_Work\code_backup\xiaov_1_0\src\main\java\org\b3log\xiaov\service\SQLiteAnswers\AnswersFromSQLite.class
public class AnswersFromSQLite {... //見我的源碼public static String getValue(String key) throws SQLException {// 測試查詢某條記錄Dao<t_answers, Integer> dao = getDao();List<t_answers> ans = queryByOPtions(dao, key);// logger.info(ans.get(0).getValue());if (ans != null) {return ans.get(0).getValue(); // 僅返回第一條記錄的value字段}return null;}... //省略,見我的代碼
}/*-----------------------------------------------------------------------------------------------------------------------------------------------------------------*/// QQService.java里面的onQQGroupMessage對問題的驗(yàn)證邏輯
// E:\Software_install\MyEclipse15_20_Work\code_backup\xiaov_1_0\src\main\java\org\b3log\xiaov\service\QQService.java
/** 這是我的注釋1.0* 這個(gè)函數(shù)非常重要,我會抽時(shí)間把這個(gè)函數(shù)講清楚 TODO* */private void onQQGroupMessage(final GroupMessage message) throws SQLException {final long groupId = message.getGroupId();final long userId = message.getUserId();// 獲取消息的sender的QQ號,與機(jī)器人的QQ做比較//LOGGER.debug(Long.toString(userId));//final long botId = XiaoVs.getInt("qq.bot.id");//從配置文件中讀當(dāng)前機(jī)器人的QQ號 {還有點(diǎn)bug,后面再修}// 為了解決2872995315溢出的問題,只能把userId和機(jī)器人ID比較由 Long比較 轉(zhuǎn)化成 字符串比較String s_userId = Long.toString(userId);//final String s_botId = "2872995315";//暫時(shí)寫死final String s_botId = XiaoVs.getString("qq.bot.id"); //從xiaov.properties配置文件中讀final String content = message.getContent();final String userName = Long.toHexString(message.getUserId());// Push to third systemString qqMsg = content.replaceAll("\\[\"face\",[0-9]+\\]", "");if (StringUtils.isNotBlank(qqMsg)) {qqMsg = "<p>" + qqMsg + "</p>";sendToThird(qqMsg, userName);}String msg = "";// 下面是對于QQ用戶提問的語句進(jìn)行合法性分析,如果符合規(guī)則,那就收集答案,并發(fā)送到QQ群 {要避免機(jī)器人自問自答的情況發(fā)生}/*if (StringUtils.contains(content, XiaoVs.QQ_BOT_NAME)|| (StringUtils.length(content) > 6&& (StringUtils.contains(content, "?") || StringUtils.contains(content, "?") || StringUtils.contains(content, "問")))) {msg = answer(content, userName);}*/if ( StringUtils.contains(content, XiaoVs.QQ_BOT_NAME) // TODO:這里是對提問的基本要求{過濾不合法的提問}|| (StringUtils.length(content) > 0) && !(s_userId.equals(s_botId)) ) { //徹底解決了機(jī)器人自問自答的bugmsg = answer(content, userName);}if (StringUtils.isBlank(msg)) {return;}if (RandomUtils.nextFloat() >= 0.9) {Long latestAdTime = GROUP_AD_TIME.get(groupId);if (null == latestAdTime) {latestAdTime = 0L;}final long now = System.currentTimeMillis();if (now - latestAdTime > 1000 * 60 * 30) {msg = msg + "。\n" + ADS.get(RandomUtils.nextInt(ADS.size()));GROUP_AD_TIME.put(groupId, now);}}sendMessageToGroup(groupId, msg);}
- 我覺得必須要放到svn或者git托管了,否則一旦出錯了,沒有回滾項(xiàng)目就完了
3. 突然發(fā)現(xiàn)的小Tips:
突然發(fā)現(xiàn),其實(shí)還有個(gè)小薇的守護(hù)QQ(在哪里有寫?防止丟消息??)但是我目前沒用守護(hù)QQ,依舊正常運(yùn)行,后面有需要再處理這個(gè)tips
轉(zhuǎn)載于:https://www.cnblogs.com/LS1314/p/9040465.html
總結(jié)
以上是生活随笔為你收集整理的基于SmartQQ协议的QQ聊天机器人-4的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。