Discord机器人on_member_join事件报错:'Member'无'avatar_url'属性
Discord机器人on_member_join事件报错:AttributeError: 'Member' object has no attribute 'avatar_url'
问题根源
在discord.py v2.x及以上版本中,成员头像的API调用方式发生了变更:旧版本的avatar_url属性已被移除,取而代之的是avatar.url;服务器图标同理,icon_url变为icon.url。初始代码因使用废弃属性触发报错,同时还存在其他逻辑问题。
初始代码问题
@bot.event async def on_member_join(member, self): embed = discord.Embed(colour=discord.Colour(0x95efcc), description=f"Welcome to Rebellions server! You are the{len(list(member.guild.members))}th member!") embed.set_thumbnail(url=f"{member.avatar_url}") embed.set_author(name=f"{member.name}", icon_url=f"{member.avatar_url}") embed.set_footer(text=f"{member.guild}", icon_url=f"{member.guild.icon_url}") embed.timestamp = datetime.datetime.utcnow() await welcome_channel.send(embed=embed)
- 全局事件
on_member_join不需要self参数,多余参数会导致事件触发异常 - 使用了discord.py v2.x已废弃的
member.avatar_url和member.guild.icon_url属性 - 未定义
welcome_channel变量,直接调用会引发NameError
报错信息
[2022-11-07 19:38:10] [ERROR ] discord.client: Ignoring exception in on_member_join Traceback (most recent call last): File "C:\Users\stene\AppData\Local\Programs\Python\Python311\Lib\site-packages\discord\client.py", line 409, in _run_event await coro(*args, **kwargs) File "C:\Users\stene\OneDrive\Documents\GitHub\bot\main.py", line 25, in on_member_join embed.set_thumbnail(url=f"{member.avatar_url}") ^^^^^^^^^^^^^^^^^ AttributeError: 'Member' object has no attribute 'avatar_url'
修复后的代码(Cog架构)
改用模块化Cog管理代码,同时修正API调用逻辑:
import discord from discord.ext import commands import datetime class WelcomeCog(commands.Cog, name="Welcome"): def __init__(self, bot): self.bot = bot @commands.Cog.listener() async def on_member_join(self, member): # 处理成员无自定义头像的情况,用默认头像兜底 avatar_url = member.avatar.url if member.avatar else member.default_avatar.url # 处理服务器无图标的情况 guild_icon_url = member.guild.icon.url if member.guild.icon else None embed = discord.Embed(colour=discord.Colour(0x95efcc), description=f"Welcome to Rebellions server! You are the {len(member.guild.members)}th member!") embed.set_thumbnail(url=avatar_url) embed.set_author(name=member.name, icon_url=avatar_url) embed.set_footer(text=str(member.guild), icon_url=guild_icon_url) embed.timestamp = datetime.datetime.utcnow() # 通过频道ID获取欢迎频道,增加存在性判断避免报错 channel = self.bot.get_channel(1038893507961692290) if channel: await channel.send(embed=embed) async def setup(bot): await bot.add_cog(WelcomeCog(bot)) print("Welcome cog has been loaded successfully!")
关键修改点
- 移除事件函数中多余的
self参数 - 将
member.avatar_url替换为member.avatar.url,并增加无自定义头像时的兜底逻辑 - 服务器图标调用改为
member.guild.icon.url,同时处理无图标场景 - 通过
self.bot.get_channel()安全获取欢迎频道,增加存在性判断避免异常 - 使用Cog架构组织代码,便于后续功能扩展和维护
内容的提问来源于stack exchange,提问作者Sten
相关产品推荐
相关产品推荐

