
Discord.py v2.0+ 中 Guild.icon_url 已被移除,需改用 guild.icon.url 属性获取服务器图标 URL,且必须先检查 guild.icon 是否存在,避免 AttributeError。
discord.py v2.0+ 中 `guild.icon_url` 已被移除,需改用 `guild.icon.url` 属性获取服务器图标 url,且必须先检查 `guild.icon` 是否存在,避免 attributeerror。
在 Discord.py 2.0 及更高版本中,Guild 对象的图标访问方式发生了重大变更:旧版的 guild.icon_url 属性已被完全弃用,取而代之的是一个可为 None 的 Asset 类型对象 guild.icon。该对象仅在服务器设置了图标时才非空,且需通过 .url 属性显式获取 CDN 链接。
✅ 正确写法如下:
guild = bot.get_guild(guild_id)
if guild is None:
print("未找到指定 ID 的服务器")
else:
thumbnail = guild.icon.url if guild.icon else None
# 使用 thumbnail(例如发 embed 时)
# embed.set_thumbnail(url=thumbnail)
⚠️ 注意事项:
- guild.icon 是 discord.Asset 实例(非字符串),不可直接用作字符串或 JSON 字段,务必调用 .url;
- 若服务器未设置图标,guild.icon 为 None,此时访问 .url 会触发 AttributeError,因此必须前置判空;
- guild.icon 还支持其他方法,如 .size(256) 获取指定尺寸图标、.read() 异步读取二进制数据等,适用于高级场景;
- 确保已启用 intents.guilds(必要)及 intents.members(若需实时获取未缓存 Guild,但 get_guild() 不依赖此)。
? 小技巧:如需兼容性更强的写法(尤其在不确定 Discord.py 版本时),可封装为工具函数:
def get_guild_icon_url(guild: discord.Guild) -> Optional[str]:
return str(guild.icon.url) if guild.icon else None
总之,牢记口诀:“icon_url → icon.url,有 icon 才有 url”。










