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

discord.py:不使用ctx,从message中获取用户头像的问题

解决Discord机器人!pfp指令无法获取用户头像的问题

核心问题很明确:你把提取到的用户ID转换成了int类型,但int不是discord.Member/discord.User对象,所以没法直接调用avatar_url属性。得先把ID转换成对应的用户实例,才能获取头像链接。

修复步骤:

  1. 修正变量名笔误:代码里多次出现pers,应该统一为person,否则会抛出NameError。
  2. 将用户ID转换为用户实例:
    • 如果要获取服务器内成员的信息,用message.guild.get_member(user_id)
    • 如果要支持获取任意Discord用户(哪怕不在当前服务器),用await client.fetch_user(user_id)
  3. 增加异常处理:处理用户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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 04:54:16