概述

nonebot-adapter-mirai2 是一个用于为 nonebot2 提供 mirai-api-http 协议兼容功能的协议适配器。

mirai-api-http 是无头 Bot 客户端 mirai 的一个基于 httpapi 协议。在你使用这一协议之前>你可能需要对 http 协议有一定的了解。

相关链接

说明

该项目依赖 nonebot2 而存在, 因此使用之前必须先安装 nonebot2

安装

我们推荐您在虚拟环境中使用, 这样可以防止干扰您的其他 python 项目的正常运行

python -m venv venv  # 创建一个虚拟环境
source venv/bin/activate  # win 请在 PowerShell 或 cmd 使用 venv/bin/activate.ps1 或 venv/bin/activate.bat  # 进入虚拟环境
pip install nb-cli  # 安装 nonebot2 脚手架(推荐)
# 当然你也可以不使用脚手架 → pip install nonebot2
nb create  # 使用 nb-cli 创建一个最原始的 bot
nb adapter install mirai2  # 仅在上一条指令创建 bot 时没有选中 mirai2 的情况下才需要

# 退出虚拟环境请使用 deactivate

配置 .env

ENVIRONMENT=dev
VERIFY_KEY=QDTTEGYGfOGBVcX  # MiraiApiHttp2 配置文件里的 token
driver=~fastapi+~websockets  # nonebot_adapter_mirai2 需要使用 websockets 驱动所以需要加该行

MIRAI_HOST=127.0.0.1  # MiraiApiHttp2 的 ip
MIRAI_PORT=5700  # MiraiApiHttp2 的端口
MIRAI_QQ=["1234567890"]  # Mirai 上已经登录的 qq 号
SUPERUSER=[]  # nonebot2 的超管(也可理解为bot的主人什么的)

使用

需先启动 mirai 并登录 bot 账号,因为使用的是正向 ws

bot.py 中的内容

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import nonebot
from nonebot.adapters.mirai2 import Adapter as MIRAI2Adapter  # 引用 nonebot_adapter_mirai2

nonebot.init()
app = nonebot.get_asgi()

driver = nonebot.get_driver()
driver.register_adapter(MIRAI2Adapter)  # 将其塞入 nonebot2 中

nonebot.load_from_toml("pyproject.toml")

if __name__ == "__main__":
    nonebot.logger.warning("Always use `nb run` to start the bot instead of manually running!")
    nonebot.run(app="__mp_main__:app")

注意

  • nonebot2.0.0b1adapter 相关 api 存在变化,因此该 adapter 很可能不兼容早于 nonebot2.0.0b1 的版本号。
  • nonebot_adapter_mirai2 使用的是正向 ws, 因此需要用户首先启动 mirai 并已登录 bot 账号, 然后再启动 nonebot2
  • 如果想 Pull requests 请往 dev 分支中提交 pr,我将在后续更新时合并到 main

miraiws 配置范例

adapters: 
  - ws
debug: false
enableVerify: true
verifyKey: INITKEYGfCYBVcX
singleMode: false
cacheSize: 2048
adapterSettings:
  ws:
    host: localhost
    port: 5700 # 该端口务必不要和 nonebot2 相冲突, 因为 nonebot2 会默认监听 8080 端口。
               # 如果 mirai 侧也监听 8080 端口则会导致其中一方的 web 服务启动失败

群消息

from nonebot import on_message
from nonebot.adapters.mirai2 import Bot, GroupMessage, MessageSegment


msging = on_message()

@msging.handle()
async def _(bot: Bot, event: GroupMessage):
	...
	await msging.send(MessageSegment.plan("xxx"))

好友消息

from nonebot.adapters.mirai2 import FriendMessage, MessageSegment


msg = on_message()

@msg.handle()
async def _(bot: Bot, event: FriendMessage):
	...

几乎所有类型的事件处理器都可以在 `nonebot.adapters.mirai2.event.* 中导入。

范例

from nonebot import on_notice
from nonebot.adapters.mirai2.event import BotUnmuteEvent


notice = on_notice()
async def _(bot: Bot, event: BotUnmuteEvent)
	...