欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【进阶】QQ聊天机器人--群聊机器人篇

程序员文章站 2022-06-04 09:57:48
...

【进阶】QQ聊天机器人–群聊机器人篇

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

  • 为你的QQ群定制一个人工智障!
  • 使用一位大佬的框架PICQ实现更多强大的功能!

欢迎加入我的java技术交流群,点击加入,一起学习和成长

代码已经上传到了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 测试检查

检测到端口正常工作
【进阶】QQ聊天机器人--群聊机器人篇
使用tailf命令实时查看控制台打印的消息
【进阶】QQ聊天机器人--群聊机器人篇
这就是回声墙
【进阶】QQ聊天机器人--群聊机器人篇

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);
    }
}

【进阶】QQ聊天机器人--群聊机器人篇

总结

花了两天时间,从想法,到去实践;从读文档,看教程,解决各种环境问题,配置问题,到最后综合自己的想法做了个还能用的人工智障。这个过程踩了许多坑,自己还是太菜,虽然是别人已经写好的框架,但是应用起来还是很困难。我觉得这个过程中,最重要的是学会如何快速的读文档,根据自己的环境去想解决办法,这些能力是很需要培养的!
想要更多的功能就去努力写吧,写的好了别忘了联系我,让我拜读一下。。。