From d1d438f9a73af18a029b3ff9d82dbd608534a7a7 Mon Sep 17 00:00:00 2001 From: wcqqq1214 Date: Fri, 21 Aug 2026 18:57:13 +0800 Subject: [PATCH] fix: upload loopback image URLs as Discord attachments (#9756) Discord cannot reach loopback hosts, so http://127.0.0.1:/... URLs from text_to_image() embed as a blank bar. Route them through MediaResolver to upload as discord.File attachments instead. --- .../sources/discord/discord_platform_event.py | 33 +++++++++++++++---- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/astrbot/core/platform/sources/discord/discord_platform_event.py b/astrbot/core/platform/sources/discord/discord_platform_event.py index ff085dafd6..fcefce73f4 100644 --- a/astrbot/core/platform/sources/discord/discord_platform_event.py +++ b/astrbot/core/platform/sources/discord/discord_platform_event.py @@ -1,8 +1,10 @@ import asyncio from collections.abc import AsyncGenerator from io import BytesIO +from ipaddress import ip_address from pathlib import Path from typing import cast +from urllib.parse import urlparse import discord from discord.types.interactions import ComponentInteractionData @@ -163,13 +165,30 @@ async def _parse_to_discord( continue if file_content.startswith("http"): - logger.debug( - "[Discord] 处理 URL 图片: %s", - describe_media_ref(file_content), - ) - embed = discord.Embed().set_image(url=file_content) - embeds.append(embed) - continue + host = None + try: + host = urlparse(file_content).hostname + except ValueError: + pass + is_unreachable = False + if host: + if host == "localhost": + is_unreachable = True + else: + try: + is_unreachable = ip_address( + host.strip("[]") + ).is_loopback + except ValueError: + pass + if not is_unreachable: + logger.debug( + "[Discord] 处理 URL 图片: %s", + describe_media_ref(file_content), + ) + embed = discord.Embed().set_image(url=file_content) + embeds.append(embed) + continue image_data = await MediaResolver( file_content,