Mirai框架qq机器人教程 新版
阅读原文时间:2021年09月09日阅读:1

Mirai框架qq机器人教程 新版

前言

本教程实为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插件kotlin版实例
笔者备份的mirai启动器

1.准备

下载mcl所需要的是>=1.8版本的openjdk,openjdk15下载地址,下载教程参考搜索引擎

最好用openjdk而不是甲骨文(Oracle)的jdk,原因

推荐IDEA吧,其他的也可以,主要是IDEA挺好用的
可以选择安装的官方插件:
Mirai Console IntelliJ 提供错误检查等功能
Kotlin Jvm Blocking Bridge 帮助 Java 用户调用 Kotlin suspend 函数
详细参考官方文档

官方地址
教程同见官方说明

可能的报错:

  • java.lang.NoSuchMethodError: net.mamoe.mirai.utils.MiraiLogger$Companion.setDefaultLoggerCreator(Lkotlin/jvm/functions/Function1;)V
    把你的config.json换成解决方法里面的
  • 环境异常

2.创建mirai-console插件项目

使用插件创建的是旧版的框架,mcl和mirai现已不支持旧版框架

官方实例或者笔者整理的mirai-console插件kotlin版实例中下载最新版的框架到本地,然后用IDE打开文件夹,然后gradle依赖在下载里面都写清楚了

  • 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.插件代码解析

//插件信息
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

监听和事件参考官方文档

object PluginMain : KotlinPlugin(
    JvmPluginDescription(
        id = "org.example.mirai-example",
        version = "0.1.0"
    )
) {
}

其中,kotlinPlugin指继承plugin父类,JvmPluginDescription指声明插件消息和版本

override fun onEnable() {
//或logger.info("xxx")
    logger.info { "Plugin loaded" }
}

用kotlin关键字override实现插件启用函数,然后用logger.info()进行日志输出,其中loggerkotlinPlugin类内成员,除了.info()还有.warning()输出警告和.error()输出报错

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()
        }

这些代码是笔者整理的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()
        }
    }
}



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内运行

/src/test/kotlin/RunMirai.kt中的qq号和密码改成你的
如果在根目录下没有run文件夹,则可能报错,新建一个就好了

如果任务报错先配置任务

然后配置登录配置

6. 生成插件并运行

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

把这个.jar文件放到mcl的plugin文件夹下,然后用cmd或者直接打开mcl.cmd运行

有什么评论区问,以后再补充
相关qq群 1044565129

-END-

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章