前言
構建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-console插件實例包含kt和java)
可能遇到的問題
- MiraiOK如果在本文發布后沒有更新,那應該就是沒有用了,用mcl
- 最好用openjdk不過甲骨文的jdk好像也可以
- 根據issue#959目前邀請機器人進200+人的群都不會觸發事件
- 插件id必須為類包格式
- 有的時候收不到機器人的信息是因為被tx管控了換號或多發幾次以及多掛
- 建議看一遍官方文檔雖然有點亂
- 如果遇到問題,可以去mirai論壇上問
- 如果IDEA報錯下載gradle超時什么的應該是gradle被牆了或下載速度慢,如果有v最好掛上,如果沒可以參考這種解決方案大概就手動下載到本地然后指定,其中,這篇文章的百度網盤地址已失效,可以用代理下載網站如 https://d.serctl.com/ 下載 (該網站截止文章發布日期使用沒有異樣,請留意可能的下載風險,本文並不承擔可能的責任,本文只提供個思路),然后從網站上下,如
- 按照那篇文章里獲取gradle版本
- 打開 https://services.gradle.org/distributions/ 復制對應版本的-all.zip的下載地址
- 輸入到代理下載網站並下載
- 按照那篇文章里處理
- 如果要在mcl內改協議,在login命令后加參數,或在config/console/autologin.yml里面設置自動登錄命令和登錄的協議
- mcl登錄報錯
環境異常
, 參考論壇解決方案 - 改了入口點包路徑需要到
resources\META-INF\services\net.mamoe.mirai.console.plugin.jvm.JvmPlugin
改成對應的類包路徑
1.准備
i. 配置java環境
下載mcl所需要的是>=1.8版本的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. 個性化項目
- 在
src/main/resources/plugin.yml
里改插件信息和入口點 - 在
settings.gradle.kts
里改生成的插件.jar名稱 - 用
RunMiraikt
這個配置可以在ide里運行,不用復制到mcl或其他啟動器 - 用
buildPlugin
這個任務可以生成.jar插件 - 在
src/main/kotlin/PluginMain
主類內也可以修改插件信息 - 最好修改
PluginMain.kt
或JavaPluginMain.java
的包名避免插件載入沖突,然后在resources\META-INF\services\net.mamoe.mirai.console.plugin.jvm.JvmPlugin
中更改類包名到你改后的名,路徑見下面
3. 文件夾結構解析
插件實例代碼文件結構
│ 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.所有在以下代碼中要引入的庫
//插件信息
import net.mamoe.mirai.console.plugin.jvm.JvmPluginDescription
//主類繼承
import net.mamoe.mirai.console.plugin.jvm.KotlinPlugin
//機器人被拉進群的事件
import net.mamoe.mirai.event.events.BotInvitedJoinGroupRequestEvent
//收到好友信息事件
import net.mamoe.mirai.event.events.FriendMessageEvent
//收到群消息事件
import net.mamoe.mirai.event.events.GroupMessageEvent
//新好友申請事件
import net.mamoe.mirai.event.events.NewFriendRequestEvent
//日志組件(logger)發控制台信息函數
import net.mamoe.mirai.utils.info
//消息(messageChain)中的圖片類型
import net.mamoe.mirai.message.data.Image
//消息(messageChain)中的純文本類型
import net.mamoe.mirai.message.data.PlainText
//監聽器
import net.mamoe.mirai.event.Listener
//監聽范圍
import net.mamoe.mirai.event.globalEventChannel
//協程范圍?
import kotlin.coroutines.EmptyCoroutineContext
監聽和事件參考官方文檔
ii.構建主類
object PluginMain : KotlinPlugin(
JvmPluginDescription(
id = "org.example.mirai-example",
version = "0.1.0"
)
) {
}
其中,kotlinPlugin
指繼承plugin父類,JvmPluginDescription
指聲明插件消息和版本
iii.覆蓋插件啟用函數
override fun onEnable() {
//或logger.info("xxx")
logger.info { "Plugin loaded" }
}
用kotlin關鍵字override
實現插件啟用函數,然后用logger.info()
進行日志輸出,其中logger
是kotlinPlugin
類內成員,除了.info()
還有.warning()
輸出警告和.error()
輸出報錯
iv.監聽事件
用 subscribeAlways<>{}
這個函數在onEnable
函數中開啟監聽
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版實例中的內容
package org.example.mirai.plugin
import net.mamoe.mirai.console.plugin.jvm.JvmPluginDescription
import net.mamoe.mirai.console.plugin.jvm.KotlinPlugin
import net.mamoe.mirai.event.Listener
import net.mamoe.mirai.event.events.BotInvitedJoinGroupRequestEvent
import net.mamoe.mirai.event.events.FriendMessageEvent
import net.mamoe.mirai.event.events.GroupMessageEvent
import net.mamoe.mirai.event.events.NewFriendRequestEvent
import net.mamoe.mirai.event.globalEventChannel
import net.mamoe.mirai.message.code.MiraiCode
import net.mamoe.mirai.utils.info
import net.mamoe.mirai.message.data.Image
import net.mamoe.mirai.message.data.Image.Key.queryUrl
import net.mamoe.mirai.message.data.PlainText
/*
使用kotlin版請把
src/main/resources/META-INF.services/net.mamoe.mirai.console.plugin.jvm.JvmPlugin
文件內容改成"org.example.mirai.plugin.PluginMain"也就是當前主類
使用kt可以把java文件夾刪除不會對項目有影響
在settings.gradle.kts里改生成的插件.jar名稱
build.gradle.kts里改依賴庫和插件版本
在主類下的JvmPluginDescription改插件名稱,id和版本
用runmiraikt這個配置可以在ide里運行,不用復制到mcl或其他啟動器
*/
object PluginMain : KotlinPlugin(
JvmPluginDescription(
id = "org.example.mirai-example",
name = "插件示例",
version = "0.1.0"
)
) {
override fun onEnable() {
logger.info { "Plugin loaded" }
//配置文件目錄 "${dataFolder.absolutePath}/"
globalEventChannel().subscribeAlways<GroupMessageEvent>{
//群消息
group.sendMessage("\uD83D\uDE03")
}
globalEventChannel().subscribeAlways<FriendMessageEvent>{
//好友信息
sender.sendMessage("hi")
}
globalEventChannel().subscribeAlways<NewFriendRequestEvent>{
//自動同意好友申請
accept()
}
globalEventChannel().subscribeAlways<BotInvitedJoinGroupRequestEvent>{
//自動同意加群申請
accept()
}
}
}
vi. gradle部分代碼
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")}
//mirai-console的倉庫
maven {url = uri("https://dl.bintray.com/him188moe/mirai")}
//滑動模塊的倉庫
// maven { url = uri("https://dl.bintray.com/karlatemp/misc") }
mavenLocal()
mavenCentral()
}
dependencies{
//在IDE內運行的mcl添加滑塊模塊,請參考https://github.com/project-mirai/mirai-login-solver-selenium把版本更新為最新
//runtimeOnly("net.mamoe:mirai-login-solver-selenium:1.0-dev-15")
}
其中2.3.2
是目前最新開發版本,請自行通過官方文檔選擇版本並更改
5. Java插件代碼解析
i. 在下面代碼中要引入的庫
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
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. 覆蓋插件啟用函數
@Override
public void onEnable() {
getLogger().info("日志");
}
用getLogger()
獲取日志對象,然后用.info()
發送普通日志
iv. 監聽事件
GlobalEventChannel.INSTANCE.subscribeAlways(GroupMessageEvent.class, g -> {
//監聽群消息
getLogger().info(g.getMessage().contentToString());
});
GlobalEventChannel.INSTANCE.subscribeAlways(FriendMessageEvent.class, f -> {
//監聽好友消息
getLogger().info(f.getMessage().contentToString());
});
v. 全部代碼
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運行
有什么評論區問,以后再補充
相關qq群 1044565129