Mirai qq機器人框架kotlin/java教程


前言

構建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/ 下載 (該網站截止文章發布日期使用沒有異樣,請留意可能的下載風險,本文並不承擔可能的責任,本文只提供個思路),然后從網站上下,如
    1. 按照那篇文章里獲取gradle版本
    2. 打開 https://services.gradle.org/distributions/ 復制對應版本的-all.zip的下載地址
    3. 輸入到代理下載網站並下載
    4. 按照那篇文章里處理
  • 如果要在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. 下載

  1. 官方實例筆者整理的mirai-console插件實例中下載最新版的框架到本地,然后用IDE打開文件夾
  2. 使用插件生成,詳細查看官網

ii. 個性化項目

  • src/main/resources/plugin.yml里改插件信息和入口點
  • settings.gradle.kts里改生成的插件.jar名稱
  • RunMiraikt這個配置可以在ide里運行,不用復制到mcl或其他啟動器
  • buildPlugin這個任務可以生成.jar插件
  • src/main/kotlin/PluginMain主類內也可以修改插件信息
  • 最好修改PluginMain.ktJavaPluginMain.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()進行日志輸出,其中loggerkotlinPlugin類內成員,除了.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任務

如果任務報錯先配置任務
runmiraikt
然后檢查根目錄下有沒有run文件夾,就是這里的路徑,如果沒有則創建
work dir
然后配置登錄配置
step

7. 生成插件並運行

i. 生成插件

用IDE中gradle的buldplugin任務可以在buid/mirai/下生成一個.jar插件文件
step

ii.在mcl中運行

把這個.jar文件放到mcl的plugin文件夾下,然后用cmd或者直接打開mcl.cmd運行

有什么評論區問,以后再補充
相關qq群 1044565129

-END-


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM