discord.py:不使用ctx,从message中获取用户头像的问题
解决Discord机器人!pfp指令无法获取用户头像的问题
核心问题很明确:你把提取到的用户ID转换成了int类型,但int不是discord.Member/discord.User对象,所以没法直接调用avatar_url属性。得先把ID转换成对应的用户实例,才能获取头像链接。
修复步骤:
- 修正变量名笔误:代码里多次出现
pers,应该统一为person,否则会抛出NameError。 - 将用户ID转换为用户实例:
- 如果要获取服务器内成员的信息,用
message.guild.get_member(user_id) - 如果要支持获取任意Discord用户(哪怕不在当前服务器),用
await client.fetch_user(user_id)
- 如果要获取服务器内成员的信息,用
- 增加异常处理:处理用户ID无效、目标用户不在服务器等情况,避免机器人崩溃。
修改后的完整代码:
import discord # 替换成你的机器人实例化配置 client = discord.Client(intents=discord.Intents.default()) client.intents.message_content = True # 必须开启消息内容权限,需在开发者后台同步 @client.event async def on_message(message): # 避免机器人响应自身消息 if message.author == client.user: return async def pfp(): try: # 拆分指令与参数 content_parts = message.content.split(" ", maxsplit=1) if len(content_parts) < 2: # 无提及用户时,返回发送者头像 embed = discord.Embed(title=f"你的头像", color=0x3a88fe) embed.set_image(url=message.author.avatar.url) # 新版discord.py用avatar.url替代旧的avatar_url await message.channel.send(embed=embed) return # 提取并清洗用户ID raw_mention = content_parts[1] user_id = int(raw_mention.replace("<", "").replace("@", "").replace(">", "")) # 获取目标用户实例(全局用户获取,支持跨服务器用户) target_user = await client.fetch_user(user_id) # 构建嵌入消息发送头像 embed = discord.Embed(title=f"{target_user.name}的头像", color=0x3a88fe) embed.set_image(url=target_user.avatar.url) await message.channel.send(embed=embed) except ValueError: await message.channel.send("无效的用户格式,请正确提及用户或输入纯数字ID!") except discord.NotFound: await message.channel.send("未找到该用户,请检查ID是否正确!") except Exception as e: await message.channel.send(f"执行出错:{str(e)}") if message.content.startswith("!pfp"): await pfp() # 启动机器人 client.run("你的机器人Token")
关键细节说明:
- 新版discord.py已废弃
avatar_url属性,统一使用avatar.url获取头像链接。 message_content意图必须开启,且要在Discord开发者后台的机器人设置中同步开启,否则无法读取消息内容。- 增加了多场景异常捕获,让机器人在遇到错误时能给出明确提示,避免崩溃。
内容的提问来源于stack exchange,提问作者AZZ
相关产品推荐
相关产品推荐

