Discord.py自定义表情在Embed中随机不显示的问题解决
问题修复与替代方案
一、修复自定义表情加载问题
你的核心问题是创建表情后直接从本地缓存查询,而Discord的缓存同步存在延迟,导致get方法偶尔找不到刚创建的表情。正确的做法是直接使用create_custom_emoji返回的表情对象,跳过缓存查询步骤:
修复后的代码调整
@bot.command() async def draft(ctx, counter): embed = discord.Embed(title='Lords') try: count = int(counter) except ValueError: await ctx.send("请输入有效的数字(1-3)") return # 修正原逻辑错误:仅当数字在1-3范围内时执行选取 if 1 <= count <= 3: rand_lords = random.sample(lords, count) created_emojis = [] # 记录创建的表情,用于后续精准删除 for rand_lord in rand_lords: # 创建表情并直接获取返回的Emoji实例 with open(f'assets/{rand_lord["asset"]}.webp', 'rb') as fd: emoji = await ctx.guild.create_custom_emoji( name=rand_lord['asset'], image=fd.read() ) created_emojis.append(emoji) embed.add_field( name=rand_lord["lord"], value=str(emoji), # 直接转成Discord可识别的表情字符串 inline=False ) await ctx.send(embed=embed) # 删除本次创建的表情 for emoji in created_emojis: await emoji.delete() else: await ctx.send("请输入1-3之间的数字")
关键改进点
- 直接使用
create_custom_emoji返回的对象,彻底避免缓存不一致问题 - 修正原代码中
if条件的逻辑颠倒错误 - 增加数字格式校验,防止非数字输入引发报错
- 记录本次创建的表情,精准删除避免误删服务器其他表情
二、无需自定义表情的替代方案
自定义表情存在服务器数量限制,且频繁创建删除效率低下,推荐两种更稳定的方案:
方案1:使用附件引用图片
将图片作为附件上传,在Embed字段中通过attachment://文件名引用:
@bot.command() async def draft(ctx, counter): embed = discord.Embed(title='Lords') try: count = int(counter) except ValueError: await ctx.send("请输入有效的数字(1-3)") return if 1 <= count <= 3: rand_lords = random.sample(lords, count) files = [] for idx, rand_lord in enumerate(rand_lords): file_path = f'assets/{rand_lord["asset"]}.webp' # 重命名文件避免同名冲突 file = discord.File(file_path, filename=f'lord_{idx}.webp') files.append(file) # 在字段中插入附件图片 embed.add_field( name=rand_lord["lord"], value=f'![{rand_lord["lord"]}](attachment://lord_{idx}.webp)', inline=False ) # 同时发送Embed和附件 await ctx.send(embed=embed, files=files) else: await ctx.send("请输入1-3之间的数字")
方案2:使用公开图片链接
如果图片已上传到公开CDN(如自建服务器、图床),可直接在Embed字段中使用链接:
@bot.command() async def draft(ctx, counter): embed = discord.Embed(title='Lords') try: count = int(counter) except ValueError: await ctx.send("请输入有效的数字(1-3)") return if 1 <= count <= 3: rand_lords = random.sample(lords, count) for rand_lord in rand_lords: # 替换为你的图片CDN链接前缀 img_url = f'https://your-cdn-domain.com/assets/{rand_lord["asset"]}.webp' embed.add_field( name=rand_lord["lord"], value=f'![{rand_lord["lord"]}]({img_url})', inline=False ) await ctx.send(embed=embed) else: await ctx.send("请输入1-3之间的数字")
这两种方案无需依赖自定义表情,避免了缓存、权限和数量限制问题,运行效率更稳定。
内容的提问来源于stack exchange,提问作者Noobydee
相关产品推荐
相关产品推荐

