前言 构建mirai的mirai-console插件教程 用到的概念有mcl
- 指mirai-console-loader,mirai-console官方启动器mirai
- mirai 是一个在全平台下运行,提供 QQ Android 协议支持的高效率机器人库,根据AGPLv3
开源
资料列表 以下为一些官方资料mirai官方github库 mirai-console官方github库 mirai-console-loader(mcl)官方启动器官方github库 这三者的关系可以参考这里 官方实例 mirai官方论坛 官方demo mirai在线api文档
另,以下是一些资源:笔者整理的mirai-console插件实例包含kt和java)
可能遇到的问题 MiraiOK已经没用了,用mcl(网址在上面) 最好用openjdk不过甲骨文的jdk好像也可以(建议用openjdk, 解释在下面) 根据issue#959 目前邀请机器人进200+人的群都不会触发事件 插件id必须为类包格式(xxx.xxx.xxx) 有的时候收不到机器人的信息是因为被tx风控了换号或多发几次以及多挂(可以去论坛看看) 建议看一遍官方文档虽然有点乱 如果遇到问题,可以去mirai论坛 上问 如果要在mcl内改登录协议,在login命令后加参数或在config/console/autologin.yml里面设置自动登录命令和登录的协议 mcl登录报错环境异常
,参考论坛解决方案 改了入口点包路径需要到resources\META-INF\services\net.mamoe.mirai.console.plugin.jvm.JvmPlugin
改成对应的类包路径 1.准备 i. 配置java环境 下载mcl所需要的是>=11版本的openjdk,openjdk下载地址 ,下载教程参考搜索引擎
最好用openjdk而不是甲骨文(Oracle)的jdk,原因
ii. 配置IDE 推荐IDEA吧,其他的也可以,主要是IDEA挺好用的 可以选择安装的官方插件:Mirai Console IntelliJ 提供错误检查等功能 Kotlin Jvm Blocking Bridge 帮助 Java 用户调用 Kotlin suspend 函数 详细参考官方文档
iii. 下载mirai-console-loader(mcl)作为启动器 官方地址 教程同见官方说明
其他启动器 目前也出了其他启动器,查看这里
2.创建mirai-console插件项目 i. 下载 从官方实例 或笔者整理的mirai-console插件实例 中下载最新版的框架到本地,然后用IDE打开文件夹 使用插件生成,详细查看官网 ii. 个性化项目 在settings.gradle.kts
里改生成的插件.jar名称也就是项目名称, 或者在build.gradle.kts里面获取shadowjar任务改如:1 2 3 4 5 6 7 8 9 tasks { afterEvaluate { named<net.mamoe.mirai.console.gradle.BuildMiraiPluginTask>("buildPlugin" ) { archiveBaseName.set ("name" ) archiveClassifier.set ("" ) archiveVersion.set (version) } } }
用RunMiraikt
这个文件(在test文件夹下)可以在ide里运行,不用复制到mcl或其他启动器 用buildPlugin
这个gradle任务可以生成.jar插件 在src/main/kotlin/PluginMain
主类内可以修改插件信息(mcl用) 最好修改PluginMain.kt
或JavaPluginMain.java
的包名避免插件载入冲突,然后在resources\META-INF\services\net.mamoe.mirai.console.plugin.jvm.JvmPlugin
中更改类包名到你改后的名,路径见下面 3. 文件夹结构解析 插件实例代码文件结构
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 │ build.gradle.kts gradle依赖列表 │ settings.gradle.kts gradle设置 │ ├─.run │ RunMiraiKt.run.xml IDE中运行任务配置,即RunMiraiKt源文件 │ ├─run RunMiraiKt默认运行目录 │ └─src ├─main │ ├─kotlin │ │ PluginMain.kt kotlin插件主类 │ ├─Java │ │ JavaPluginMain.java java插件主类 │ │ │ ├─resources\META-INF\services │ │ net.mamoe.mirai.console.plugin.jvm.JvmPlugin Mirai加载的主类 └─test └─kotlin RunMirai.kt RunMiraiKt任务配置
4.kotlin插件代码解析 代码以github上的代码为准,可能会有更新
i.所有在以下代码中要引入的库 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 import net.mamoe.mirai.console.plugin.jvm.JvmPluginDescriptionimport net.mamoe.mirai.console.plugin.jvm.KotlinPluginimport net.mamoe.mirai.event.events.BotInvitedJoinGroupRequestEventimport net.mamoe.mirai.event.events.FriendMessageEventimport net.mamoe.mirai.event.events.GroupMessageEventimport net.mamoe.mirai.event.events.NewFriendRequestEventimport net.mamoe.mirai.utils.infoimport net.mamoe.mirai.message.data .Imageimport net.mamoe.mirai.message.data .PlainTextimport net.mamoe.mirai.event.Listenerimport net.mamoe.mirai.event.globalEventChannelimport kotlin.coroutines.EmptyCoroutineContext
监听和事件参考官方文档
ii.构建主类 1 2 3 4 5 6 7 object PluginMain : KotlinPlugin( JvmPluginDescription( id = "org.example.mirai-example" , version = "0.1.0" ) ) { }
其中,kotlinPlugin
指继承plugin父类,JvmPluginDescription
指声明插件消息和版本
iii.覆盖插件启用函数 1 2 3 4 override fun onEnable () { logger.info { "Plugin loaded" } }
用kotlin关键字override
实现插件启用函数,然后用logger.info()
进行日志输出,其中logger
是kotlinPlugin
类内成员,除了.info()
还有.warning()
输出警告和.error()
输出报错
iv.监听事件 用subscribeAlways<>{}
这个函数在onEnable
函数中开启监听(还可以subscribe
或subscribeOnce
见mirai文档)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 globalEventChannel().subscribeAlways<GroupMessageEvent>{ if (message.contentToString().startsWith("复读" )) { group.sendMessage(message.contentToString().replace("复读" , "" )) } if (message.contentToString() == "hi" ) { group.sendMessage("hi" ) } message.forEach { if (it is Image) { } if (it is PlainText) { } } } globalEventChannel().subscribeAlways<FriendMessageEvent>{ } globalEventChannel().subscribeAlways<NewFriendRequestEvent>{ accept() } globalEventChannel().subscribeAlways<BotInvitedJoinGroupRequestEvent>{ accept() }
v. 全部代码 这些代码是笔者整理的mirai-console插件kotlin版实例 中的内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 package org.example.mirai.pluginimport net.mamoe.mirai.console.plugin.jvm.JvmPluginDescriptionimport net.mamoe.mirai.console.plugin.jvm.KotlinPluginimport net.mamoe.mirai.event.Listenerimport net.mamoe.mirai.event.events.BotInvitedJoinGroupRequestEventimport net.mamoe.mirai.event.events.FriendMessageEventimport net.mamoe.mirai.event.events.GroupMessageEventimport net.mamoe.mirai.event.events.NewFriendRequestEventimport net.mamoe.mirai.event.globalEventChannelimport net.mamoe.mirai.message.code.MiraiCodeimport net.mamoe.mirai.utils.infoimport net.mamoe.mirai.message.data .Imageimport net.mamoe.mirai.message.data .Image.Key.queryUrlimport net.mamoe.mirai.message.data .PlainTextobject PluginMain : KotlinPlugin( JvmPluginDescription( id = "org.example.mirai-example" , name = "插件示例" , version = "0.1.0" ) ) { override fun onEnable () { logger.info { "Plugin loaded" } globalEventChannel().subscribeAlways<GroupMessageEvent>{ group.sendMessage("\uD83D\uDE03" ) } globalEventChannel().subscribeAlways<FriendMessageEvent>{ sender.sendMessage("hi" ) } globalEventChannel().subscribeAlways<NewFriendRequestEvent>{ accept() } globalEventChannel().subscribeAlways<BotInvitedJoinGroupRequestEvent>{ accept() } } }
vi. gradle部分代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 plugins { val kotlinVersion = "1.4.30" kotlin("jvm" ) version kotlinVersion kotlin("plugin.serialization" ) version kotlinVersion id("net.mamoe.mirai-console" ) version "2.3.2" } group = "org.example" version = "0.1.0" repositories { jcenter() maven { url =uri("https://mirrors.huaweicloud.com/repository/maven" ) } maven { url =uri("https://maven.aliyun.com/nexus/content/repositories/jcenter" )} maven {url = uri("https://dl.bintray.com/him188moe/mirai" )} mavenLocal() mavenCentral() } dependencies{ }
其中2.3.2
是目前最新开发版本,请自行通过官方文档 选择版本并更改
5. Java插件代码解析 i. 在下面代码中要引入的库 1 2 3 4 5 6 7 8 9 10 import net.mamoe.mirai.console.plugin.jvm.JavaPlugin;import net.mamoe.mirai.console.plugin.jvm.JvmPluginDescriptionBuilder;import net.mamoe.mirai.event.GlobalEventChannel;import net.mamoe.mirai.event.events.FriendMessageEvent;import net.mamoe.mirai.event.events.GroupMessageEvent;
ii. 构建主类 构建mirai插件的主类也就是入口点,必须要继承JavaPlugin
1 2 3 4 5 6 7 8 public final class JavaPluginMain extends JavaPlugin { public static final JavaPluginMain INSTANCE = new JavaPluginMain (); private JavaPluginMain () { super (new JvmPluginDescriptionBuilder ("org.example.mirai-example" , "0.1.0" ) .info("EG" ) .build()); } }
其中JvmPluginDescriptionBuilder
的声明插件信息
iii. 覆盖插件启用函数 1 2 3 4 @Override public void onEnable () { getLogger().info("日志" ); }
用getLogger()
获取日志对象,然后用.info()
发送普通日志
iv. 监听事件 1 2 3 4 5 6 7 8 9 GlobalEventChannel.INSTANCE.subscribeAlways(GroupMessageEvent.class, g -> { getLogger().info(g.getMessage().contentToString()); }); GlobalEventChannel.INSTANCE.subscribeAlways(FriendMessageEvent.class, f -> { getLogger().info(f.getMessage().contentToString()); });
v. 全部代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 package org.example.mirai.plugin;import net.mamoe.mirai.console.plugin.jvm.JavaPlugin;import net.mamoe.mirai.console.plugin.jvm.JvmPluginDescriptionBuilder;import net.mamoe.mirai.event.GlobalEventChannel;import net.mamoe.mirai.event.events.FriendMessageEvent;import net.mamoe.mirai.event.events.GroupMessageEvent;public final class JavaPluginMain extends JavaPlugin { public static final JavaPluginMain INSTANCE = new JavaPluginMain (); private JavaPluginMain () { super (new JvmPluginDescriptionBuilder ("org.example.mirai-example" , "0.1.0" ) .info("EG" ) .build()); } @Override public void onEnable () { getLogger().info("日志" ); GlobalEventChannel.INSTANCE.subscribeAlways(GroupMessageEvent.class, g -> { getLogger().info(g.getMessage().contentToString()); }); GlobalEventChannel.INSTANCE.subscribeAlways(FriendMessageEvent.class, f -> { getLogger().info(f.getMessage().contentToString()); }); } }
vi. gradle 部分代码 同#4-vi.-gradle-部分代码
6. 在IDE内运行 i. 更改MiraiRunKt配置 把/src/test/kotlin/RunMirai.kt
中的qq号和密码改成你的 如果在根目录下没有run文件夹,则可能报错,新建一个就好了
ii.运行MiraiRunKt任务 如果任务报错先配置任务 然后检查根目录下有没有run文件夹,就是这里的路径,如果没有则创建 然后配置登录配置
7. 生成插件并运行 i. 生成插件 用IDE中gradle的buldplugin
任务可以在buid/mirai/
下生成一个.jar插件文件
ii.在mcl中运行 把这个.jar文件放到mcl的plugin文件夹下,然后用cmd或者直接打开mcl.cmd运行
有什么评论区问,以后再补充
-END-