
你的业务是否依赖预约?无论你是一个美容院,餐厅,私人教练,或勤杂工,不出现可以大大影响收入。短信提醒可以减少高达50%的缺席,但如果你刚刚开始你的业务或试图保持成本下降,你可能认为这是不可能实现的,没有一个CRM(客户关系管理)或其他昂贵的系统。
好消息是!实际上,从头开始创建一个自动文本提醒系统很容易。让我们用Node.js、Twilio和Flybase做一个。
这篇文章中涉及的主题包括以下内容。
- 使用Cron包来安排短信。
- 在Twilio和Flybase上建立一个免费账户。
- 在Twilio和Flybase的门户网站上生成一个API密钥。
- 在Flybase数据库中保存用户。
- 还有更多。
设置
我们将使用一些工具来建立这个应用程序。在你继续之前,你会想把这些工具设置好。
- Twilio。用于发送和接收短信。没有Twilio账户?免费注册吧
- Flybase。一个实时数据库API。我们将用它来存储订阅了我们服务的用户。
- Node.js。一个建立在Chrome的JavaScript运行时间上的平台,用于轻松构建快速、可扩展的网络应用。
如果你还没有,现在就 注册一个免费的Flybase账户,然后创建一个新的应用。
当你注册Twilio和Flybase账户时,他们会为你的账户提供一个API Key。我们将使用这些API Key来建立我们的应用程序。
如何用Cron安排短信
为了开始,创建一个名为auto-sender 的新文件夹,并通过运行以下命令初始化我们的应用程序
npm init --yes
接下来,我们需要安装几个npm包。
我们将使用 twilio包来发送文本信息,用 cron包来安排我们要发送短信的时间,还有dotenv包 ,该包 将环境变量从.env文件加载到process.env中。
让我们通过运行以下命令来安装这些包。
npm install twilio
npm install cron
npm install dotenv –save-dev
现在,创建一个名为app.js的新文件,导入Twilio和Cron包。
import twilio from ‘twilio’;
import cronJob from ‘cron’.CronJob;
import dotenv from 'dotenv';
dotenv.config();
const client= twilio(process.env.ACCOUNTSID,process.env.AUTHTOKEN);
让我们写一些代码,在每天下午6点发送一条短信。
const textJob=new cronJob(‘0 18 * * *’, function(){ client.messages.create ({
to: process.env.YOURPHONENUMBER,
from: process.env.YOURTWILIOPHONENUMBER,
body: ‘ Hello, Hope you are having a good day’
}) .then(message => console.log(message.body));
}, null, true);
你可能想知道我们作为第一个参数传递给cronJob的字符串是什么。那是Cron特有的格式,让我们定义我们希望这个工作启动的时间和频率。在本例中,每天0点18分。这篇文章对Cron的格式做了很好的分解。
在cronJob的回调中,我们使用Twilio客户端库来发送一个消息。我们传入和传出号码以及我们想发送的消息的内容。运行这段代码,并期待着你的短信。如果现在是上午10点,你可能不希望要等8个小时才能看到你的代码是否有效。只要更新Cron的格式,在更早的时间发送即可。
这里有一个提示。要在上午10点13分发送,你可以使用这种格式。"13 10 * * *".你现在有了这个应用程序的基本版本,但你很可能不想每天都给自己发信息。如果你想,那么恭喜你!你已经全部完成了!对于我们其他人来说,我们可以做一些小的代码修改,让它发送到多个电话号码。
首先,让我们添加一个名为numbers的新变量,其中包含我们想要发送消息的电话号码。
var numbers = ['YOURPHONENUMBER', 'YOURFRIENDSPHONENUMBER',’YOURBOYFRIENDPHONENUMBER’];
然后,让我们更新textJob中的代码,在这些电话号码上进行循环,并向它们发送一条信息。
const textJob = new cron.CronJob(
function () {
client.messages.create({
如何接收短信
现在,我们在所需的时间向不同的号码发送短信,让我们更新这段代码,以了解用户何时向我们的应用程序发送短信。Twilio使用webhooks来让我们的服务器知道何时有传入的信息或电话进入我们的应用程序。
我们需要设置一个端点,告诉Twilio使用这个消息网络钩子。
我们将使用Express框架来设置我们的节点网络服务器来接收来自Twilio的POST请求,所以我们需要安装Express包。所以我们也要安装它。
npm install express
在我们的app.js文件的开头,我们需要要求express并将其初始化为一个名为app的变量。我们还将使用express中间件,以方便使用我们将在 POST 请求中获得的数据。
import express from 'express';
app = express();
app.use(express.json());
app.use(express.urlencoded({
extended: true
}));
我们将为/message添加一个路由,该路由将响应一些TwiML。TwiML是一套基本的指令,你可以用它来告诉Twilio当你收到来电或短信时该怎么做。我们的代码看起来会是这样的。
const MessagingResponse= twilio.twiml.MessagingResponse;
app.post('/message', function (req, res) {
const twiml = new MessagingResponse();
twiml.message('Thanks for subscribing!');
res.writeHead(200, {
'Content-Type':'text/xml'
});
res.end(twiml.toString());
});
我们使用Twilio的节点库来初始化一个新的TwimlResponse。然后我们使用Message 动词来设置我们想用什么来回应消息。在这种情况下,我们只说 "谢谢你的订阅!"然后,我们将响应的内容类型设置为text/xml,并发送我们建立的TwimlResponse的字符串表示。
最后,让我们把我们的服务器设置为收听3000端口。
const server = app.listen(3000, function() {
console.log('Listening on port %d', server.address().port);
});
现在让我们启动我们的应用程序。
node app.js
现在我们的服务器正在运行,我们需要告诉Twilio使用这个消息传递URL作为我们的消息请求URL。

向你的Twilio号码发送一条短信,你应该得到一个回应。如果你没有,看看Twilio应用程序监视器,以帮助确定什么地方出了问题。
这就是了!我们的每日短信提醒应用程序已经准备好了。在每天下午6点,以下短信将被发送到所有添加到我们应用程序的电话号码上。

如何在Flybase中保存用户
我们已经设置了一个脚本,在每天的同一时间发送短信,我们已经让用户能够在我们的应用程序中发送短信。现在只剩下最后一件事要做。我们需要在用户向我们的应用程序发送短信时保存他们的信息。我们将使用Flybase 作为我们的数据存储,所以我们需要安装Flybase节点模块。
npm install flybase
现在我们已经安装了Flybase模块,让我们在app.js文件的顶部要求并初始化它。
Import flybase from ‘flybase’
const flybase_api_key = process.env.FLYBASEAPIKEY;
const db = "dailysms";
const collection = "users";
const usersRef = flybase.init(db, collection, flybase_api_key);
当你注册Flybase账户时,他们会为你的账户提供一个API Key。请确保你更新这段代码,用这个密钥替换{YOUR-API-KEY}。在Flybase内部,创建一个名为dailysms的新应用。由于我们将从Flybase中提取电话号码,我们要更新我们的数字变量为一个空数组,然后用数据库中的信息填充它。
Flybase是一个实时数据库,围绕着订阅事件的前提而建立,而不是按需阅读。我们要订阅两个事件:首先,我们要检索所有现有的电话号码列表,然后我们要在有新用户加入时得到通知。
const numbers = [];
usersRef.on('value', function(snapshot) {
snapshot.forEach( function( rec ){
numbers.push( rec.value().phonenumber );
console.log( 'Added number ' + rec.value().phonenumber
);
});
});
usersRef.on('added', function(snapshot) {
numbers.push( snapshot.value().phonenumber );
console.log( 'Added number ' +
snapshot.value().phonenumber );
});
现在我们需要在用户发短信订阅时将其添加到我们的数据库中。让我们重新审视一下我们的消息路线,进行这个更新。
const MessagingResponse= twilio.twiml.MessagingResponse;
app.post('/message', function (req, res) {
const twiml = new MessagingResponse();
console.log(req.body)
if( req.body.Body.trim().toLowerCase() === 'subscribe' ) {
var fromNum = req.body.From;
if(numbers.indexOf(fromNum) !== -1) {
twiml.message('You already subscribed!');
} else {
twiml.message('Thank you, you are now subscribed. Reply "STOP" to stop receiving updates.');
usersRef.push({phonenumber:fromNum});
}
} else {
twiml.message('Welcome to Daily Updates. Text "Subscribe" receive updates.');
}
res.writeHead(200, {
'Content-Type':'text/xml'
});
res.end(twiml.toString());
});
当Twilio消息webhook触发一个新的POST请求到你的服务器时,我们包括请求参数与消息的信息。
我们将使用Body参数来检查用户发来的内容,使用from参数来确定他们发来的号码。如果他们发来的短信是 "订阅",而他们还没有在我们的数据库中,我们将使用Flybase引用的推送功能来添加他们。
我们的应用程序现在已经准备好了。让我们运行它并试一试。
node app.js
结论
在这篇文章中,我们使用Node.js、Flybase和Twilio创建了一个简单而实用的每日短信提醒应用程序。你可以在这个资源库中找到这个应用程序的完整源代码。我希望你发现这对启动和运行是有用的。现在你可以根据你的需要决定添加更多的功能。
构建可组合的网络应用
不要建立网络单体。使用 比特来创建和组成解耦的软件组件--在你喜欢的框架中,如React或Node。构建可扩展和模块化的应用程序,提供强大和愉快的开发体验。
把你的团队带到 比特云来托管并共同协作开发组件,并作为一个团队加快、扩大和规范开发。尝试用设计系统 或微前端的可组合前端,或探索用服务器端组件的可组合后端。

了解更多
使用Nodejs、Twilio和Flybase构建短信提醒应用》最初发表于Bits and Pieceson Medium,人们在这里通过强调和回应这个故事来继续对话。