如何从消息引用中获取表情并创建自定义表情?报错排查
问题解决:从引用消息复制自定义表情到服务器
错误原因分析
你提到的报错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
相关产品推荐
相关产品推荐

