当前位置: 首页 > 工具软件 > qq-t-java-sdk > 使用案例 >

如何用Java写QQ机器人 v2.0

洪弘壮
2023-12-01

这次我想不到什么开场白了,直接开始吧。

前提

IDE : IntelliJ IDEA
JDK : JDK8+
Maven: 3.6.0+

simple-robot框架

此框架的github地址:https://github.com/ForteScarlet/simpler-robot
simple-robot是一个目标为兼容多平台机器人应用的框架。

此框架中已经集成了针对于QQ机器人的开发组件,因此我们可以使用此框架来开发一个QQ机器人。



官方文档

在介绍之前,先贴出此框架的官方文档,如果有能力有兴趣的小伙伴可以直接去看看文档,或者加入他们的交流群。
文档:https://www.yuque.com/simpler-robot/simpler-robot-doc



simple-robot mirai组件

simple-robot对接QQ的一个组件是对接使用mirai框架进行的,并且基于chusimple-robot框架下,除了日志和配置文件以外你应当感知不到mirai的存在。

simple-robot mirai组件文档



构建项目

我们使用maven构建项目,首先导入所需依赖:

版本请参考simple-robot 的 github中的最新版本。

	<properties>
     	<simbot.version>2.0.1</simbot.version>
	</properties>

	<dependencies>
        <!-- mirai组件依赖。如果使用版本控制,则不需要填写version。 -->
        <dependency>
            <groupId>love.forte.simple-robot</groupId>
            <artifactId>component-mirai</artifactId>
            <version>${simbot.version}</version>
        </dependency>
	</dependencies>
	
	<build>
        <plugins>
            <!-- compiler plugin. -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>8</source>
                    <target>8</target>
                    <compilerArgs>
                        <arg>-parameters</arg>
                    </compilerArgs>
                </configuration>
            </plugin>
            <!-- 打包插件, 用于打包为jar -->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.3.4.RELEASE</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

配置文件

先准备好配置文件吧,在 resources 目录下创建一个配置文件:simbot.yml,不知道什么是 resources 目录的同学可以去百度一下补补功课哦~
这里就展示一个最简单的配置:

simbot:
  core:
    # 账号:密码,多个用逗号(,)分隔或者用yaml的多项配置
    # bots: 账号:密码
    bots: 1111111:password

注意!我建议你关闭这个测试用的账号的 设置 - 账号安全 中所有能关闭的选项,例如 登录设备管理 - 登录保护等。
上述这些可以通过手机端进行设置,并自行评估这样做的风险。



写一个监听器类

新建一个包路径:example.bot.listener,当然,这个路径你可以自己随便改,然后在这个 listener 包下新建一个类:MyListener,当然,类名也可随便:

@Beans
public class MyListener {
    
    // ...
    
}

可以看到,需要在类上标注一个 @Beans 注解,这是simple-robot 中的依赖注入模块所提供的注解,可以认为它是一个在Springboot中类似@Component的注解。

接下来,下一个监听私聊消息的"监听函数",这里我直接copy simple-robot官方demo项目中的代码了:

/**
 * 私聊消息监听的示例类。
 * 所有需要被管理的类都需要标注 {@link Beans} 注解。
 * @author ForteScarlet
 */
@Beans
public class MyListener {

    /**
     * 通过依赖注入获取一个 "消息正文构建器工厂"。
     *
     */
    @Depend
    private MessageContentBuilderFactory messageContentBuilderFactory;

    /**
     * 此监听函数监听一个私聊消息,并会复读这个消息,然后再发送一个表情。
     * 此方法上使用的是一个模板注解{@link OnPrivate},
     * 其代表监听私聊。
     * 由于你监听的是私聊消息,因此参数中要有个 {@link PrivateMsg} 来接收这个消息实体。
     *
     * 其次,由于你要“复读”这句话,因此你需要发送消息,
     * 因此参数中你需要一个 "消息发送器" {@link Sender}。
     *
     * 当然,你也可以使用 {@link love.forte.simbot.api.sender.MsgSender},
     * 然后 {@code msgSender.SENDER}.
     */
    @OnPrivate
    public void replyPrivateMsg1(PrivateMsg privateMsg, Sender sender){
        // 获取消息正文。
        MessageContent msgContent = privateMsg.getMsgContent();


        // 向 privateMsg 的账号发送消息,消息为当前接收到的消息。
        sender.sendPrivateMsg(privateMsg, msgContent);

        // 再发送一个表情ID为'9'的表情。
        // 方法1:使用消息构建器构建消息并发送
        // 在绝大多数情况下,使用消息构建器所构建的消息正文 'MessageContent'
        // 是用来发送消息最高效的选择。
        // 相对的,MessageContentBuilder所提供的构建方法是十分有限的。

        // 获取消息构建器
        MessageContentBuilder msgBuilder = messageContentBuilderFactory.getMessageContentBuilder();
        // 通过.text(...) 向builder中追加一句话。
        // 通过.face(ID) 向builder中追加一个表情。
        // 通过.build() 构建出最终消息。
        MessageContent msg = msgBuilder.text("表情:").face(9).build();

        // 直接通过这个msg发送。
        sender.sendPrivateMsg(privateMsg, msg);

        // 方法2:使用CAT码发送消息。
        // 使用CAT码构建一个需要解析的消息是最灵活的,
        // 但是相对的,它的效率并不是十分的可观,毕竟在这其中可能会涉及到很多的'解析'操作。

        // 获取CAT码工具类实例
        CatCodeUtil catCodeUtil = CatCodeUtil.getInstance();

        // 构建一个类型为 'face', 参数为 'id=9' 的CAT码。
        // 有很多方法。

        // 1. 通过 codeBuilder 构建CAT码
        // String cat1 = catCodeUtil.getStringCodeBuilder("face", false).key("id").value(9).build();

        // 2. 通过CatCodeUtil.toCat 构建CAT码
        // String cat2 = catCodeUtil.toCat("face", "id=9");

        // 3. 通过模板构建CAT码
        String cat3 = catCodeUtil.getStringTemplate().face(9);

        // 在cat码前增加一句 '表情' 并发送
        sender.sendPrivateMsg(privateMsg, "表情:" + cat3);

    }
}

编写启动类

在上述监听函数的上一层包路径中,创建一个启动类:MyBotApplication

@SimbotApplication
public class MyBotApplication {
    public static void main(String[] args) {
        SimbotApp.run(MyBotApplication.class, args);
    }
}

然后执行main方法,观察控制台信息,因为在前几次登录的时候有可能会出现一些类似于需要输入验证码啊之类的信息。

如果出现了类似这样的日志:

[2021-02-23T17:10:57.189]-[INFO ] |           love.f.s.c.c.CoreListenerRegistrar : Start the registration Bot: code=111111111, name=这是bot的名字, level=9999

那么这就说明你配置文件中填写的账号登录成功了。

接下来,用另外的账号私聊这个账号,比如说一句:你好
如果它也回复了你,那么恭喜你,第一步已经成功了。

成功了

当你成功后,你就可以:

失败了

不要气馁,你可以通过 github讨论区github issue 进行提问或反馈。

支持与赞助

不要忘记,一份赞助是鼓励作者的最好方式,你可以通过赞助simple-robot 来表示你的支持。

 类似资料: