Skip to content

Commit e139079

Browse files
committed
fix(群分析): 解决在 NTQQ 内核尝试上传图片并将其推送到腾讯服务器时,超过了预设的时间限制(通常是 120 毫秒或更久),导致连接断开。的 aiocqhttp.exceptions.ActionFailed 问题
如果手动命令 /群分析 发送图片失败(例如遇到你之前遇到的 Timeout 超时错误),插件现在会捕获此错误,而不会直接崩溃或无响应。自动触发重试 (Automatic Retry)一旦捕获到发送失败的错误,系统会立即将该任务添加到 RetryManager(重试管理器)中。Base64 备选方案 (Base64 Fallback) RetryManager 会接管该任务,并改用我们刚刚实现的 Base64 方法重新发送图片。在原始 URL 方法失败的情况下,这种方式的成功率极高。
1 parent a0b0c3e commit e139079

File tree

1 file changed

+49
-1
lines changed

1 file changed

+49
-1
lines changed

main.py

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,55 @@ async def analyze_group_daily(
203203
analysis_result, group_id, self.html_render
204204
)
205205
if image_url:
206-
yield event.image_result(image_url)
206+
# 尝试直接发送图片,而不是 yield result,以便捕获发送过程中的超时错误
207+
try:
208+
logger.info(f"正在尝试发送图片报告: {image_url}")
209+
210+
# 构建消息链
211+
message_chain = [{"type": "image", "data": {"file": image_url}}]
212+
213+
# 尝试通过 standardized API 发送
214+
if hasattr(bot_instance, "api") and hasattr(
215+
bot_instance.api, "call_action"
216+
):
217+
await bot_instance.api.call_action(
218+
"send_group_msg",
219+
group_id=int(group_id),
220+
message=message_chain,
221+
)
222+
# 尝试通过 AstrBot 抽象接口发送
223+
elif hasattr(bot_instance, "send_msg"):
224+
await bot_instance.send_msg(image_url, group_id=group_id)
225+
else:
226+
# 无法手动发送,回退到 yield
227+
yield event.image_result(image_url)
228+
return
229+
230+
# 发送成功,不做额外操作
231+
logger.info(f"图片报告发送成功: {group_id}")
232+
233+
except Exception as send_err:
234+
logger.error(f"图片报告发送失败 (可能是网络超时): {send_err}")
235+
236+
# 发送失败,加入重试队列
237+
if html_content:
238+
yield event.plain_result(
239+
"[AstrBot QQ群日常分析总结插件] ⚠️ 图片报告发送超时,已加入重试队列(将尝试Base64编码发送)。"
240+
)
241+
# 获取 platform_id
242+
platform_id = (
243+
await self.auto_scheduler.get_platform_id_for_group(
244+
group_id
245+
)
246+
)
247+
await self.retry_manager.add_task(
248+
html_content, analysis_result, group_id, platform_id
249+
)
250+
else:
251+
yield event.plain_result(
252+
f"❌ 图片发送失败: {send_err},且无法进行重试(无HTML内容)。"
253+
)
254+
207255
elif html_content:
208256
# 生成失败但有HTML,加入重试队列
209257
logger.warning("图片报告生成失败,加入重试队列")

0 commit comments

Comments
 (0)