用Twilio和Node.js通过Discord发送和接收短信(详细教程)

1,697 阅读11分钟

近年来,特别是在Discord机器人的帮助下,Discord已经成为社区的中心消息平台。通过Discord广泛的API,开发者能够建立强大的机器人,能够进行各种操作,如自动执行任务和与用户聊天。

随着Discord机器人的发展,我决定考虑如何将Twilio与它一起使用。一个合适的整合是使用Twilio可编程消息;你可以与那些没有Discord或SMS的人沟通,甚至可以在重要事件上得到通知,比如你是否被提及,或者成员是否离开或加入你的服务器。

在这篇文章中,你将学习如何建立一个Discord机器人,它能够在你的服务器上的重要事件中通知你,并允许你通过短信向你的服务器发送消息:

Phone screenshots of discord app and SMS app showing notification of new user joining and two way messaging

前提条件

以下是本教程中你需要的东西:

设置 Discord

Discord服务器

要想开始,首先下载并打开Discord客户端(或前往网页客户端),点击左边标签上的绿色**+**图标,就可以建立一个Discord服务器。

Screenshot of discord application where the plus icon is circled red.

会弹出一个菜单,询问你是否要选择一个模板--选择创建我自己的模板。下一节将询问你关于你的新服务器的情况--选择你喜欢的任何选项,如果你不确定就跳过这一节。最后一节将要求你选择一个服务器名称和图标--请随意添加你自己的或坚持使用默认值。最后,点击蓝色的创建按钮,你将被引导到你新创建的服务器。

向你的电话号码发送双向信息可以在默认的普通频道中进行,但当你邀请更多的人进入你的服务器时,它可能会变得很垃圾。因此,你要创建一个专用频道,这样只有在该频道中发送的信息才会被发送到你的手机上,任何发送到你的Twilio号码上的信息都会在该专用频道中发送。

作为本教程的一个例子,你将启用双向短信,让你的亲密朋友能够访问这个专用通道,这样你就不会错过他们的信息。

在你服务器的左边标签上,点击 "文字频道"旁边的 "+"图标,会出现一个创建新频道的模式。随意输入你想要的任何频道名称,选择私人频道的切换,然后选择创建频道

Discord channel creation modal

现在你已经准备好了你的Discord服务器,现在是时候设置你的Discord机器人了。

Discord机器人

你需要通过开发者门户网站为你的机器人设置一个 Discord 应用程序。一旦你登录了,你应该被重定向到应用程序页面。Applications page of the Discord Developer Dashboard

点击右上方的新应用程序。应弹出一个创建应用程序的框。输入 "twilio-sms "作为你的应用程序名称,然后点击创建。你将被重定向到你的新应用程序的门户,看起来应该是这样的。

General information page of the newly created discord application

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

Bot section of the new discord application portal

Build-A-Bot部分,你应该看到重置令牌的选项。点击重置令牌,生成一个新的令牌,然后点击是的,做吧!以确认。点击复制来复制你的令牌,然后把它存放在一个安全的地方--这个令牌将在下一节中使用。

这个令牌应该是私有的应该与任何人分享。这个令牌可以完全访问你的机器人账户,并用于向其发送代码。如果你的令牌被破坏了,请点击机器人菜单中的重置令牌来重置你的令牌。

现在,向下滚动到特权网关意图 部分,打开所有列出的意图,并点击绿色的保存更改 按钮。

Privelaged gateway intents section with all intents turned on within the bot settings menu

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

Bot option selected of the scopes within OAuth2 settings

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

Administrator option selected of the permissions within the OAuth2 settings

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

Modal asking user to add the twilio-sms to a server

在你的申请被授权之前,你可能会看到一个验证码,需要完成。最后,点击授权,允许你的机器人进入你的服务器。

现在,你的机器人已经连接到你的服务器,现在是时候设置你的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,如下图:

Twilio console with a red circle over account info box shows auth token and account sid

建立短信机器人

如果你在这一部分迷失了方向,或者需要验证你的整个代码,这里是整个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.jstwilioexpress 包。它还向 DiscordClient 构造函数声明了必要的意图。这些是你在你的Discord开发者控制面板上为你的Discord机器人启用的相同意图。

第5行持有你的用户ID,用于检查你是否在消息中被提及。第6行有你的频道ID(用于双向消息),用于检查消息是否需要发送到你的Twilio号码。

要获得这些ID,你首先需要启用开发者模式。你可以通过进入屏幕左侧的APP SETTINGS 部分下的Discord应用设置的高级部分,并切换到开发者模式Developer mode option turned on within the advanced section in the Discord client settings menu

现在要获得频道和用户ID,将鼠标悬停在服务器内的一个频道或用户上,点击右键,然后选择复制ID

Left image shows Copy ID item selected in right click menu on user. Right image shows copy id selected in the right click menu of the friends-only channel

一旦这些值被复制,在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

然后你的终端将看起来像这样:

Terminal showing ngrok connection with forwarding URLs

你会看到ngrok已经生成了转发URL到你的本地服务器,端口为3000。复制其中一个URL--建议使用https URL,因为它是加密的--因为需要将其中一个URL插入到你的Twilio号码的信息设置中。

导航到你的Twilio控制台的**活动号码** 部分 。你可以从控制台的左边标签点击电话号码>管理>活动号码

现在点击你想用于短信服务的Twilio号码,向下滚动到消息部分。在A MESSAGE COMES IN下面,在第一个下拉框中选择webhook,然后在下一个文本框中,输入你的转发URL,后面是*/sms*(见下面的URL应该是什么样子)。

Messaging section of active twilio number within the Twilio console

一旦你将你的Twilio号码配置到你的Express服务器,点击蓝色的保存按钮。

你的twilio-sms机器人现在终于可以使用了。

测试

现在,试着测试一下向你的 Discord 服务器发送双向信息。给你的Twilio号码发短信,看看它是否在你的服务器上显示出来。

Phone screenshot of an sms messaging saying, "Hey friends!" being sent to Twilio numberFriends-only channel in discord client showing a message from twilio-sms-bot that says "Hey Friends!" and another message being sent by a user named dhrpatel saying "Hey!".

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

Phone screenshot of SMS from twilio number saying, "dhrpatel: Hey!"".

棒极了,它通过了!

结论

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