发布于 2026-01-06 4 阅读
0

如何使用 NodeJS 实现一个 Discord 机器人,要求新成员进行自我介绍

如何使用 NodeJS 实现一个 Discord 机器人,要求新成员进行自我介绍

Wasp,我们为我们的社区创建了一个 Discord 服务器,在那里我们可以与对 Wasp 感兴趣并使用 Wasp 的人交流——Waspeteers!

起初,我们认识社区里的每一个人,但随着社区的发展壮大,很多新加入的人从未写过任何东西,社区开始变得不那么温馨,不那么亲密了。

正是在那时,我们决定要求新成员必须进行自我介绍才能加入社群。
我们知道,设置这样的门槛可能会让我们失去一些潜在的新成员,但那些愿意接受挑战的人会更加积极参与,更好地融入社群。

我们找不到其他自动实现此功能的方法,只能自行开发 Discord 机器人。
本文将详细介绍我们的开发过程。

高层次方法

我们希望实现以下功能:当新用户加入我们的 Discord 服务器时,他们应该只能访问“公共”频道,例如rulescontributing以及最重要的,,introductions他们可以在这些频道中进行自我介绍。

一旦他们在频道中进行了自我介绍introductions,他们就可以访问其他频道。

频道用户可以查看访客身份与正式会员身份的对比。
左图:访客所见;右图:黄蜂人所见。

在 Discord 中,访问控制是通过角色来实现的。有两种方法可以实现我们的需求:

  1. 添加角色以授予访问权限。用户加入时没有任何角色。完成自我介绍后,系统会为其分配一个角色(例如管理员Member或高级管理员Waspeteer),该角色是访问服务器其他部分所必需的。
  2. 移除禁止访问的角色。新用户加入时,系统会自动Guest为其分配一个角色,我们已将非公开频道配置为禁止该角色用户访问。用户完成自我介绍后,该角色Guest将被移除,他们即可访问服务器的其他部分。

我们决定采用第二种方案,因为这样就无需为所有现有成员分配新角色。接下来,我们将讨论如何让第二种方案顺利实施。

为了启动这项工作,我们需要执行以下操作:

  1. 创建角色Guest
  2. 确保该Guest角色仅拥有访问“公开”频道的权限。一种便捷的方法是,Guest在类别级别禁用该角色的“查看频道”权限,这样设置就会同步到该类别下的所有频道,而无需逐个频道进行操作。完成后,使用 Discord 的“以角色身份查看服务器”功能来确认权限设置是否符合预期。
  3. 自动通知新成员必须在introductions频道中进行自我介绍才能!intro <text_about_me>访问服务器的其他内容。这可以通过 Discord 的“欢迎界面”功能或众多提供此功能的 Discord 机器人来实现。
  4. Guest当新成员加入服务器时,自动为其分配角色。
  5. Guest当成员在公共频道进行自我介绍时,自动移除其角色introductions

第 1、2 和 3 点相对简单明了。

关于第 4 点(新成员加入服务器时自动分配角色),由于 Discord 本身并不直接支持此功能,你需要一个机器人来实现。
幸运的是,许多机器人允许你在新成员加入时自动分配角色,我最终选择了MEE6
我设置了当新成员加入时,系统会立即为其分配一个Guest角色。

然而,对于第 5 点(在特定频道中移除或分配消息的角色),情况就比较复杂了——我找不到任何一款机器人支持这项功能!
最接近的方案是Carl Bot及其“标签”功能,它允许用户编写自定义代码,但最终发现它限制太多,无法实现这个目标。
因此,我最终还是自己开发了一款机器人(Wasp Bot)来实现这个功能。

实现一个 Discord 机器人(NodeJS)

我决定用NodeJS来实现一个机器人,因为它很容易上手,而且有一个不错的Discord库。

下面我将一步一步地描述如何创建它,但如果您想直接跳到最后,这里是机器人的最终代码。

在 Discord 上定义机器人并将其添加到您的服务器。

在开始实现机器人之前,我们需要先通知 Discord,以便获取代码中所需的凭据,并将机器人添加到我们的服务器。网上
有很多关于如何操作的教程,所以我将简要介绍。

  1. 前往 Discord 开发者门户,创建一个新应用 -> 我给它取名为Wasp.
  2. 前往应用程序“设置”中的“机器人”部分,添加一个新的机器人。我给它取名为WaspBot……
  3. 在您新创建的机器人的“机器人”页面上,有一个“TOKEN”部分 -> 请记住它,我们稍后在运行机器人时需要它。
  4. 前往应用程序“设置”中的“OAuth2”部分。在这里,我们将定义机器人拥有的权限。具体操作方法是:勾选要授予的权限,然后点击根据我们的选择生成的 URL。
    • 请查看bot“范围”部分。
    • 继续向下滚动找到“机器人权限”部分。在那里,检查Manage RolesView ChannelsRead Message HistorySend Messages
    • 在上方“SCOPES”部分下方,您会看到一个URL。将其复制到浏览器中,然后按照步骤将机器人添加到您的服务器。

使用 NodeJS 创建一个简单的机器人

在存放代码的目录中,创建一个新的 npm 项目,并将npm init入口点设置为 `<project_name>`bot.js而不是 `<project_name>` index.js。这将package.json生成一个 `<project_name>` 文件。

我们需要添加一个重要的依赖项,discord.js以便轻松地使用 Discord 的 API。
使用以下命令添加它npm install -S discord.js

现在,bot.js在旁边创建一个文件package.json,内容如下:

const Discord = require('discord.js')

const BOT_TOKEN = process.env.BOT_TOKEN

const bot = new Discord.Client()
bot.login(BOT_TOKEN)

bot.on('ready', function (evt) {
  console.log(`Logged in as: ${bot.user.tag}.`)
})
Enter fullscreen mode Exit fullscreen mode

就是现在!跑!

DISCORD_BOT=<TOKEN_OF_YOUR_DISCORD_BOT> node bot.js
Enter fullscreen mode Exit fullscreen mode

你应该会看到登录成功的输出,在我的情况下是这样的Logged in as: WaspBot#1234

检测来自成员的有效介绍

注意:以下部分是我参考Discord.js文档进行操作的,因此如果您需要了解特定步骤的更多详细信息,请查看文档。

现在是时候明确我们希望
新成员如何进行自我介绍了。假设新成员自我介绍的正确方式是向频道发送一条消息,消息introductions以“@”开头!intro,后跟至少 20 个字符(以确保自我介绍不会太短)。
!intro这样可以让我们的机器人轻松知道何时采取行动(在 Discord 中,机器人命令通常以“@”开头!<something>)。

让我们添加所需的代码bot.js

...

const INTRODUCTIONS_CHANNEL_ID = "<YOU_WILL_HAVE_TO_FIND_THIS_ON_DISCORD_SERVER>"

bot.on('message', async msg => {
  if (msg.content.startsWith('!intro ')) {
    if (msg.channel.id.toString() !== INTRODUCTIONS_CHANNEL_ID) {
      const introductionsChannelName =
        msg.guild.channels.resolve(INTRODUCTIONS_CHANNEL_ID).name
      return msg.reply(
        `Please use !intro command in the ${introductionsChannelName} channel!`
      )
    }

    const introMsg = msg.content.substring('!intro '.length).trim()
    const minMsgLength = 20
    if (introMsg.length < minMsgLength) {
      return msg.reply(
        `Please write introduction at least ${minMsgLength} characters long!`
      )
    }

    return msg.reply(`Yay successful introduction!`)
  }
})
Enter fullscreen mode Exit fullscreen mode

需要注意的是,您需要获取频道 IDintroductions并将其粘贴到代码中我上面放置占位符的位置。您可以通过在 Discord 应用中进入您的 Discord 服务器,右键单击频道,然后点击“获取频道
ID”来找到它。要使此操作生效,您首先需要启用“开发者模式”(位于“用户设置”>“高级”下)。introductionsCopy ID

成功介绍后移除“访客”角色

目前缺少的是Guest在成功引入后移除该角色,所以我们来做这件事:

...

const INTRODUCTIONS_CHANNEL_ID = "<YOU_WILL_HAVE_TO_FIND_THIS_ON_DISCORD_SERVER>"
const GUEST_ROLE_ID = "<YOU_WILL_HAVE_TO_FIND_THIS_ON_DISCORD_SERVER>"

bot.on('message', async msg => {
  if (msg.content.startsWith('!intro ')) {
    if (msg.channel.id.toString() !== INTRODUCTIONS_CHANNEL_ID) {
      const introductionsChannelName =
        msg.guild.channels.resolve(INTRODUCTIONS_CHANNEL_ID).name
      return msg.reply(
      `Please use !intro command in the ${introductionsChannelName} channel!`
      )
    }

    const introMsg = msg.content.substring('!intro '.length).trim()
    const minMsgLength = 20
    if (introMsg.length < minMsgLength) {
      return msg.reply(
        `Please write introduction at least ${minMsgLength} characters long!`
      )
    }

    const member = msg.guild.member(msg.author)
    try {
      if (member.roles.cache.get(GUEST_ROLE_ID)) {
        await member.roles.remove(GUEST_ROLE_ID)
        return msg.reply(
          'Nice getting to know you! You are no longer a guest' +
          ' and have full access, welcome!'
        )
      }
    } catch (error) {
      return msg.reply(`Error: ${error}`)
    }
  }
})
Enter fullscreen mode Exit fullscreen mode

与频道 ID 一样introductions,现在您还需要找到角色 ID Guest(您应该已经创建过该角色)。
您可以在服务器设置中找到角色列表,右键单击该角色,然后选择“复制 ID”即可。

就是这样!现在你可以运行机器人了。

DISCORD_BOT=<TOKEN_OF_YOUR_DISCORD_BOT> node bot.js
Enter fullscreen mode Exit fullscreen mode

如果你Guest在 Discord 服务器上给自己分配一个角色,然后在频道!intro Hi this is my introduction, I am happy to be here.中输入该introductions角色,你应该会看到自己获得了完全访问权限,同时还会收到来自你的机器人的相应消息。

部署机器人

虽然部署 Discord 机器人的方法有很多种,但我将简要介绍我们是如何通过 Heroku 实现的。

我们创建了一个 Heroku 应用wasp-discord-bot,并在 Heroku 上设置了“自动部署”功能,以便自动部署每次推送到production分支的代码(我们的机器人位于 Github 上)。

在 Heroku 上,我们将环境变量设置DISCORD_BOT为我们机器人的令牌。

最后,我们将Procfile文件添加到了项目中:

worker: node bot.js
Enter fullscreen mode Exit fullscreen mode

就是这样!每次代码推送到production分支时,我们的机器人都会被部署。

文章来源:https://dev.to/martinsos/how-to-implement-a-discord-bot-in-nodejs-that-requires-new-members-to-introduce-themselves-926