如何使用discord.js一次性向Discord服务器批量添加多个表情
Discord.js 批量添加服务器自定义表情实现方法
核心改造逻辑
原有单表情添加逻辑只覆盖了单个表情的解析、校验、创建流程,要实现批量添加,仅需做几处针对性调整:
- 从指令参数中提取所有传入的表情字符串,而非固定读取单个表情值
- 遍历每个表情依次执行合法性校验、服务器内重复校验
- 给表情创建接口加
await等待执行结果,同时控制请求频率避免触发Discord速率限制 - 统一统计添加成功、重复跳过、添加失败的表情条目,最终一次性汇总返回结果
注意:Discord对单服务器自定义表情数量有上限限制,无boost的普通服务器最多可添加50个自定义表情,服务器boost等级提升后额度会对应上涨,批量添加前请确认服务器剩余可用表情额度。
改造后可直接使用的代码
// 指令使用示例:!addbulkemoji <自定义表情1> <自定义表情2> <自定义表情3> ... // 切割消息内容拿到所有传入的表情参数,prefix替换为你自己机器人设置的指令前缀即可 const emojiArgs = message.content.slice(prefix.length).trim().split(/\s+/).slice(1); if (!emojiArgs.length) return message.channel.send('请输入至少一个要添加的自定义表情!'); // 初始化结果统计数组 const successList = []; const existList = []; const failedList = []; // 逐个处理传入的表情 for (const emojiStr of emojiArgs) { const emoticon = require('discord.js').Util.parseEmoji(emojiStr); // 过滤非有效自定义表情 if (!emoticon?.id) { failedList.push(`${emojiStr}(不是有效的自定义表情)`); continue; } // 过滤服务器内已存在的表情 if (message.guild.emojis.cache.has(emoticon.id)) { existList.push(emoticon.name); continue; } // 自动识别表情格式拼接CDN地址 const emojiUrl = `https://cdn.discordapp.com/emojis/${emoticon.id}.${emoticon.animated ? 'gif' : 'png'}`; try { // 等待表情创建完成后再进入下一个循环 const newEmoji = await message.guild.emojis.create(emojiUrl, emoticon.name || 'Emoji'); successList.push(newEmoji.name); // 加300ms间隔避免触发速率限制 await new Promise(resolve => setTimeout(resolve, 300)); } catch (error) { failedList.push(`${emoticon.name}(错误原因:${error.message})`); } } // 汇总结果回复用户 let replyContent = '批量添加表情执行完成:\n'; if (successList.length) replyContent += `✅ 添加成功:${successList.join('、')}\n`; if (existList.length) replyContent += `⚠️ 已存在跳过:${existList.join('、')}\n`; if (failedList.length) replyContent += `❌ 添加失败:${failedList.join('、')}`; await message.reply(replyContent);
关键细节说明
- 原单表情示例代码中
message.guild.emojis.create是异步方法,未加await会出现接口还没返回结果就提前发送成功提示的问题,改造后已补全异步等待逻辑 - 遍历过程中增加了300ms的请求间隔,避免短时间发起大量接口调用触发Discord的速率限制
- 代码自动识别传入表情是静态还是动态类型,自动匹配png/gif后缀的资源地址,无需手动区分表情格式
内容的提问来源于stack exchange,提问作者WOLF
相关产品推荐
相关产品推荐

