如何在Python Discord机器人的on_member_join事件中获取成员头像?
如何在Python Discord机器人的on_member_join事件中获取成员头像?
嗨,我来帮你搞定这个问题!你碰到的AttributeError: 'NoneType' object has no attribute 'url'错误,本质原因是有些用户没有设置自定义头像,这时候member.avatar会返回None,自然就找不到url属性啦。下面是具体的解决思路和优化后的代码:
核心解决思路
我们需要做一个判断:如果用户有自定义头像,就用member.avatar.url;如果没有,就改用Discord提供的默认头像member.default_avatar.url。可以用简洁的三元表达式来实现这个逻辑:
avatar_url = member.avatar.url if member.avatar else member.default_avatar.url
优化你的代码
另外注意到你同时初始化了commands.Bot和discord.Client,其实完全没必要——commands.Bot是discord.Client的子类,已经包含了所有Client的功能,还额外支持命令系统,只用一个Bot实例就够了。下面是修复后的完整代码:
import discord from discord.ext import commands # 配置机器人权限 intents = discord.Intents.default() intents.members = True intents.message_content = True # 初始化Bot实例 robota = commands.Bot(command_prefix=".", intents=intents, help_command=None) @robota.event async def on_member_join(member): # 获取欢迎消息发送的频道(替换成你的频道ID) channel = robota.get_channel(Channel_ID) # 处理头像逻辑:优先自定义头像,无则用默认头像 avatar_url = member.avatar.url if member.avatar else member.default_avatar.url # 创建欢迎Embed embed = discord.Embed(title="Welcome!", description=f"{member.mention} Just Joined") embed.set_thumbnail(url=avatar_url) await channel.send(embed=embed) # 运行机器人(替换成你的机器人令牌) robota.run("YOUR_BOT_TOKEN")
额外注意事项
- 确保你已经在Discord开发者门户的机器人页面中,开启了服务器成员特权 intents(对应代码里的
intents.members = True),否则on_member_join事件可能无法正常触发,或者获取不到完整的成员信息。 - 记得把代码里的
Channel_ID和YOUR_BOT_TOKEN替换成你自己的实际值哦。
这样修改后,你的欢迎Embed就能像MEE6或Koya那样,正常显示新成员的头像啦!
备注:内容来源于stack exchange,提问作者SDB PROGRAM LEARNER
相关产品推荐
相关产品推荐

