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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 14:18:03