Mirai框架开发QQ机器人

QQ机器人

酷Q机器人已经从叱诧风云的QQ机器人框架中消失,仅存的几款开源框架,不是效果不理想,就是自定义度不高。而Mirai就是这样一个框架,其内部的功能并不是很强大,但他对一些功能的封装并不严格,所以也就有机会能和底层进行交流。

必要的知识

首先你要保证你已经掌握了Java或者kotlin的语法规则,并且能够写出最基本的代码(Hello world)

安装MCL

自动安装

MCL Installer自动安装工具可以获取到所有系统的iTXTech MCL

手动安装

  1. 安装 Java 运行时(版本必须 >= 11)
  2. Releases 下载最新版本的MCL
  3. 解压到某处
  4. 在命令行中执行.\mcl以启动MCL
  5. 启动过程中或许会需要安装openjdk,不推荐安装(使用你自己安装的jdk就可以)
  6. 如果启动过程中出现类文件版本高低等问题,都可以通过修改jdk版本解决

下载Mirai

IDEA插件

打开IDEA,在文件->设置->插件中搜索Mirai Console

安装完成后重启IDEA,然后就可以新建一个Mirai项目了

选择jdk版本,新版本使用11及以上

你可以选择Kotlin或者Java,希望使用什么语言就选择什么语言,我这里用Java举例

一些简单的基本信息

文件路径

开始编写

创建新项目的过程可能会有点慢,静静等待一会就好了

新项目创建好的主类应该含有下面这些代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public static final Plugin INSTANCE = new Plugin();
//这里是注册方法
private Plugin() {
super(new JvmPluginDescriptionBuilder("主类", "1.0")
.name("插件名字")
.author("作者名")
.build());
}
}
//插件被加载时的方法
@Override
public void onLoad(@NotNull PluginComponentStorage $this$onLoad) {
//一般在这里写有关配置文件的加载
}
//插件运行时的方法
@Override
public void onEnable() {
//主要功能的注册和事件的监听写在这里
}
//插件卸载时执行的方法
@Override
public void onDisable() {
//一般这里写保存配置文件或者关闭流
}

加载配置文件

1
2
3
4
@Override
public void onLoad(@NotNull PluginComponentStorage $this$onLoad) {
getConfigFolder();//获取配置文件目录,是以你插件的名字命名的
}

默认代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Override
public void onEnable() {
//注册监听事件
EventChannel<Event> eventChannel = GlobalEventChannel.INSTANCE.parentScope(this);

//可以选择监听群聊消息
eventChannel.subscribeAlways(GroupMessageEvent.class, g -> {
//监听群消息
System.out.println(g.getMessage().contentToString());
});

//也可以选择监听好友消息
eventChannel.subscribeAlways(FriendMessageEvent.class, f -> {
//好友消息
System.out.println(f.getMessage().contentToString());
});
//事件的种类很多就不意一一列举了,不过写法都是类似的
}

常用事件

1
2
3
4
5
EventChannel<Event> eventChannel = GlobalEventChannel.INSTANCE.parentScope(this);
//定义操作
eventChannel.subscribeAlways(事件种类.class, g -> {
//操作
});
事件 功能 可供选择的操作
GroupEvent 群聊事件 .getBot()获取机器人Bot对象
FriendEvent 好友事件 .getBot()获取机器人Bot对象
StrangerEvent 陌生人事件 .getBot()获取机器人Bot对象
下面就是一些细化事件
FriendAddEvent 添加好友事件 .getFriend()获取添加者的Friend对象
StrangerAddEvent 陌生人添加事件 .getStranger()获取Stranger对象(一般Stranger都是临时会话的对象)
FriendAvatarChangedEvent 好友头像改变事件 .getBot()获取机器人Bot对象
MemberJoinEvent 群聊新成员加入事件 .getMember()获得成员对象

对象常用方法

GroupEvent:

​ 1、getBot()获取机器人

​ 2、getGroup()获取群聊对象:

Group:

​ 1、contains(QQ号)判断是否在群聊内

​ 2、getAvatarUrl()获取群头像链接

​ 3、getBotAsMember()作为群成员对象获取机器人

​ 4、getBotMuteRemaining()查看机器人被禁言的剩余时间

​ 5、getBotPermission()获得机器人许可等级

​ 6、getMembers()获得某个群成员

​ 7、getName()获得机器人的群昵称

​ 8、getSettings()获得群聊的设置

​ 9、sendMessage()在群聊发消息

FriendEvent:

​ 1、getFriend()获得朋友对象

Friend:

​ 1、sendMessage()发送消息

​ 2、delete()删除好友

Member:

​ 1、getNameCard()获得名片

​ 2、isMuted()判断是否禁言

​ 3、unmute()解除禁言

更多的方法可以在IDEA中尝试,命名还是很好懂的

消息元素

在java中,一般这么构建消息链

1
MessageChainBuilder builder = new MessageChainBuilder();

针对builder对象,我们可以对他插入消息元素等

1
2
3
AtAll.INSTANCE(@所有人)
new Face(Face.表情名)
new At(114514L) (@某个人,加QQ号)

图片:

1
2
3
4
5
6
7
8
9
10
11
12
EventChannel<Event> eventChannel = GlobalEventChannel.INSTANCE.parentScope(this);
eventChannel.subscribeAlways(FriendEvent.class, event->{
//发送本地图片
//构建资源对象
ExternalResource res = ExternalResource.create(new File("本地图片"));
//构建图片对象
Image image = event.getFriend().uploadImage(res);
//关闭资源流
res.close();
//发送图片
event.getFriend().sendMessage(image);
});

也可以通过图片ID发送图片,不过图片ID一般看不到

1
2
3
4
5
EventChannel<Event> eventChannel = GlobalEventChannel.INSTANCE.parentScope(this);
eventChannel.subscribeAlways(FriendEvent.class, event->{
//发送图片
event.getFriend().sendMessage(Image.fromId("图片ID"));
});

发出声音:

1
2
3
4
5
6
7
8
9
10
EventChannel<Event> eventChannel = GlobalEventChannel.INSTANCE.parentScope(this);
eventChannel.subscribeAlways(FriendEvent.class, event->{
//还是资源对象
ExternalResource res = ExternalResource.create(new File("声音文件.amr"));
Audio audio = event.getFriend().uploadAudio(res); // 适用于2.7+
// Voice audio = contact.uploadVoice(res); // 可用于2.0~2.7
//关闭资源流
res.close();
event.getFriend().sendMessage(audio);
});

指令

新建一个java文件,命名随意,我这里使用了echo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class 指令类 extends JSimpleCommand {

public static final 指令类 INSTANCE = new 指令类();

//构造函数,用于初始化对象
private 指令类() {
super(主类名.INSTANCE, "指令", "功能");
this.setDescription("描述");
}

@Handler
public void handle(CommandSender sender, User target, String msg) {
//然后就可以实现你的算法了
}
}

然后在主类内进行注册指令

1
2
3
4
5
//在启用运行函数内注册方法
@Override
public void onEnable() {
CommandManager.INSTANCE.registerCommand(指令类.INSTANCE, false);
}

插件的编译

在项目构建工具的右侧,会有一条工具栏,侧边的Gradle中点击拉开build,找到jar工具,双击即可编译出jar文件

导出的jar文件在你的项目路径下build/libs/文件名.jar将他拖入MCL启动器的plugins文件夹下

配置MCL

在上述操作完成后,可以打开MCL启动器的目录,找到config/Console/AutoLogin.yml,向里面添加你的机器人QQ,方便之后进行自动登录,第一次登录可能会出现拦截,不过只需在一部手机上打开弹窗的链接,进行安全认证即可


MCL的其他文件夹或文件的功能我就不多赘述了,当你完成上述操作后,回到MCL的根路径下,就可以开启机器人了

(放一张正常运行的图片)

结语

如果有不会的可以查看大佬的非官方文档(虽然是kotlin,不过大体是相似的)

觉得不错就分享出去吧~

https://mirai.mamoe.net/topic/802


Mirai框架开发QQ机器人
https://blog.minloha.cn/posts/2111352eabd5872021111139.html
作者
Minloha
发布于
2021年11月11日
更新于
2023年12月21日
许可协议