抱歉,您的浏览器无法访问本站

本页面需要浏览器支持(启用)JavaScript


了解详情 >

BlackBird的博客

这世界上所有的不利状况,都是当事者能力不足导致的

Mirai_MyQQBot

最开始是moectf2020的时候,群里面一堆师傅们的机器人,玩的不亦乐乎……然后印象最为深刻的是Frankcyan

群成员:笑死

cyan:根本笑不死

……血压,,噌的就上来了

还有•ᴗ•Rx.Shell的恰啥

然后比赛也需要一个bot,所以我就趁假期玩一玩。(才不是因为noah弄了一个可以看色图呢!

Mirai框架介绍

项目地址:mamoe/mirai: 高效率 QQ 机器人支持库 (github.com)

社区地址:Mirai社区

MiraiForum

鉴于在官方项目的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,然后再在预装好openjdkwindows电脑上运行./mcl然后login,这个时候就应该是成功了的,再将整个文件夹打包,放回服务器上,再执行./mcllogin应该就成功了。

然后设置自动登录:

/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本身使用kotlinJava开发的,因此他的插件基本上都是用Javakotlin进行开发。由于本菜鸡Java很菜,kotlin不会……

但是刚才安装的mirai-api-http插件提供了http服务,因此可以利用其他语言进行插件开发。这里我使用pythonYiriMirai库对MCL进行插件开发。

我先看上yirimirai库,,,然后又看到了miraicle,瞬间觉得这个比yiri好一点……结果点开一看,全nm是TODO……(但是最后还是用的miraicle/狗头

官方给的教程已经很赞了,,,看这个我觉得就足够了……

CTFD平台bot播报

好了,回归初心~在玩了两周色图后,终于想起来了,Rx会长sama最早是让我搭建一个播报bot的……

咳咳,言归正传……

我们知道miraiclemirai通信是通过miraimirai-api-http插件,当我们执行

bot.run()

的时候,python相当于是和miraimirai-api-http插件建立了一个session,我们可以打印出这个sessionsession_key,那我们就可以伪造我们是python,然后和miraimirai-api-http插件建立通信,发送信息啦~

我们通过看miraicle的源码,然后找到通信的关键代码,然后移植到CTFD的源码里面就ok啦~

后续

这两天在使用我的bot的时候,遇到了很多问题……最突出的就是插件管理、权限管理两个问题。鉴于a3师傅的建议和

在计算机领域,没有什么问题不是加一个中间层不能解决的,如果有,那就加两层。 ——《程序员的自我修养》

我打算更换一个框架(但是底框架还是mirai),在用户和mirai之间加一个“中间层”来解决目前我遇到的各种问题。

……待续

我人麻了,,,找到了几个高一点的框架,但是社区做的感觉不是很满意……就想着自己做一个中间层,接受数据包,提前做出筛选……但是我整了一下午,找到了通信的端口,wireshark抓了包……但是解析不出数据就很难受……等我水平再高一点再说自己写中间层吧/卑微

评论