Mirai_MyQQBot
最开始是moectf2020
的时候,群里面一堆师傅们的机器人,玩的不亦乐乎……然后印象最为深刻的是Frank
的cyan
:
群成员:笑死
cyan:根本笑不死
……血压,,噌的就上来了
还有•ᴗ•Rx.Shell
的恰啥
然后比赛也需要一个bot
,所以我就趁假期玩一玩。(才不是因为noah
弄了一个可以看色图呢!
Mirai框架介绍
项目地址:mamoe/mirai: 高效率 QQ 机器人支持库 (github.com)
社区地址:Mirai社区
鉴于在官方项目的README.md里面,有这么一句话:
鉴于项目的特殊性,开发团队可能在任何时间停止更新或删除项目。
所以,,,建议先fork
一份……
安装与登录
建议安装纯命令行的Mirai Console
# 以debian为例
cd ~
sudo apt search openjdk #查看可安装版本
sudo apt install openjdk-14-jdk #安装openjdk
java --version #检查是否正确Java安装
# 在https://github.com/iTXTech/mirai-console-loader/releases下载最新的mcl.zip
unzip mcl.zip
cd mcl
./mcl
如果显示的只有白色和绿色,并且最后看到mirai-console started successfully
,证明安装好了。
如果出现红色,并且没有mirai-console started successfully
,那么在项目的Issues
里面搜索红色的报错信息。
输入?来查看它的基础命令
此时在mcl
的目录下就会出现:
- config :mcl和插件的配置文件
- data:mcl和插件的数据文件
- libs:mcl和插件的库文件
- plugins:mcl插件的jar包
- scripts:相关的一些脚本
此时,尝试登录一下的QQ
(建议使用小号
login QQnum QQpasswd
如果看到Login successful
,就证明你登陆成功了。
如果出现需要验证之类的,不要搜他的官方解决方案(我尝试了,要么过于复杂,要么不大靠谱,所以我们可以将整个文件夹打包,放到windows
电脑上,现在电脑上登录一下你的QQ
,然后再在预装好openjdk
的windows
电脑上运行./mcl
然后login
,这个时候就应该是成功了的,再将整个文件夹打包,放回服务器上,再执行./mcl
并login
应该就成功了。
然后设置自动登录:
/autoLogin add QQnum QQpasswd
就不需要每一次都输入QQ
账号和密码
插件使用
Mirai只是一个框架,实际上实现各种花里胡哨的功能基本上靠插件和自己编程。
安装插件的方法:在插件的项目release里面下载最新的*.jar并放于./plugin/文件下,然后重启mcl,就会自动加载。
请勿使用官方给出的命令进行安装:./mcl --update-package net.mamoe:mirai-api-http --type plugin --channel stable
由于插件源更新很不及时,所以版本比较老,容易出现各种问题,所以还是去项目地址的release下载
- mirai-api-http:提供http支持,允许使用其他编程语言的插件
安装好了以后建议将mcl/config/net.mamoe.mirai-api-http中的setting.yml修改为:
## 配置文件详细内容参考 https://github.com/project-mirai/mirai-api-http
adapters:
- http
- ws
debug: false
enableVerify: false
verifyKey: fuck
singleMode: false
cacheSize: 4096
adapterSettings:
## 详情看 http adapter 使用说明 配置
http:
host: localhost
port: 8080
cors: [*]
## 详情看 websocket adapter 使用说明 配置
ws:
host: localhost
port: 8080
reservedSyncId: -1
-
chat-command: 将聊天环境中的以/开头的消息视为指令并执行
安装好了以后先执行:
permission permit * net.mamoe.mirai.console.chat-command:*
然后下来要对你的QQ号(们)进行权限管理:
PermissionCommand
下文中
<A|B>
表示可以是 A 或 B。[ ]
表示一个必须的参数,[ ]?
表示一个可选的参数。主指令:
/<permission|perm|权限>
次指令:
指令 描述 /<permission\|perm\|权限> <permit\|grant\|add> [target] [permission]
授权一个权限 /<permission\|perm\|权限> <cancel\|deny\|remove> [target] [permission]
撤销一个权限 /<permission\|perm\|权限> <cancelAll\|denyAll\|removeAll> [target] [permission]
撤销一个权限及其所有子权限 /<permission\|perm\|权限> <permittedPermissions\|pp\|grantedPermissions\|gp> [target] [all]
查看被授权权限列表 /<permission\|perm\|权限> <listPermissions\|lp>
查看所有权限列表
[target]
和[permission]
示例
[target]
是 被许可人 ID,可以查看表示方法 。
[permission]
是 权限 ID。每个指令都拥有一个权限 ID。请使用/perm list
查看权限 ID 列表。示例:
/perm permit u123456 console:command.stop
授予一个用户执行所有指令的权限
示例:
/perm permit u123456 *:*
允许用户 123456 执行任意指令/perm permit u123456 console:*
允许用户 123456 执行任意 Console 内置指令/perm permit u123456 org.example.my-plugin:*
允许用户 123456 执行插件org.example.my-plugin
的任意指令授予所有用户执行某个指令的权限
示例:
/perm permit u* console:command.help
允许所有用户执行console:command.help
(即/help
)/perm permit u* console:*
允许所有用户执行任意 Console 内置指令/perm permit u* org.example.my-plugin:*
允许所有用户执行插件org.example.my-plugin
的任意指令
社区里面还有很多很有意思的插件,可以参照插件的说明正确食用插件……
插件开发
由于MCL
本身使用kotlin
和Java
开发的,因此他的插件基本上都是用Java
和kotlin
进行开发。由于本菜鸡Java
很菜,kotlin
不会……
但是刚才安装的mirai-api-http
插件提供了http
服务,因此可以利用其他语言进行插件开发。这里我使用python
的YiriMirai库对MCL
进行插件开发。
我先看上
yirimirai
库,,,然后又看到了miraicle,瞬间觉得这个比yiri
好一点……结果点开一看,全nm是TODO
……(但是最后还是用的miraicle
/狗头
官方给的教程已经很赞了,,,看这个我觉得就足够了……
CTFD平台bot播报
好了,回归初心~在玩了两周色图后,终于想起来了,Rx会长sama最早是让我搭建一个播报bot的……
咳咳,言归正传……
我们知道miraicle
和mirai
通信是通过mirai
的mirai-api-http插件,当我们执行
bot.run()
的时候,python
相当于是和mirai
的mirai-api-http插件建立了一个session
,我们可以打印出这个session
的session_key
,那我们就可以伪造我们是python
,然后和mirai
的mirai-api-http插件建立通信,发送信息啦~
我们通过看miraicle
的源码,然后找到通信的关键代码,然后移植到CTFD
的源码里面就ok
啦~
后续
这两天在使用我的bot的时候,遇到了很多问题……最突出的就是插件管理、权限管理两个问题。鉴于a3师傅的建议和
在计算机领域,没有什么问题不是加一个中间层不能解决的,如果有,那就加两层。 ——《程序员的自我修养》
我打算更换一个框架(但是底框架还是mirai),在用户和mirai之间加一个“中间层”来解决目前我遇到的各种问题。
……待续
我人麻了,,,找到了几个高一点的框架,但是社区做的感觉不是很满意……就想着自己做一个中间层,接受数据包,提前做出筛选……但是我整了一下午,找到了通信的端口,wireshark
抓了包……但是解析不出数据就很难受……等我水平再高一点再说自己写中间层吧/卑微