You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 19:40:27