【進階】QQ聊天機器人--羣聊機器人篇

【進階】QQ聊天機器人–羣聊機器人篇

看完本篇博客,能將能做到

  • 爲你的QQ羣定製一個人工智障!
  • 使用一位大佬的框架PICQ實現更多強大的功能!

代碼已經上傳到了github,可以看到更多細節(遠程部署,連接數據庫)

什麼是PICQ?

picq:一個基於 酷Q HTTP 插件 的 Java QQ 機器人類庫
基於這個框架,能夠很容易的實現大多數功能,開發者不用去注重底層的實現細節,而只用關注功能本身。

話不多說,開擼

1 導入開發框架Hydevelop/PicqBotX

pom文件中導入項目倉庫

<repositories>
    <repository>
        <id>jitpack.io</id>
        <url>https://jitpack.io</url>
    </repository>
</repositories>

pom文件中導入依賴

<dependency>
    <groupId>com.github.hydevelop</groupId>
    <artifactId>PicqBotX</artifactId>
    <version>4.12.0.1019.PRE</version>
</dependency>

如果網絡不好的話,很可能出現各種失敗,如果失敗了不要怕,多點幾次說不定就成了。博主花了兩個小時才把庫導入好,問題就是出在網絡和本地cahe中。。翻牆或者網絡好的話很快就能從jitpack.io中下載完畢。祝你好運。
maven配置文件中鏡像配置

<mirrors>
	<mirror>
      <id>nexus-aliyun</id>
      <name>Nexus aliyun</name>
      <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
      <mirrorOf>central</mirrorOf>        
    </mirror>
</mirrors>

2 導入完畢,來一個最簡單的helloworld

想要在springboot啓動時運行picq機器人,你需要這麼做

@Component
//寫一個組件實現ApplicationRunner接口,就能在springboot啓動時運行該程序,啓動picq的機器人
public class Main implements ApplicationRunner {
    @Override
    public void run(ApplicationArguments var1) throws Exception{
        // 創建機器人對象 ( 傳入配置 ) 傳入上報端口:
        // 30000就是我配置的上報端口,即在酷q的Http Api中配置的post_url端口,啓動後,該程序運行在哪,他post_url的ip就是多少
        PicqBotX bot = new PicqBotX(new PicqConfig(30000).setDebug(true));

        // 添加一個機器人賬戶 ( 名字, 發送URL, 發送端口 )
        //我的springboot和酷q運行在同一個機器上,酷q在docker中,所以可以通過本地ip直接訪問發送端口
        //該端口的作用就是用來發送機器人的回覆消息
        bot.addAccount("easier", "127.0.0.1", 6000);

        // 註冊事件監聽器, 可以註冊多個監聽器
        bot.getEventManager().registerListeners(
                new RobListener()
        );
        // 啓動機器人, 不會佔用主線程
        bot.startBot();
    }
}

3 監聽器RobListener需要自己寫,繼承IcqListener,監聽方法要寫註解@EventHandler

public class RobListener extends IcqListener {
    private static ArtificialFool artificialFool = new ArtificialFool();
    //監聽私聊信息
    @EventHandler
    //傳入監聽私聊事件
    public void privateMessage(EventPrivateMessage event){
        System.out.println("監聽到私聊信息");
        //response就是回覆,所以該功能就是把收到的消息回覆回去,就是回聲牆
        event.respond(event.getMessage());
    }
}

3 測試檢查

檢測到端口正常工作
在這裏插入圖片描述
使用tailf命令實時查看控制檯打印的消息
在這裏插入圖片描述
這就是回聲牆
在這裏插入圖片描述

4 羣聊機器人

建立好了數據的連接 ,那麼就可以去做要實現的功能了
在同一個監聽器中再寫一個監聽羣聊的方法

//監聽羣聊信息
    @EventHandler
    public void groupMsg(EventGroupMessage event){
        System.out.println("監聽到羣聊消息...");
        String answer = artificialFool.answer(event);
        if (answer!=null){
            System.out.println("-->"+answer);
            event.respond(answer);
        }
    }

我把消息的處理封裝成了一個方法
人工智障類ArtificialFool

public class ArtificialFool {
    private static Random random = new Random();
    public String answer(EventGroupMessage event){
        String message = event.message;
        if (isAt(message)){
            String trueMessage = message.substring(message.indexOf("]")+1).trim();
            System.out.println("<--"+trueMessage);
            String[] results = checkCommand(trueMessage);
            if (results!=null){
                return results[random.nextInt(results.length)];
            }else {
                return "小易聽不懂,你可以這樣對我說:\r\n"+ Arrays.toString(KeyWord.getCommands());
            }
        }
        return null;
    }
    //檢驗是否爲私聊
    public boolean isAt(String message){
        if (message.startsWith("[CQ:at,qq=1342246315]")){
            System.out.println("羣私聊");
            return true;
        }
        System.out.println("什麼都沒有發生");
        return false;
    }
    //檢驗是否爲命令

    /**
     * 如果是命令,返回命令內容
     * 否則返回null
     */
    public String[] checkCommand(String message){
        for (String command: KeyWord.getMapProblem().keySet()){
            if (message.equals(command)){
                return KeyWord.getMapProblem().get(command);
            }
        }
        return null;
    }
}

可以把所有的回覆封裝到一個類中

public class KeyWord {
    private static String[] commands;
    public static Map<String, String[]> mapProblem;
    private static String[] iAm;
    private static String[] good;
    private static String[] signIn;

    static {
        commands = new String[]{
                "簽到",
                "誇誇我",
                "自我介紹"
        };
        iAm = new String[]{
                "我是本羣的人工智障",
                "我是一段無情的代碼....",
                "我就是我",
        };
        good = new String[]{
                "想得美"
        };
        signIn = new String[]{
                "簽到失敗,該功能仍在開發中"
        };
        mapProblem = new LinkedHashMap<>();
        mapProblem.put("功能", commands);
        mapProblem.put("自我介紹", iAm);
        mapProblem.put("誇誇我", good);
        mapProblem.put("簽到", signIn);
    }
}

在這裏插入圖片描述

總結

從想法,到去實踐;從讀文檔,看教程,解決各種環境問題,配置問題,到最後綜合自己的想法做了個還能用的人工智障。這個過程踩了許多坑,自己還是太菜,雖然是別人已經寫好的框架,但是應用起來還是很困難。我覺得這個過程中,最重要的是學會如何快速的讀文檔,根據自己的環境去想解決辦法,這些能力是很需要培養的!
想要更多的功能就去努力寫吧,寫的好了別忘了聯繫我,讓我拜讀一下。。。

發佈了16 篇原創文章 · 獲贊 10 · 訪問量 2466
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章