Package: nonebot-plugin-send-anything-anywhere
logo征集中，假装有图片Nonebot PluginSend Anything Anywhere你只管业务实现，把发送交给我们 |文档这个插件可以做什么为常见的消息类型提供抽象类，自适应转换成对应 adapter 的消息提供一套统一的，符合直觉的发送接口为复杂的消息提供易用的生成接口（规划中）本插件通过传入 bot 的类型来自适应生成对应 bot adapter 所使用的 Message安装使用 nb-cli 安装nb plugin install nonebot-plugin-send-anything-anywhere使用 poetry 安装poetry add nonebot-plugin-send-anything-anywhere使用 pip 安装pip install nonebot-plugin-send-anything-anywhere使用在 handler 中回复消息的情况：@matcher.handle()asyncdefhandle(event:MessageEvent):# 直接调用 MessageFactory.send() 在 handler 中回复消息awaitMessageFactory("你好").send(reply=True,at_sender=True)awaitMessageFactory("需要回复的内容").send()awaitmatcher.finish()主动发送的情况：fromnonebot_plugin_saaimportTargetQQGroup# 发送目标为群号 114514 的群聊target=TargetQQGroup(group_id=114514)awaitMessageFactory("早上好").send_to(target)从消息事件中提取发送目标:fromnonebot_plugin_saaimportextract_target,get_target,SaaTarget@matcher.handle()asyncdefhandle(event:MessageEvent,bot:Bot):# 只有混入了 Specifier 的 PlatformTarget（例如 OpenID 版 QQ）需要传入 bottarget=extract_target(event,bot)@matcher.handle()asyncdefhandle(target:SaaTarget):...发送目标的序列化与反序列化:fromnonebot_plugin_saaimportPlatformTarget,TargetQQPrivatetarget=TargetQQPrivate(user_id=112233)serialized_target=target.json()deserialized_target=PlatformTarget.deserialize(serialized_target)assertdeserialized_target==target支持情况✅:支持 ✖️:支持不了 🚧:等待适配支持的 adapterOneBot v11OneBot v12KaiheilaTelegramFeishuRedDoDo✅✅✅✅✅✅✅支持的消息类型OneBot v11OneBot v12开黑啦TelegramFeishuRedDoDo文字✅✅✅✅✅✅✅图片✅✅✅✅✅✅✅at✅✅✅✅✅✅✅回复✅✅✅✅✅🚧✅支持的发送目标OneBot v11OneBot v12KaiheilaTelegramFeishuRedDoDoQQ 群✅✅✅QQ 私聊✅✅✅QQ 频道子频道消息✅QQ 频道私聊✅开黑啦私聊/频道✅Telegram 普通对话/频道✅飞书私聊/群聊✅DoDo 私聊/群聊✅注：对于使用 Onebot v12，但是没有专门适配的发送目标，使用了 TargetOB12Unknow 来保证其可以正常使用问题与例子因为在现在的 Nonebot 插件开发中，消息的构建和发送是和 adapter 高度耦合的，这导致一个插件要适配不同的 adapter 是困难的before:fromnonebot.adapters.onebot.v11.eventimportMessageEventasV11MessageEventfromnonebot.adapters.onebot.v11.messageimportMessageSegmentasV11MessageSegmentfromnonebot.adapters.onebot.v12.eventimportMessageEventasV12MessageEventfromnonebot.adapters.onebot.v12.messageimportMessageSegmentasV12MessageSegmentfromnonebot.adapters.onebot.v12.botimportBotasV12Botpic_matcher=nonebot.on_command('发送图片')@pic_matcher.handle()asyncdef_handle_v11(event:V11MessageEvent):pic_content=...msg=V11MessageSegment.image(pic_content)+V11MessageSegment.text("这是你要的图片")awaitpic_matcher.finish(msg)@pic_matcher.handle()asyncdef_handle_v12(bot:V12Bot,event:V12MessageEvent):pic_content=...pic_file=awaitbot.upload_file(type='data',name='image',data=pic_content)msg=V12MessageSegment.image(pic_file['file_id'])+V12MessageSegment.text("这是你要的图片")awaitpic_matcher.finish(msg)现在只需要:fromnonebot.adapters.onebot.v11.eventimportMessageEventasV11MessageEventfromnonebot.adapters.onebot.v12.eventimportMessageEventasV12MessageEventfromnonebot.internal.adapter.botimportBotfromnonebot_plugin_saaimportImage,Text,MessageFactorypic_matcher=nonebot.on_command('发送图片')@pic_matcher.handle()asyncdef_handle_v12(bot:Bot,event:Union[V12MessageEvent,V11MessageEvent]):pic_content=...msg_builder=MessageFactory([Image(pic_content),Text("这是你要的图片")])# or msg_builder = Image(pic_content) + Text("这是你要的图片")awaitmsg_builder.send()awaitpic_matcher.finish()类似项目nonebot-plugin-all4one解决了类似的问题，但是用了不同路径nonebot-plugin-params通过 Rule 定制订阅的平台，与本插件联合使用也许会有奇效LicenseMIT