Mirai框架qq机器人教程 新版
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.准备
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换成解决方法里面的环境异常
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()进行日志输出,其中logger是kotlinPlugin类内成员,除了.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任务
如果任务报错先配置任务

然后配置登录配置

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

ii.在mcl中运行
把这个.jar文件放到mcl的plugin文件夹下,然后用cmd或者直接打开mcl.cmd运行
有什么评论区问,以后再补充
相关qq群 1044565129
-END-
Mirai框架qq机器人教程 新版的更多相关文章
- Mirai框架qq机器人教程
Mirai框架qq机器人教程 0.前言 1. 安装Java 2.安装Mirai启动器 3.下载IDEA或其他编译器 4.创建mirai-console插件项目 4.1 通过git创建 4.2 通过插件 ...
- Python+mirai开发QQ机器人起步教程(2021.9.9测试有效)
参考:开发 mirai QQ机器人起步教程_叹之-CSDN博客_mirai python 本篇文章参考了以上博客,并对其中的失效内容和版本匹配问题进行了补充修改,实测能够成功运行.部分步骤的运行截图见 ...
- 使用 GO-CQHttp或mirai框架 搭建QQ的机器人
我的博客 Go-CQHttp搭建QQ机器人 官方文档在这-->ATRU官方文档 Go-CQHttp + Atri 使用Linux系统部署 需求 服务器一台/带有Linux的机器 Python环境 ...
- Mirai qq机器人 c++版sdk(即用c++写mirai)
Mirai机器人c++版 前言 类似教程 本文git,gitee地址 c++开发mirai 原理 大概流程 实现 如何使用 注意事项 常见错误 前言 改分支版本以及过时,暂时不再维护 请看最新版kot ...
- 体验 QQ机器人C# SDK 1.X 特性总结
主要特性 依赖注入 框架本身采用 Autofac 作为依赖注入框架.进行插件开发时,必然会使用到该框架.建议开发者阅读官方文档熟悉其用法.https://autofac.readthedocs.io/ ...
- 使用C# 开始第一个QQ机器人
本示例将会使用”嘤鹉学舌”这个小插件的实现来演示如何使用Newbe.Mahua实现第一个机器人插件. 插件功能 自动将发送者的消息回发给发送人,嘤鹉(Parrot,其实是说嘤嘤嘤怪)学舌. 开发环境要 ...
- NoneBot+酷Q,打造QQ机器人
NoneBot 是一个基于 酷Q 的 Python 异步 QQ 机器人框架,它会对 QQ 机器人收到的消息进行解析和处理,并以插件化的形式,分发给消息所对应的命令处理器和自然语言处理器,来完成具体的功 ...
- 第一讲 从头开始做一个web qq 机器人,第一步获取smart qq二维码
新手教程: 前言:最近在看了一下很久很久以前做的qq机器人失效了,最近也在换工作目前还在职,时间很挺宽裕的.就决定从新搞一个web qq机器人 PC的协议解析出来有点费时间以后再做. 准备工作: 编译 ...
- 基于WebQQ3.0协议写一个QQ机器人
最近公司需要做个qq机器人获取qq好友列表,并且能够自动向选定的qq好友定时发送消息.没有头绪,硬着头皮上 甘甜的心情瞬间变得苦涩了 哇 多捞吆 1.WEBQQ3.0登陆协议 进入WEBQQ, htt ...
随机推荐
- Scrum 冲刺 第四篇
Scrum 冲刺 第四篇 每日会议照片 昨天已完成工作 队员 昨日完成任务 黄梓浩 初步完成app项目架构搭建 黄清山 完成部分个人界面模块数据库的接口 邓富荣 完成部分后台首页模块数据库的接口 钟俊 ...
- Python术语对照表
>>> 交互式终端中默认的 Python 提示符.往往会显示于能以交互方式在解释器里执行的样例代码之前. ... 可以是指:交互式终端中输入特殊代码行时默认的 Python 提示符, ...
- APIO2020 交换城市
我是真的不稳定的垃圾选手. 对于一张图来说,两个人能满足题面关系等价于这张图不是链,很好证明,如果有度数 \(> 2\) 的点,让一个人跑到一个度数 \(= 1\) 的地方就可以了. 如果离线就 ...
- Samba:error nt_status_host_unreachable
安装Samba之后: smbclient -L server0.example.com 出现报错:error nt_status_host_unreachable 解决方法:server端把S ...
- Windows远程报错:由于没有远程桌面授权服务器可以提供许可证,远程会话被中断
故障原因:Windowsserver超过两人的远程连接是收费的,有120天免费试用期,超过这个时间再连接就会报错. 解决方法一: 进行续费 解决方法二: 1,在运行里运行 mstsc /v:ip ...
- 「 洛谷 」P4539 [SCOI2006]zh_tree
小兔的话 推荐 小兔的CSDN [SCOI2006]zh_tree 题目限制 内存限制:250.00MB 时间限制:1.00s 标准输入输出 题目知识点 思维 动态规划 \(dp\) 区间\(dp\) ...
- Clickhouse 在大数据分析平台 - 留存分析上的应用
导语 | 本文实践了对于千万级别的用户,操作总数达万级别,每日几十亿操作流水的留存分析工具秒级别查询的数据构建方案.同时,除了留存分析,对于用户群分析,事件分析等也可以尝试用此方案来解决. 文章作者: ...
- springmvc中使用文件上传功能
项目代码:https://github.com/PeiranZhang/springmvc-fileupload Servlet3.0之前使用文件上传功能 Servlet3.0之前需要使用common ...
- 拒绝造轮子!如何移植并使用Linux内核的通用链表(附完整代码实现)
在实际的工作中,我们可能会经常使用链表结构来存储数据,特别是嵌入式开发,经常会使用linux内核最经典的双向链表 list_head.本篇文章详细介绍了Linux内核的通用链表是如何实现的,对于经常使 ...
- react第五单元(事件系统-原生事件-react中的合成事件-详解事件的冒泡和捕获机制)
第五单元(事件系统-原生事件-react中的合成事件-详解事件的冒泡和捕获机制) 课程目标 深入理解和掌握事件的冒泡及捕获机制 理解react中的合成事件的本质 在react组件中合理的使用原生事件 ...