近年来,特别是在Discord机器人的帮助下,Discord已经成为社区的中心消息平台。通过Discord广泛的API,开发者能够建立强大的机器人,能够进行各种操作,如自动执行任务和与用户聊天。
随着Discord机器人的发展,我决定考虑如何将Twilio与它一起使用。一个合适的整合是使用Twilio可编程消息;你可以与那些没有Discord或SMS的人沟通,甚至可以在重要事件上得到通知,比如你是否被提及,或者成员是否离开或加入你的服务器。
在这篇文章中,你将学习如何建立一个Discord机器人,它能够在你的服务器上的重要事件中通知你,并允许你通过短信向你的服务器发送消息:

前提条件
以下是本教程中你需要的东西:
- 一个Twilio账户 - 使用这个链接免费注册,当你升级你的账户时,可以得到10美元的积分
- 一个Twilio电话号码 -点击这里查看如何用你的试用账户获得你的第一个Twilio号码。
- 一个Discord帐户。
- 在你的机器上安装Node.jsv16+。
- ngrok CLI- 用于测试目的。
设置 Discord
Discord服务器
要想开始,首先下载并打开Discord客户端(或前往网页客户端),点击左边标签上的绿色**+**图标,就可以建立一个Discord服务器。

会弹出一个菜单,询问你是否要选择一个模板--选择创建我自己的模板。下一节将询问你关于你的新服务器的情况--选择你喜欢的任何选项,如果你不确定就跳过这一节。最后一节将要求你选择一个服务器名称和图标--请随意添加你自己的或坚持使用默认值。最后,点击蓝色的创建按钮,你将被引导到你新创建的服务器。
向你的电话号码发送双向信息可以在默认的普通频道中进行,但当你邀请更多的人进入你的服务器时,它可能会变得很垃圾。因此,你要创建一个专用频道,这样只有在该频道中发送的信息才会被发送到你的手机上,任何发送到你的Twilio号码上的信息都会在该专用频道中发送。
作为本教程的一个例子,你将启用双向短信,让你的亲密朋友能够访问这个专用通道,这样你就不会错过他们的信息。
在你服务器的左边标签上,点击 "文字频道"旁边的 "+"图标,会出现一个创建新频道的模式。随意输入你想要的任何频道名称,选择私人频道的切换,然后选择创建频道。

现在你已经准备好了你的Discord服务器,现在是时候设置你的Discord机器人了。
Discord机器人
你需要通过开发者门户网站为你的机器人设置一个 Discord 应用程序。一旦你登录了,你应该被重定向到应用程序页面。
点击右上方的新应用程序。应弹出一个创建应用程序的框。输入 "twilio-sms "作为你的应用程序名称,然后点击创建。你将被重定向到你的新应用程序的门户,看起来应该是这样的。

在左手边的面板上,点击Bot,重定向到Bot子菜单。点击右上角的 "添加机器人 ",然后点击 "是,开始!"将你新创建的应用程序变成一个机器人。机器人菜单应该弹出新的设置,看起来像这样。

在Build-A-Bot部分,你应该看到重置令牌的选项。点击重置令牌,生成一个新的令牌,然后点击是的,做吧!以确认。点击复制来复制你的令牌,然后把它存放在一个安全的地方--这个令牌将在下一节中使用。
这个令牌应该是私有的,不应该与任何人分享。这个令牌可以完全访问你的机器人账户,并用于向其发送代码。如果你的令牌被破坏了,请点击机器人菜单中的重置令牌来重置你的令牌。
现在,向下滚动到特权网关意图 部分,打开所有列出的意图,并点击绿色的保存更改 按钮。

接下来,你需要给你的新机器人权限,并将其添加到你的服务器。在左手边,点击 OAuth2,然后点击URL Generator。在SCOPES部分选择机器人选项。

选择机器人选项后,应该会出现一个新的机器人权限 部分。向下滚动,选择管理员并复制下面的链接。

这个链接将带你进入一个对话框,授权你的机器人进入你选择的服务器。将该链接粘贴到你的URL中,选择你想让你的机器人加入的服务器,然后点击继续。

在你的申请被授权之前,你可能会看到一个验证码,需要完成。最后,点击授权,允许你的机器人进入你的服务器。
现在,你的机器人已经连接到你的服务器,现在是时候设置你的Node.js应用程序了。
设置你的Node.js应用程序
在这一部分,你将为你的机器人设置Node.js应用程序。为了使事情井井有条,创建一个名为discord-sms的文件夹来存储所有的应用程序文件。在你的终端或命令提示符中,导航到你喜欢的目录,并输入以下命令:
mkdir discord-sms
cd discord-sms
npm init -y
该命令将创建你的项目文件,并通过创建package.json文件来构建你的Node项目,该文件将包含你项目的元数据和包的依赖性。
安装依赖项
你的下一步是安装你的项目所需的所有依赖项,你将需要安装以下npm包:
- discord.js- Discord的官方软件包,用于与Discord API互动。
- Twilio- Twilio的官方软件包,用于与Twilio API互动。
- dotenv- 用于存储和访问环境变量。
- Express- 用于路由和处理从你的Twilio号码传入的短信。
要安装这些依赖项,在你的终端输入以下命令:
npm install discord.js twilio dotenv express
现在依赖关系已经安装完毕,你将需要设置你的环境变量。
安全环境变量
dotenv包用于访问与Discord和Twilio APIs互动所需的环境变量。
在你喜欢的IDE中打开你的discord-sms 目录,创建一个名为*.env*的文件。打开该文件,将以下几行放入该文件:
BOT_TOKEN=XXXXXX
TWILIO_NUMBER=XXXXXX
PERSONAL_NUMBER=XXXXXX
TWILIO_ACCOUNT_SID=XXXXXX
TWILIO_AUTH_TOKEN=XXXXXX
抓取你的机器人令牌(之前生成的)、Twilio电话号码、个人电话号码、Twilio账户SID和Twilio auth令牌,并将所有的XXXXXX 占位符替换为各自的值。
在添加你的电话号码时,别忘了使用E.164格式 。
你可以在你的Twilio控制台找到你的Twilio账户SID和Auth Token,如下图:

建立短信机器人
如果你在这一部分迷失了方向,或者需要验证你的整个代码,这里是整个index.js文件的完整代码。
现在,你已经安装了必要的依赖,并配置了你的环境,是时候建立你的机器人了
在discord-sms目录下创建一个index.js文件,将以下代码放入该文件:
require('dotenv').config();
const { Client, GatewayIntentBits } = require('discord.js');
const client = new Client({ intents: [GatewayIntentBits.Guilds, GatewayIntentBits.GuildPresences, GatewayIntentBits.GuildMessages, GatewayIntentBits.MessageContent, , GatewayIntentBits.GuildMembers] });
const twilio = require('twilio')(process.env.TWILIO_ACCOUNT_SID, process.env.TWILIO_AUTH_TOKEN);
const friendsChannelId = 'XXXXXX';
const myUserId = 'XXXXXX';
const express = require('express')
const app = express();
app.use(express.urlencoded({
extended: true
}));
第1至4行和第8至12行初始化你之前安装的discord.js 、twilio 和express 包。它还向 DiscordClient 构造函数声明了必要的意图。这些是你在你的Discord开发者控制面板上为你的Discord机器人启用的相同意图。
第5行持有你的用户ID,用于检查你是否在消息中被提及。第6行有你的频道ID(用于双向消息),用于检查消息是否需要发送到你的Twilio号码。
要获得这些ID,你首先需要启用开发者模式。你可以通过进入屏幕左侧的APP SETTINGS 部分下的Discord应用设置的高级部分,并切换到开发者模式。
现在要获得频道和用户ID,将鼠标悬停在服务器内的一个频道或用户上,点击右键,然后选择复制ID。

一旦这些值被复制,在index.js文件中用它们各自的XXXXXX 占位符替换它。
创建SMS功能
将以下代码添加到你的index.js文件中:
function sendSMS(sms) {
twilio.messages.create({
body: sms,
to: process.env.PERSONAL_NUMBER,
from: process.env.TWILIO_NUMBER,
});
}
这段代码实现了sendSMS(sms) 函数,它接收了一个sms 消息作为参数。该函数将使用twilio 客户端向你的个人电话号码发送sms 消息,使用你的*.env*文件中存储的Twilio号码。
提及通知器
我们要建立的第一个短信通知器是每当你在服务器中被提及时。
在你的index.js文件中添加以下代码:
client.on("messageCreate", function(message) {
if (message.author.bot) return;
if(message.mentions.members.has(myUserId)) {
const sms = `${message.author.username} mentioned you in ${message.channel.name}: ${message.content}`
sendSMS(sms);
}
});
Discord提供网关,使你能够监听由Discord API发送的特定事件。这里有一份Discord提供的所有网关事件的清单。如果你想进一步了解如何使用discord.js来处理网关事件,请查看他们的文档 事件处理.
这段代码实现了一个事件监听器,每当"messageCreate" 事件被触发时就会执行,也就是在频道中发送消息的时候。第2行检查消息的作者是否是一个机器人,如果是,它将停止该功能。这是为了确保机器人不会对自己做出回应。
然后,第3行将检查你是否在消息中被提及,如果是的话,将触发sendSMS() 功能。
Discord发送的message 对象是Message的一个类,代表Discord中的一条消息。这个类包含了消息的所有数据,包括时间戳、作者、提及次数、发送的频道等等。
加入和离开成员的通知器
Discord还提供了一个网关事件,可以监听刚加入和离开你服务器的成员。在"messageCreate" 监听器的下面,添加以下代码:
client.on("guildMemberAdd", function(member) {
sendSMS(${member.user.username} has joined the server!)
});
client.on("guildMemberRemove", function(member) {
sendSMS(${member.user.username} has left the server!)
});
每当有成员加入和离开你的服务器时,"guildMemberAdd" 和"guildMemberRemove" 监听器就会分别执行,并会运行sendSMS() 函数来通知你这个事件。
双向SMS消息传递
为了允许从你的电话号码向你的 Discord 发送消息,你需要设置另一个事件监听器来监听发送到你的 Twilio 号码的 SMS 消息。这将通过在你的Node.js服务器上用Express设置一个URL路由来完成。
在你的index.js文件中添加以下代码:
app.post('/sms', async (req, res) => {
if(req.body.From != process.env.PERSONAL_NUMBER) return;
const channel = client.channels.cache.get(friendsChannelId);
channel.send(req.body.Body)
});
这段代码将监听POST 到你的Node.js服务器上的/sms 路由的请求,并将向你的朋友专用频道发送一条消息,请求的正文中包含短信。该代码还将确保短信是由你的个人电话号码发送的,这样,如果其他人给你的Twilio号码发短信,机器人就不会向你的频道发送信息。
req.body.From 将提供一个使用E.164格式的 号码,包括一个国家代码。确保你的 是相同的格式,否则任何来自你的个人号码的短信将不会被传送到Discord。PERSONAL_NUMBER:
client.on("messageCreate", function(message) {
if (message.author.bot) return;
if (message.channel.id == friendsChannelId && message.author.id != myUserId) {
const sms = ${message.author.username}: ${message.content};
sendSMS(sms);
}
else if(message.mentions.members.has(myUserId)) {
const sms = ${message.author.username} mentioned you in ${message.channel.name}: ${message.content}
sendSMS(sms);
}
});
这个更新的代码增加了第3至第6行,将任何发送到你的专用双向信息通道的信息,发送到你的Twilio号码。它还确保你在频道内发送的任何信息不会被发送到你的号码上。
你还需要把你的Twilio号码连接到/sms 路由,这样任何发送到你的Twilio号码的短信都会被发送到该路由;这将在部署部分完成。
初始化服务器和机器人
最后,你的代码将需要启动Express服务器,并让你的机器人登录到你的服务器。将以下代码附加到index.js文件的底部:
app.listen(3000, () => {
console.log(Listening on port 3000);
});
client.login(process.env.BOT_TOKEN);
部署和测试
在生产环境中,建议在云服务器上运行你的Node.js应用程序。然而,为了简化本教程的部署,你将在你的电脑上部署你的应用程序。然后,Ngrok将通过生成一个公共URL来连接你的Express服务器和互联网,这个公共URL将把所有请求直接传输到你的服务器。这个公共URL将被配置到你的Twilio控制台的Twilio号码上,这样所有的短信将被发送到你的机器人应用程序。
运行机器人应用程序
确保index.js文件的内容被保存。在终端上导航到你的项目目录,执行以下命令:
node index
该命令将运行你的Node.js应用程序,它将启动你的Express服务器,并让你的机器人登录到你的Discord服务器。
现在,当你的应用程序正在运行时,打开另一个终端标签或窗口并执行以下命令:
ngrok http 3000
然后你的终端将看起来像这样:

你会看到ngrok已经生成了转发URL到你的本地服务器,端口为3000。复制其中一个URL--建议使用https URL,因为它是加密的--因为需要将其中一个URL插入到你的Twilio号码的信息设置中。
导航到你的Twilio控制台的**活动号码** 部分 。你可以从控制台的左边标签点击电话号码>管理>活动号码。
现在点击你想用于短信服务的Twilio号码,向下滚动到消息部分。在A MESSAGE COMES IN下面,在第一个下拉框中选择webhook,然后在下一个文本框中,输入你的转发URL,后面是*/sms*(见下面的URL应该是什么样子)。

一旦你将你的Twilio号码配置到你的Express服务器,点击蓝色的保存按钮。
你的twilio-sms机器人现在终于可以使用了。
测试
现在,试着测试一下向你的 Discord 服务器发送双向信息。给你的Twilio号码发短信,看看它是否在你的服务器上显示出来。


看起来信息通过了!现在试着用另一个账户在双向信息通道中回发一条信息(因为你自己账户的信息不会被发送到你的号码上),看看你是否收到一条短信。

棒极了,它通过了!
结论
有了它,你刚刚建立了一个 Discord 机器人,它可以使用 Twilio 可编程短信向你的电话号码发送和接收消息和重要通知。