如何开发支持@提及与user ID的Discord机器人kick命令
Discord机器人kick命令优化:同时支持@提及与用户ID识别
优化核心目标:保留原有@提及触发踢人的使用逻辑,补充纯数字用户ID作为入参的识别能力,同时修正原代码存在的逻辑bug
原代码存在的基础问题修正
- 权限判断逻辑反向:原代码中
if (member.hasPermission(...)) return;会直接拦截拥有踢人权限的管理员,同时未定义member变量,会直接抛出引用错误,需修正为判断指令发送者是否缺少对应权限,缺少则直接拦截返回 - 事件适配:新版Discord.js将原
message事件替换为messageCreate事件,需要同步调整事件监听逻辑,否则无法正常接收消息 - 缺少必需的意图配置:如果未开启成员相关的意图,机器人无法拉取服务器成员列表,会导致无论是@提及还是ID识别都失效
具体实现逻辑
- 优先兼容原有逻辑:第一优先级读取消息中的@提及用户,匹配对应服务器成员
- 补充ID识别分支:当无有效@提及用户时,解析消息中
?kick指令后的第一个参数,校验是否为17-20位的纯数字Discord用户ID格式,通过成员接口拉取对应用户 - 统一后续处理:无论用户是通过@提及还是ID指定,都执行相同的成员存在性校验、踢人操作、结果反馈与错误捕获
优化后完整可运行代码
const { Client, IntentsBitField, PermissionFlagsBits } = require('discord.js'); // 初始化客户端,配置必需的事件意图 const client = new Client({ intents: [ IntentsBitField.Flags.Guilds, IntentsBitField.Flags.GuildMembers, IntentsBitField.Flags.GuildMessages, IntentsBitField.Flags.MessageContent ] }); client.on('ready', () => { console.log(`机器人已启动,登录身份为 ${client.user.tag}`); }); client.on('messageCreate', async (message) => { // 忽略非服务器内的消息、机器人自身发送的消息 if (!message.guild || message.author.bot) return; // 匹配kick指令 if (!message.content.startsWith('?kick')) return; // 校验指令发送者权限 const senderMember = message.member; if ( !senderMember.permissions.has(PermissionFlagsBits.KickMembers) && !senderMember.permissions.has(PermissionFlagsBits.BanMembers) ) { return message.reply('你没有使用该命令的权限'); } // 拆分指令参数 const args = message.content.slice('?kick'.length).trim().split(/\s+/); let targetMember; // 1. 优先识别@提及的用户(保留原有逻辑) const mentionedUser = message.mentions.users.first(); if (mentionedUser) { targetMember = message.guild.members.cache.get(mentionedUser.id); } else { // 2. 无提及时,识别参数中的纯数字用户ID const rawInput = args[0]; // 校验输入是否为合法的Discord雪花ID格式 if (rawInput && /^\d{17,20}$/.test(rawInput)) { try { // 从服务器成员缓存中拉取对应用户 targetMember = message.guild.members.cache.get(rawInput) || await message.guild.members.fetch(rawInput); } catch (err) { return message.reply('未找到匹配该ID的用户,请检查输入是否正确'); } } } // 未识别到有效目标用户时的提示 if (!targetMember) { return message.reply('请指定要踢出的用户:支持@提及用户,或直接输入用户的纯数字ID'); } // 执行踢人操作 try { await targetMember.kick('通过?kick指令触发的操作'); await message.reply(`已成功踢出用户 ${targetMember.user.tag}`); } catch (err) { console.error('踢人操作失败:', err); await message.reply('无法完成踢人操作,请检查我的角色权限层级是否高于目标用户'); } }); client.login('替换为你自己的机器人Token');
使用注意事项
- 需要在Discord开发者门户的机器人设置页面,开启
Server Members Intent权限,否则机器人无法读取服务器成员列表,ID识别功能会失效 - 机器人的角色层级必须高于被踢的目标用户,即使拥有踢人权限,也无法踢出角色层级高于自身的用户
- 支持的命令格式完全兼容原有逻辑:
?kick @用户可正常触发,新增的?kick 用户ID格式也可正常识别
内容的提问来源于stack exchange,提问作者user15390598
相关产品推荐
相关产品推荐

