149 lines
4.0 KiB
Python
149 lines
4.0 KiB
Python
"""消息发送模块 - 负责向 QQ 群发送消息"""
|
||
from typing import Optional
|
||
from nonebot import get_bots
|
||
from nonebot.adapters.onebot.v11 import Bot, Message, MessageSegment
|
||
|
||
|
||
class MessageSender:
|
||
"""消息发送器"""
|
||
|
||
def __init__(self):
|
||
"""初始化消息发送器"""
|
||
self.bot: Optional[Bot] = None
|
||
|
||
def set_bot(self, bot: Bot):
|
||
"""
|
||
设置 Bot 实例
|
||
|
||
Args:
|
||
bot: OneBot V11 Bot 实例
|
||
"""
|
||
self.bot = bot
|
||
|
||
def get_bot(self) -> Optional[Bot]:
|
||
"""
|
||
获取 Bot 实例
|
||
|
||
Returns:
|
||
Bot 实例,如果未设置则尝试从全局获取
|
||
"""
|
||
if self.bot:
|
||
return self.bot
|
||
|
||
# 尝试从全局获取 Bot
|
||
try:
|
||
bots = get_bots()
|
||
if bots:
|
||
bot = list(bots.values())[0]
|
||
self.bot = bot
|
||
return bot
|
||
except Exception:
|
||
pass
|
||
|
||
return None
|
||
|
||
async def send_to_group(
|
||
self,
|
||
group_id: int,
|
||
qq: int,
|
||
image_base64: str
|
||
) -> dict:
|
||
"""
|
||
向指定群发送消息(@用户 + 图片)
|
||
|
||
Args:
|
||
group_id: 群号
|
||
qq: 要 @ 的 QQ 号
|
||
image_base64: 图片的 base64 编码(格式:base64://...)
|
||
|
||
Returns:
|
||
发送结果字典
|
||
|
||
Raises:
|
||
ValueError: Bot 未设置
|
||
Exception: 发送失败
|
||
"""
|
||
bot = self.get_bot()
|
||
if not bot:
|
||
raise ValueError("Bot 实例未设置,无法发送消息")
|
||
|
||
try:
|
||
# 构造消息:@用户 + 图片
|
||
message = Message()
|
||
message.append(MessageSegment.at(qq))
|
||
message.append(MessageSegment.image(image_base64))
|
||
|
||
# 发送群消息,添加 __qqpush_source 标记供 auto_recall 识别
|
||
result = await bot.call_api(
|
||
"send_group_msg",
|
||
group_id=group_id,
|
||
message=message,
|
||
__qqpush_source="danding_qqpush" # 添加标记
|
||
)
|
||
|
||
return {
|
||
"success": True,
|
||
"data": result,
|
||
"message": "消息发送成功"
|
||
}
|
||
|
||
except Exception as e:
|
||
# 捕获异常并返回错误信息
|
||
return {
|
||
"success": False,
|
||
"error": str(e),
|
||
"message": f"消息发送失败: {str(e)}"
|
||
}
|
||
|
||
async def send_text_to_group(
|
||
self,
|
||
group_id: int,
|
||
qq: int,
|
||
text: str
|
||
) -> dict:
|
||
"""
|
||
向指定群发送纯文本消息(@用户 + 文本)
|
||
|
||
Args:
|
||
group_id: 群号
|
||
qq: 要 @ 的 QQ 号
|
||
text: 文本内容
|
||
|
||
Returns:
|
||
发送结果字典
|
||
"""
|
||
bot = self.get_bot()
|
||
if not bot:
|
||
raise ValueError("Bot 实例未设置,无法发送消息")
|
||
|
||
try:
|
||
# 构造消息:@用户 + 文本
|
||
message = Message()
|
||
message.append(MessageSegment.at(qq))
|
||
message.append(MessageSegment.text(text))
|
||
|
||
# 发送群消息,添加 __qqpush_source 标记供 auto_recall 识别
|
||
result = await bot.call_api(
|
||
"send_group_msg",
|
||
group_id=group_id,
|
||
message=message,
|
||
__qqpush_source="danding_qqpush" # 添加标记
|
||
)
|
||
|
||
return {
|
||
"success": True,
|
||
"data": result,
|
||
"message": "消息发送成功"
|
||
}
|
||
|
||
except Exception as e:
|
||
return {
|
||
"success": False,
|
||
"error": str(e),
|
||
"message": f"消息发送失败: {str(e)}"
|
||
}
|
||
|
||
|
||
# 全局消息发送器实例
|
||
sender = MessageSender()
|