Mirai qq机器人框架kotlin/java教程
Mirai qq機器人框架kotlin/java教程
- 前言
- 資料列表
- 可能遇到的問題
- 1.準備
- i. 配置java環境
- ii. 配置IDE
- iii. 下載mirai-console-loader(mcl)作為啟動器
- 其他啟動器
- 2.創建mirai-console插件項目
- i. 下載
- ii. 個性化項目
- 3. 文件夾結構解析
- 4.kotlin插件代碼解析
- i.所有在以下代碼中要引入的庫
- ii.構建主類
- iii.覆蓋插件啟用函數
- iv.監聽事件
- v. 全部代碼
- vi. gradle部分代碼
- 5. Java插件代碼解析
- i. 在下面代碼中要引入的庫
- ii. 構建主類
- iii. 覆蓋插件啟用函數
- iv. 監聽事件
- v. 全部代碼
- vi. gradle 部分代碼
- 6. 在IDE內運行
- i. 更改MiraiRunKt配置
- ii.運行MiraiRunKt任務
- 7. 生成插件并運行
- i. 生成插件
- ii.在mcl中運行
前言
構建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. 下載
ii. 個性化項目
- 在settings.gradle.kts里改生成的插件.jar名稱也就是項目名稱, 或者在build.gradle.kts里面獲取shadowjar任務改如:
- 用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. 文件夾結構解析
插件實例代碼文件結構
│ 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└─kotlinRunMirai.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.pluginimport 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 kotlinVersionkotlin("plugin.serialization") version kotlinVersionid("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. 覆蓋插件啟用函數
@Overridepublic 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());}@Overridepublic 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
總結
以上是生活随笔為你收集整理的Mirai qq机器人框架kotlin/java教程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 程序员最真实的10个瞬间
- 下一篇: H5页面移动端双击屏幕禁止页面放大