Mirai框架qq機器人教程 新版

前言

本教程實爲mirai的mirai-console插件教程
用到的概念有
mcl - 指mirai-console-loader,mirai-console官方啓動器
mirai - mirai 是一個在全平臺下運行,提供 QQ Android 協議支持的高效率機器人庫,根據AGPLv3開源java

資料列表

如下爲一些官方資料
mirai官方github庫
mirai-console官方github庫
mirai-console-loader(mcl)官方啓動器官方github庫
這三者的關係能夠參考這裏
官方實例git

另,如下是一些資源:
筆者整理的mirai-console插件kotlin版實例
筆者備份的mirai啓動器github

1.準備

i. 配置java環境

下載mcl所須要的是>=1.8版本的openjdk,openjdk15下載地址,下載教程參考搜索引擎web

最好用openjdk而不是甲骨文(Oracle)的jdk,緣由json

ii. 配置IDE

推薦IDEA吧,其餘的也能夠,主要是IDEA挺好用的
能夠選擇安裝的官方插件:
Mirai Console IntelliJ 提供錯誤檢查等功能
Kotlin Jvm Blocking Bridge 幫助 Java 用戶調用 Kotlin suspend 函數
詳細參考官方文檔緩存

iii. 下載mirai-console-loader(mcl)做爲啓動器

官方地址
教程同見官方說明框架

可能的報錯:jvm

2.建立mirai-console插件項目

i. 下載

使用插件建立的是舊版的框架,mcl和mirai現已不支持舊版框架maven

官方實例或者筆者整理的mirai-console插件kotlin版實例中下載最新版的框架到本地,而後用IDE打開文件夾,而後gradle依賴在下載裏面都寫清楚了ide

ii. 個性化項目

  • src/main/resources/plugin.yml裏改插件信息和入口點
  • settings.gradle.kts裏改生成的插件.jar名稱
  • RunMiraikt這個配置能夠在ide裏運行,不用複製到mcl或其餘啓動器
  • buildPlugin這個任務能夠生成.jar插件
  • src/main/kotlin/PluginMain主類內也能夠修改插件信息

3. 部分文件結構解析

插件實例代碼
mirai-example-kotlin

│  build.gradle.kts gradle依賴列表
│  settings.gradle.kts gradle設置
│
├─.gradle gradle緩存目錄
├─.idea idea項目配置緩存位置
├─.run
│      RunMiraiKt.run.xml IDE中運行任務配置,即RunMiraiKt源文件
│
├─gradle grdle文件
│
├─run RunMiraiKt默認運行目錄
│
└─src
    ├─main
    │  ├─kotlin
    │  │      PluginMain.kt 插件主類
    │  │
    │  └─resources
    │      │  plugin.yml 插件信息配置
    │
    └─test
        └─kotlin
                RunMirai.kt RunMiraiKt任務配置

4.插件代碼解析

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::class,
            EmptyCoroutineContext,
            Listener.ConcurrencyKind.CONCURRENT
        ) {
            //羣消息
            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::class,
            EmptyCoroutineContext,
            Listener.ConcurrencyKind.CONCURRENT
        ) {
            //好友信息
        }
        globalEventChannel().subscribeAlways(
            NewFriendRequestEvent::class,
            EmptyCoroutineContext,
            Listener.ConcurrencyKind.CONCURRENT
        ) {
            //自動贊成好友申請
            accept()
        }
        globalEventChannel().subscribeAlways(
            BotInvitedJoinGroupRequestEvent::class,
            EmptyCoroutineContext,
            Listener.ConcurrencyKind.CONCURRENT
        ) {
            //自動贊成加羣申請
            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.utils.info
import net.mamoe.mirai.message.data.Image
import net.mamoe.mirai.message.data.PlainText
import kotlin.coroutines.EmptyCoroutineContext

/* 在src/main/resources/plugin.yml裏改插件信息和入口點 在settings.gradle.kts裏改生成的插件.jar名稱 用runmiraikt這個配置能夠在ide裏運行,不用複製到mcl或其餘啓動器 */

object PluginMain : KotlinPlugin(
    JvmPluginDescription(
        id = "org.example.mirai-example",
        version = "0.1.0"
    )
) {
    override fun onEnable() {
        logger.info { "Plugin loaded" }
        //配置文件目錄 "${dataFolder.absolutePath}/"

        globalEventChannel().subscribeAlways(
            GroupMessageEvent::class,
            EmptyCoroutineContext,
            Listener.ConcurrencyKind.CONCURRENT
        ) {
            //羣消息
            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::class,
            EmptyCoroutineContext,
            Listener.ConcurrencyKind.CONCURRENT
        ) {
            //好友信息
        }
        globalEventChannel().subscribeAlways(
            NewFriendRequestEvent::class,
            EmptyCoroutineContext,
            Listener.ConcurrencyKind.CONCURRENT
        ) {
            //自動贊成好友申請
            accept()
        }
        globalEventChannel().subscribeAlways(
            BotInvitedJoinGroupRequestEvent::class,
            EmptyCoroutineContext,
            Listener.ConcurrencyKind.CONCURRENT
        ) {
            //自動贊成加羣申請
            accept()
        }
    }
}

vi. gradle部分代碼

plugins {
    val kotlinVersion = "1.4.21"
    kotlin("jvm") version kotlinVersion
    kotlin("plugin.serialization") version kotlinVersion
    id("net.mamoe.mirai-console") version "2.0-M2"
}

group = "org.example"
version = "0.1.0"

repositories {
        //國內鏡像源
    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/kotlin/kotlin-eap")}
    mavenLocal()
    mavenCentral()
    jcenter()
    maven("https://dl.bintray.com/kotlin/kotlin-eap")
}
dependencies{
    implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.4.21")
}

其中2.0-M2是目前最新開發版本,請自行經過官方文檔選擇版本

5. 在IDE內運行

i. 更改MiraiRunKt配置

/src/test/kotlin/RunMirai.kt中的qq號和密碼改爲你的
若是在根目錄下沒有run文件夾,則可能報錯,新建一個就行了

ii.運行MiraiRunKt任務

若是任務報錯先配置任務
runmiraikt
而後配置登陸配置
step

6. 生成插件並運行

i. 生成插件

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

ii.在mcl中運行

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

有什麼評論區問,之後再補充
相關qq羣 1044565129

-END-
相關文章
相關標籤/搜索