Home

Awesome

<div align="center">

logo征集中,假装有图片

Nonebot Plugin<br>Send Anything Anywhere

你只管业务实现,把发送交给我们 | 文档

GitHub Workflow Status codecov PyPI - Python Version PyPI GitHub

</div>

这个插件可以做什么

本插件通过传入 bot 的类型来自适应生成对应 bot adapter 所使用的 Message

安装

使用

在 handler 中回复消息的情况:

@matcher.handle()
async def handle(event: MessageEvent):
    # 直接调用 MessageFactory.send() 在 handler 中回复消息
    await MessageFactory("你好").send(reply=True, at_sender=True)
    await MessageFactory("需要回复的内容").send()
    await matcher.finish()

主动发送的情况:

from nonebot_plugin_saa import TargetQQGroup

# 发送目标为群号 114514 的群聊
target = TargetQQGroup(group_id=114514)
await MessageFactory("早上好").send_to(target)

从消息事件中提取发送目标:

from nonebot_plugin_saa import extract_target, get_target, SaaTarget

@matcher.handle()
async def handle(event: MessageEvent, bot: Bot):
    # 只有混入了 Specifier 的 PlatformTarget(例如 OpenID 版 QQ)需要传入 bot
    target = extract_target(event, bot)

@matcher.handle()
async def handle(target: SaaTarget):
    ...

发送目标的序列化与反序列化:

from nonebot_plugin_saa import PlatformTarget, TargetQQPrivate

target = TargetQQPrivate(user_id=112233)
serialized_target = target.json()
deserialized_target = PlatformTarget.deserialize(serialized_target)
assert deserialized_target == target

支持情况

✅:支持 ✖️:支持不了 🚧:等待适配

支持的 adapter

OneBot v11OneBot v12KaiheilaTelegramFeishuRedDoDoSatoriQQ 官方Discord

支持的消息类型

OneBot v11OneBot v12开黑啦TelegramFeishuRedDoDoSatoriQQ 官方Discord
文字
图片
提及
提及全体🚧🚧
回复🚧

[!NOTE] 提及全体在 Telegram 中不存在,在 DoDo 中只能接收,不能发送

支持的发送目标

OneBot v11OneBot v12KaiheilaTelegramFeishuRedDoDoSatoriQQ 官方Discord
QQ 群
QQ 私聊
QQ 频道子频道消息
QQ 频道私聊
开黑啦私聊/频道
Telegram 普通对话/频道✅(仅普通对话)
飞书私聊/群聊
DoDo 私聊/群聊
QQ OpenId 版私聊/群聊
Discord 频道

[!NOTE]

问题与例子

因为在现在的 Nonebot 插件开发中,消息的构建和发送是和 adapter 高度耦合的,这导致一个插件要适配不同的 adapter 是困难的

before:

from nonebot.adapters.onebot.v11.event import MessageEvent as V11MessageEvent
from nonebot.adapters.onebot.v11.message import MessageSegment as V11MessageSegment
from nonebot.adapters.onebot.v12.event import MessageEvent as V12MessageEvent
from nonebot.adapters.onebot.v12.message import MessageSegment as V12MessageSegment
from nonebot.adapters.onebot.v12.bot import Bot as V12Bot

pic_matcher = nonebot.on_command('发送图片')

@pic_matcher.handle()
async def _handle_v11(event: V11MessageEvent):
    pic_content = ...
    msg = V11MessageSegment.image(pic_content) + V11MessageSegment.text("这是你要的图片")
    await pic_matcher.finish(msg)

@pic_matcher.handle()
async def _handle_v12(bot: V12Bot, event: V12MessageEvent):
    pic_content = ...
    pic_file = await bot.upload_file(type='data', name='image', data=pic_content)
    msg = V12MessageSegment.image(pic_file['file_id']) + V12MessageSegment.text("这是你要的图片")
    await pic_matcher.finish(msg)

现在只需要:

from nonebot.adapters.onebot.v11.event import MessageEvent as V11MessageEvent
from nonebot.adapters.onebot.v12.event import MessageEvent as V12MessageEvent
from nonebot.internal.adapter.bot import Bot
from nonebot_plugin_saa import Image, Text, MessageFactory

pic_matcher = nonebot.on_command('发送图片')

@pic_matcher.handle()
async def _handle_v12(bot: Bot, event: Union[V12MessageEvent, V11MessageEvent]):
    pic_content = ...
    msg_builder = MessageFactory([
        Image(pic_content), Text("这是你要的图片")
    ])
    # or msg_builder = Image(pic_content) + Text("这是你要的图片")
    await msg_builder.send()
    await pic_matcher.finish()

类似项目

License

MIT