Discord JS中如何通过customID检查按钮是否包含指定emoji
Discord.js 基于customId校验按钮emoji方案
适配版本:Discord.js v14
核心逻辑
按钮组件统一挂载在消息的components字段对应的ActionRow数组中,遍历所有行内组件找到customId匹配的按钮对象后,提取emoji的实际标识值和预期值做比对即可,注意区分Unicode默认表情和服务器自定义表情的取值规则。
可直接复用的实现代码
// 引入组件类型枚举,不想引入的话直接用数字2代表按钮类型即可 const { ComponentType } = require('discord.js'); /** * 校验指定customId的按钮是否配置了目标emoji * @param {Array} actionRows 消息的components数组,或本地构建的ActionRowBuilder数组 * @param {string} targetCustomId 目标按钮的customId * @param {string} expectedEmoji 预期emoji:Unicode表情直接传字符,自定义表情传emoji id * @returns {boolean} 校验结果,找不到对应按钮/按钮无emoji/emoji不匹配均返回false */ function checkButtonEmoji(actionRows, targetCustomId, expectedEmoji) { for (const row of actionRows) { for (const comp of row.components) { // 过滤掉下拉框、输入框等非按钮组件 if (comp.type !== ComponentType.Button) continue; if (comp.customId !== targetCustomId) continue; // 按钮未配置emoji if (!comp.emoji) return false; // 自定义emoji取id,Unicode表情取name做比对 const currentEmoji = comp.emoji.id ?? comp.emoji.name; return currentEmoji === expectedEmoji; } } // 遍历完没找到对应按钮 return false; }
调用示例
对应customId为1的按钮预期emoji为🔷的场景,直接调用即可:
// 从已收到的消息对象上取按钮配置做校验 const isMatch = checkButtonEmoji(message.components, "1", "🔷"); // 如果是本地构建还未发送的按钮,直接传构建好的ActionRow数组即可 const isMatchForLocal = checkButtonEmoji(builtActionRows, "1", "🔷");
注意事项
- 不要直接拿
component.emoji对象和emoji字符串做全等比对,emoji字段是结构化对象,直接比对永远返回false - 若你的按钮customId携带动态参数(比如
confirm_123这类拼接值),把customId的全等判断改成你需要的前缀/正则匹配即可,其余逻辑不变 - 自定义服务器emoji校验时优先用emoji id做匹配,避免emoji重名导致校验误判
内容的提问来源于stack exchange,提问作者KittyCatCrafter
相关产品推荐
相关产品推荐

