如何实现Discord机器人$steal指令偷取并添加Nitro表情到服务器?
解决Discord机器人$steal指令添加表情到服务器的问题
要实现将Nitro表情添加到当前服务器的功能,核心是使用Discord.py提供的Guild.create_custom_emoji()方法,同时需要处理权限、服务器表情上限、图片获取等问题。以下是修改后的完整代码及说明:
修改后的代码
import aiohttp import discord from discord.ext import commands @bot.command(brief='偷取表情到当前服务器', description='将任意服务器的Nitro表情添加到指令执行的服务器', usage='[表情](支持普通/动画表情)') async def steal(ctx, emoji: discord.PartialEmoji): # 检查机器人权限 if not ctx.guild.me.guild_permissions.manage_emojis: await ctx.send('我没有管理表情的权限,无法添加表情') return # 检查服务器表情数量是否超限 current_emojis = len(ctx.guild.emojis) max_emojis = ctx.guild.emoji_limit if current_emojis >= max_emojis: await ctx.send(f'服务器表情已达上限({current_emojis}/{max_emojis}),无法添加新表情') return # 异步获取表情图片二进制数据 async with aiohttp.ClientSession() as session: async with session.get(emoji.url) as resp: if resp.status != 200: await ctx.send('获取表情图片失败') return emoji_bytes = await resp.read() # 创建自定义表情 try: new_emoji = await ctx.guild.create_custom_emoji( name=emoji.name, image=emoji_bytes, reason=f'用户{ctx.author.name}使用$steal指令添加' ) await ctx.send(f'表情偷取完成!{new_emoji}') except discord.HTTPException as e: await ctx.send(f'添加表情出错:{str(e)}')
关键说明
- 权限要求:机器人必须拥有服务器的「管理表情」权限,否则无法创建表情。
- 表情上限处理:每个Discord服务器的表情数量上限由服务器等级决定,添加前需检查是否已达上限。
- 图片获取:使用
aiohttp异步请求表情的URL,获取二进制数据后传给create_custom_emoji方法(该方法仅接受bytes类型的图片数据)。 - 异常处理:捕获
HTTPException,处理诸如表情名称不合法、图片过大、网络错误等情况。
内容的提问来源于stack exchange,提问作者abe kk
相关产品推荐
相关产品推荐

