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-
相关文章
相关标签/搜索