欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Mirai框架qq机器人教程 新版

程序员文章站 2022-07-09 23:12:44
Mirai框架qq机器人教程 新版前言资料列表1.准备i. 配置java环境ii. 配置IDEiii. 下载mirai-console-loader(mcl)作为启动器2.创建mirai-console插件项目i. 下载ii. 个性化项目3. 部分文件结构解析4.插件代码解析所以在以下代码中要引入的库i.构建主类ii.覆盖插件启用函数iii.监听事件IV. 全部代码V. gradle部分代码5. 在IDE内运行i. 更改MiraiRunKt配置ii.运行MiraiRunKt任务6. 生成插件并运行i. 生成...

前言

本教程实为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)作为启动器

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

可能的报错:

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

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任务

Mirai框架qq机器人教程 新版

6. 生成插件并运行

i. 生成插件

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

ii.在mcl中运行

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

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

-END-

本文地址:https://blog.csdn.net/qq_40832960/article/details/111830412

相关标签: qq机器人 mirai