menu DizzyK
配置Mirai以及开发DizzyBot的历程
61 浏览 | 2021-01-22 | 分类:简单的开发 | 标签:

配置Mirai以及开发DizzyBot的历程

DizzyK
DizzyBot

一直比较感兴趣QQ机器人,终于腾出时间来研究一下这个了

Mirai配置

Mirai是什么

Mirai是一个在全平台下运行,提供 QQ Android 协议支持的高效率机器人库

配置环境

  1. java

    1. 要求:下载安装openjdk(版本>=11)并配置环境

    2. 操作(萌新极速版)

      1. Linux
       wget https://download.java.net/java/GA/jdk13/5b8a42f3905b406298b72d750b6919f6/33/GPL/openjdk-13_linux-x64_bin.tar.gz
       mkdir /usr/local/jdk
       tar -zxf  openjdk-13_linux-x64_bin.tar.gz -C /usr/local/jdk
       echo "JAVA_HOME=/usr/local/jdk/jdk-13" | sudo tee -a ~/.zshrc
       echo "export JAVA_HOME" | sudo tee -a ~/.zshrc
       echo "PATH=$PATH:$JAVA_HOME/bin" | sudo tee -a ~/.zshrc
       echo "export PATH" | sudo tee -a ~/.zshrc
       source ~/.zshrc
      1. Windows
        1. 下载传送门
        2. 将下载好的.zip文件解压到指定的安装目录,例如,安装到C:\Program Files\Java下,在Java文件夹下新建JDK13文件夹,将文件解压到JDK13文件夹下,如果下载的是exe文件,就选择安装目录为新建好的那个JDK13文件夹下。
        3. 配置JAVA_HOME
        4. 配置Path环境变量
      2. 验证是否安装成功:在terminal/cmd/linux上输入java -version
  2. python

    1. 要求下载安装python3.7以上(需要支持@contextlib.asynccontextmanager特性)
    2. 操作过于简单,在此不赘述

安装&&配置(萌新极速版)

  1. 下载mirai-console-loader(mcl)的releases并解压
  2. Terminal上直接运行./mcl,linux上建议读取mcl文件后手动启动export JAVA_BINARY=java, $JAVA_BINARY -jar mcl.jar $*/stop停止项目(这项操作用来初始化mcl)
  3. 下载mirai-api-http并放到.../mcl-x.x.x\plugins文件夹下
  4. 配置mirai-api-http,将...\mcl-x.x.x\config\net.mamoe.mirai-api-http文件夹下的setting.yml文件打开,直接设置对应项找到authKey后面会用到
  5. 再次运行./mcl就可以/login开始使用了

python-mirai安装配置

python-mirai作为Graia最原始的版本,选择python-mirai没选择Graia的原因也很简单:Graia的doc不适合小白,太过于笼统并且没有python-mirai那样一个一个接口的说明,具体情况也不用只听我一家所言,建议自行了解python-mirai文档, Graia文档

python-mirai安装

pip(3) install kuriyama

Demo

官方文档比较详细,这里只写一下最基本的用法示例以及文档内没有说明清楚的关键(个人认为)用法

最简单的demo

接收器

@app.receiver(想要监控的事件:str)

返回值一般常用的有[friend: Friend, ][member: Member, ]event: FriendMessage, message: MessageChain
简单讲一下比较重要的MessageChain消息链
直接上图


可以看出,MessageChain是一个比较特殊的数据类型,想要提取别人发出的消息(或者说是mirai接收到的消息),可以使用mirai内置的一种方法toString(),或者使用message.__root__获取更多关于消息的信息

接收器总全部功能一览

发送好友信息

@app.receiver("FriendMessage") #接收器,用于接收好友消息
async def event_gm(app: Mirai, friend: Friend, event: FriendMessage, message: MessageChain):
    await app.sendFriendMessage(friend, [
            Plain(text=你想发送的消息:str),
            Image.fromFileSystem(本地图片位置:str)
        ])

发送群消息

@app.receiver("GroupMessage") #接收器,用于接收群消息
async def event_gm(app: Mirai, member: Member, group: Group, event: GroupMessage, message: MessageChain):
    await app.sendGroupMessage(group, [
            Plain(text=你想发送的消息:str),
            Image.fromFileSystem(本地图片位置:str),
            At(target=你想要@的人的QQ号:int), 
            Image.fromFileSystem(本地图片位置:str)
        ])

撤回消息

撤回接收到的消息(必须有管理员权限)

@app.receiver("GroupMessage") #接收器,用于接收群消息
async def event_gm(app: Mirai, member: Member, group: Group, event: GroupMessage, message: MessageChain):
   await app.revokeMessage(
               message.__root__[0]
            )

直接使用mirai的功能大体如此,想实现别的功能基本上就是缝合了

瓶颈

想实现的功能没有完成,等以后修炼修炼再说吧,先在这记录下呐QAQ

  1. 使用schdule库写一个clock系统和教务处接口对接,完成课程表考试通报机器人
    1. 重新封装了schdule库,使其能够兼容异步操作
    2. 写了几个函数,基本能以接口的形式使mirai读取消息
      1. 自动读取用户输入并转化成闹钟
      2. 设置闹钟
      3. 删除闹钟
      4. 删除全部闹钟(对应sender)
      5. 查询已设置闹钟
    3. 未完成功能
      1. 使闹钟跑起来(bushi)
      2. 其实这个schdule库是能在设置完闹钟后就在跑了,但是并不能一直检测时间和schdule时间,即运行设置时的job函数
    4. 尝试过的解决方法
      1. 使用多线程库threading:失败,原因:app.run函数(mirai机器人主函数)只能在主线程运行
      2. 使用直接在mirai主函数使用while 1:schedule.run_pending():失败,原因:不能在主函数里使用死循环,这样会导致bot无法接收到新的消息
  2. 使用linux下screen工具使bot长时间在服务器上使用
    1. 使用screen工具开两个screen,一个跑着mirai,一个跑着bot
    2. 理论上这种方法是可行的啊,但在实际使用的过程中发现,在一段时间后bot会自己挂掉
    3. 尝试过的解决方法
      1. 在最后if __name__ == "__main__":app.run()部分改为if __name__ == "__main__":while 1 app.run():失败,猜测原因:应该是在app.run的时候就挂了,但没有直接卡掉,只是不再响应,也没有卡退,就很烦QWQ!

本项目学到的东西

  1. 第一次个人开发的小东西,虽然连框架都是别人的,但还是慢慢体会到了开发的乐趣所在
  2. 第一次在生产环境中使用asyncio和python装饰器
  3. 第一次尝试demo学习法和源码学习法,感觉还是比较有效的学习方式
  4. 综上,这个没有实现啥的项目是菜鸡DizzyK的第一次个人开发尝试,这里只是一个思路的记录和我自己的尝试,各位带佬不喜勿喷呐,更希望有思路解决我瓶颈的带佬直接留言或者私信我解决方案呐
知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议

发表评论

email
web

全部评论 (暂无评论)

info 还没有任何评论,你来说两句呐!