Mirai框架qq机器人教程 新版

Mirai框架qq机器人教程 新版

  • 前言
    • 资料列表
  • 1.准备
    • i. 配置java环境
    • ii. 配置IDE
    • iii. 下载mirai-console-loader(mcl)作为启动器
  • 2.创建mirai-console插件项目
    • i. 下载
    • ii. 个性化项目
  • 3. 部分文件结构解析
  • 4.插件代码解析
    • i.所有在以下代码中要引入的库
    • ii.构建主类
    • iii.覆盖插件启用函数
    • iv.监听事件
    • v. 全部代码
    • vi. gradle部分代码
  • 5. 在IDE内运行
    • i. 更改MiraiRunKt配置
    • ii.运行MiraiRunKt任务
  • 6. 生成插件并运行
    • 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-console插件kotlin版实例
笔者备份的mirai启动器

1.准备

i. 配置java环境

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

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

ii. 配置IDE

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

iii. 下载mirai-console-loader(mcl)作为启动器

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

可能的报错:

  • java.lang.NoSuchMethodError: net.mamoe.mirai.utils.MiraiLogger$Companion.setDefaultLoggerCreator(Lkotlin/jvm/functions/Function1;)V
    把你的config.json换成解决方法里面的
  • 环境异常
    1. 参考官方解决方案
    2. 把另外一个解决方案加到mcl
    3. 从这里手动生成config.json,放到mcl根目录下,参考官方

2.创建mirai-console插件项目

i. 下载

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

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

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

代码以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.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是目前最新开发版本,请自行通过官方文档选择版本并更改
Mirai框架qq机器人教程 新版_第1张图片

5. 在IDE内运行

i. 更改MiraiRunKt配置

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

ii.运行MiraiRunKt任务

如果任务报错先配置任务
Mirai框架qq机器人教程 新版_第2张图片
然后配置登录配置
Mirai框架qq机器人教程 新版_第3张图片

6. 生成插件并运行

i. 生成插件

用IDE中gradle的buldplugin任务可以在buid/mirai/下生成一个.jar插件文件
Mirai框架qq机器人教程 新版_第4张图片

ii.在mcl中运行

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

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

-END-

你可能感兴趣的:(qq机器人,mirai,qq机器人)