You need to enable JavaScript to run this app. 如何开发支持@提及与user ID的Discord机器人kick命令
优惠活动
大模型
产品
解决方案
定价
更多

如何开发支持@提及与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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.31 01:36:10