基于mirai
实现,运行在JVM
平台的机器人Orange-Milk
。mirai仓库地址
mirai 是一个在全平台下运行,提供 QQ 多种设备协议支持的高效率机器人库
懒得写,不写了
-
开发环境:
IntelliJ IDEA
越新越好 -
依赖环境:
序号 | 环境 |
---|---|
1 | Java 11+ |
2 | node.js (最新LTS即可) |
3 | npm |
- 在
/src/main/resources/
下新建空白文件application.yml
。或者在项目根目录下直接新建空白文件application.yml
。
如果你了解过SpringBoot
,也可以根据自己的了解放在其他合适的位置。 - 在这个文件中放入配置项目
# ====机器人账户配置====
bot:
# QQ号、密码
qq: 这里替换成机器人的QQ号
password: 这里替换成密码
# 机器人主人的账号(列表),若仅有一个则删去一个
# master的作用是当机器人启动之后,为主人发一条消息
# 并且用于测试的监听器只为主人绑定(当然你可以手动修改逻辑)
masters: #可选
- 主人1的QQ号
- 主人2的QQ号 #可选
# ====机器人应用配置====
botapp:
# help: "./helps" # 被注释时默认为./helps,存放帮助文本的目录
# cacheDir: 这里放置缓存目录,此行被注释的时候默认为工作目录下的app_cache文件夹
# 如果你想指定其他位置,请去掉上一行的注释,填入你想要的位置,一般不用改动
# ====媒体====
media:
sing: # 机器人唱歌功能所需的音频文件目录,此目录下或其子目录存放mp3,amr等格式的文件。详见下文
# path: # 此行被注释时默认为./sings,若无会在机器人运行时自动创建
music:
kugou: # 请将signatureGetter替换成酷狗signature签名生成文件的执行命令,如node /path/to/kugou.js
signatureGetter: "node 酷狗js文件" # 已为大家提供,在本仓库的/data/kugou.js。若不填,则无法使用酷狗搜歌
netease: # 请将apiurl替换为网易云API的地址。搭建教程:https://github.com/Binaryify/NeteaseCloudMusicApi
apiurl: "自己搭建的网易云API的URL地址" # 若不填,则无法使用网易云搜歌
# ====游戏====
game:
idiom: # 一、成语接龙
repo: "成语接龙成语库路径"
repoCharset: "GBK" # 这里是成语库的字符集,如果你采用本项目提供的5万成语库,请填写GBK。注释此行默认为GBK
本项目所需的配置项就这些了,对于其他的配置比如SpringBoot
的配置请参考SpringBoot
相关文章
自定义监听器,与mirai一致,请查阅 mirai-core文档
本项目中监听器均在listeners/
下
注意上文yml中的media.sing
,要求填入一个目录。下称“歌曲目录”
这个目录(或子目录)下应存放歌曲文件(Bot 只扫描 *.mp3
和*.amr
)
提示:机器人启动的时候会遍历这个文件夹及其子文件夹下的所有文件, 因此放进去的歌曲只要后缀名为
*.mp3
或*.amr
都可以被扫描到。 使用者可以放心地分层整理你的歌曲文件
★注意: 如果你只需要Bot发语音唱歌而不需要文案功能。则本小节中下方的内容可跳过。 您只需要根据上方的提示将歌曲文件放置好并配置好即可。
除此之外,如果你的歌曲想拥有文案功能,还需要两种配置文件:*.template
和*.json(或*.aps)
文件后缀 | 数量 | 要求位置 | 作用 |
---|---|---|---|
*.template |
只允许一个 若存在多个则只采用所找到的第一个 |
歌曲目录 根目录 | Bot发送文件时的模板, 储存一个 kotlin 格式化字符串 |
*.json (或 *.aps ) |
数量不限 最终Bot会自动解析所有文件 |
歌曲目录下 任意位置 | 储存歌曲的信息和文案,供Bot解析 |
本功能中
*.json
和*.aps
是同样的含义,推荐采用*.json
,因为多数编辑器会对*.json
会有语法高亮。而对于Bot来说这两钟后缀名的效果是一样的
文件示例一:(*.json
或*.aps
歌曲文案信息配置)
目前最外层json只需要一个"sings"字段,类型为列表,列表存歌曲信息
由于这个配置文件是不限数目和位置的,因此我建议您可以每类文件夹都放一个json。使文件夹变得有条理,易于管理和迭代。
{
"sings": [
{
"name": "歌曲名",
"file": ["歌曲.mp3"], // 表示这段配置对当前目录 ./歌曲.mp3 生效
"tag": "歌曲TAG",
"sg": "歌手",
"appreciation": "歌曲赏析(文案)"
},
{
"name": "鹿鸣呦呦",
"file": ["../鹿鸣呦呦.mp3", "../鹿鸣呦呦2.mp3"], // 支持多段音乐采用相同的后缀名
"tag": "新国风",
"sg": "锦零",
"appreciation": "1=G\n曾追夕阳的少年,三分醉意留心间。"
},
{
"name": "一人皓月",
"file": ["./path/锦零一人皓月.mp3"], // 同样是相对与当前配置文件的路径
"tag": "新国风",
"sg": "锦零",
"appreciation": "1=♭E\n我见一人如皓月,婉转风姿两袖间。"
}
]
}
文件示例二:(*.template
文案模板)
【%1$s】SG.%2$s
%3$s%
其中:
%1$s
会被解析成*.json
中的tag
(歌曲标签TAG)
%2$s
会被解析成*.json
中的sg
(歌手)
%3$s
会被解析成*.json
中的appreciation
(歌曲赏析(文案))
例如,如果这么写,则会解析成下边这个样子:
——————————————————
【新国风】SG.锦零1=♭E
我见一人如皓月,婉转风姿两袖间。
——————————————————警告:
*.template
文件不支持注释,所有内容都是模板的一部分
正确配置yml中的game.idiom
即可使用
game:
idiom:
repo: "成语接龙成语库路径"
repoCharset: "GBK" # 这里是成语库的字符集,如果你采用本项目提供的5万成语库,请填写GBK。注释此行默认为GBK
本项目为大家提供了一份包含近5万成语的库,格式为txt,会在Bot初始化的时候加载。(放心,经过优化了的,性能杠杠滴)
请在本仓库
data
文件夹下找idioms5w.txt
编码为GBK
本项目对传统机器人“指令”调用方式进行了拓展,MC风格指令。 支持可变参数,多类型传参。因此用户不必纠结死板的指令调用格式。 换句话说:用户不需要关注怎么调,只需要关注要调用啥。
我们来看几个例子:
如:酷狗音乐搜歌
对发送如下内容 均可正常识别和调用
序号 | 内容 | 备注 |
---|---|---|
1 | /kugou 迈兮 守城记 |
正常顺序 |
2 | 迈兮 守城记 /kugou |
乱序 |
3 | 功夫 /kugou 茶 封茗 囧菌 |
乱序 |
4 | 闻韶 音 社 /kugou 老 戏 院 |
多行+乱序 |
如:/diu指令
在机器人所在群发送如下内容 均可正常识别和调用
序号 | 内容 | 备注 |
---|---|---|
1 | /diu @橘子奶 |
diu 群友,支持At 消息和QQ号 |
2 | @橘子奶 /diu @小红 1234567890 |
同时diu 三位群友1234567890 会被解释成QQ号 |
那么我们想加入自己的MC风格指令怎么办呢,也很简单。
本项目已经为大家编写了一套Kotlin DSL
来完成这件事。
这个函数一共有5个重载,方便大家使用,请自行查阅源码中JavaDoc说明
// Kotlin
// 注意尖括号里的东西,此函数mcCommand,对应的是传入一个MessageEvent
@McCmd
val kgMusic = mcCommand<GroupMessageEvent> {
name = "kugou music" // 指令名字
prefix = listOf("/music", "/kgmus", "/kugou", "/kgmusic", "/kg", "/酷狗") //指令的触发方式
help = "用于酷狗音乐搜歌"
needArgs = true // 是否需要参数
onCall { // 指令触发时的动作,在里边写上指令的实现。方法同mirai
}
}
本部分为控制Bot行为,检查Bot状态的接口
接口地址 | /help/reload |
---|---|
请求方式 | GET |
返回格式 | text/html |
请求参数 | 是否必填 | 类型 | 描述 |
---|---|---|---|
name | 否 | String | 用于通知哪个帮助更新 默认为“main” |
其中name
参数的含义
name取值 | 含义 |
---|---|
"main" | 重新加载主帮助 |
"games" | 重新加载游戏列表帮助 |
接口地址 | /media/sing/appreciations |
---|---|
请求方式 | GET |
返回格式 | text/html |
无需请求参数