启动Discord Bot报错'str' object has no attribute 'url' 如何解决
报错原因
触发AttributeError: 'str' object has no attribute 'url'的核心原因是member.avatar属性的使用不符合discord.py的规则:
- 在discord.py 1.x版本中,
member.avatar返回值是用户头像的hash字符串,本身不是带url属性的Asset对象,直接访问.url就会抛出该错误 - 就算升级到discord.py 2.x版本,
member.avatar仅在用户设置了自定义头像时才是Asset对象,用户使用默认头像时该值为None,依然会触发属性报错
除此之外原代码还存在3处会导致运行异常的问题:
- 初始化文件对象时命名冲突:
file = file(fp=...)写法会覆盖类名,触发运行时错误 - 欢迎消息的粗体Markdown未闭合,会导致格式渲染异常
- 未判断系统频道是否存在,部分未设置系统频道的服务器会触发
NoneType调用错误
修复方案
按以下规则修改代码即可:
- 替换头像属性为
member.display_avatar,discord.py 2.0+版本中该属性永远返回有效的头像Asset对象,自动适配用户自定义头像、服务器专属头像、默认头像,不会出现空值或字符串返回值 - 修正File类的初始化写法,使用
discord.File类创建文件对象,避免变量名冲突 - 补全Markdown粗体的闭合标记
- 增加系统频道的非空判断
修复后的完整可运行代码:
import discord # 请提前导入你用到的Editor、Font、load_image_async依赖 async def on_member_join(member): channel = member.guild.system_channel # 无系统频道直接终止逻辑 if not channel: return background = Editor("sfondo.jpg") # 替换为display_avatar访问稳定的头像地址 profile_image = await load_image_async(str(member.display_avatar.url)) profile = Editor(profile_image).resize((150, 150)).circle_image() poppins = Font.poppins(size=50, variant="bold") poppins_small = Font.poppins(size=20, variant="light") background.paste(profile, (325, 90)) background.ellipse((325, 90), 150, 150, outline="white", stroke_width=5) background.text((400, 260), f"WELCOME TO {member.guild.name}", color="white", font=poppins, align="center") background.text((400, 325), f"{member.name}#{member.discriminator}", color="white", font=poppins_small, align="center") # 修正File初始化逻辑 file = discord.File(fp=background.image_bytes, filename="welcome.jpg") # 补全粗体闭合标记 await channel.send(f"Hello {member.mention}! Welcome to **{member.guild.name}**") await channel.send(file=file)
注意:请确保你已经在Discord开发者后台开启了
Server Members Intent权限,同时在机器人初始化代码中配置了对应intents,否则on_member_join事件不会正常触发。
内容的提问来源于stack exchange,提问作者NeM
相关产品推荐
相关产品推荐

