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

如何从消息引用中获取表情并创建自定义表情?报错排查

问题解决:从引用消息复制自定义表情到服务器

错误原因分析

你提到的报错message object has no attribute emoji,大概率是代码里不小心写了单数的msg.emoji(而非你贴出代码里的msg.emojis),或是使用的discord.py版本过旧。另外你的代码还有几个逻辑问题:

  • 循环遍历msg.emojis后,S只会保留最后一个表情实例,前面的都会被覆盖
  • 没区分原生Unicode表情和服务器自定义表情:原生表情无法通过fetch()获取图片,只有自定义表情才能复制
  • 缺少引用消息不存在、消息无自定义表情的异常处理

修正后的代码

下面是能正确复制引用消息里所有自定义表情到当前服务器的代码(如果只需要复制第一个,去掉循环即可):

import discord
from io import BytesIO

ref = ctx.message.reference
if not ref:
    await ctx.send("这条消息没有引用任何消息!")
    return

try:
    msg = await ctx.fetch_message(ref.message_id)
except discord.NotFound:
    await ctx.send("引用的消息不存在或无法访问!")
    return

# 过滤出消息里的自定义表情(排除原生Unicode表情)
custom_emojis = [emoji for emoji in msg.emojis if isinstance(emoji, discord.CustomEmoji)]

if not custom_emojis:
    await ctx.send("引用的消息里没有可复制的自定义表情!")
    return

# 遍历所有自定义表情,逐个复制到当前服务器
for emoji in custom_emojis:
    # 获取表情的图片数据
    emoji_bytes = await emoji.read()
    # 使用原表情的名字,也可以改成你想要的名称
    try:
        new_emoji = await ctx.guild.create_custom_emoji(name=emoji.name, image=emoji_bytes)
        await ctx.send(f"成功复制表情:{new_emoji}")
    except discord.Forbidden:
        await ctx.send("我没有创建自定义表情的权限!")
        break
    except discord.HTTPException as e:
        await ctx.send(f"创建表情失败:{e}")

关键说明

  • 权限要求:机器人必须拥有服务器的Manage Emojis and Stickers权限才能创建自定义表情
  • 原生表情无法复制:像😀😂这类系统自带的Unicode表情,没有独立的图片资源,无法通过这种方式创建自定义表情
  • 异常处理:代码补充了引用不存在、无权限、创建失败等场景的处理,避免机器人崩溃

内容的提问来源于stack exchange,提问作者PRINCE

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 15:22:22