在这一章中,我将向你展示如何使用 Node.js、Flybase 和 Twilio 来编写你自己的每日短信提醒应用。
-
Twilio 发送和接收短信
-
存储订阅我们服务的用户
-
Node.js 构建在 Chrome 的 JavaScript 运行时之上,轻松构建快速、可扩展的网络应用
首先,我们需要安装几个 npm 包。我们将使用 twilio 包( https://github.com/twilio/twilio-node )来发送文本消息,并且我们将使用 cron 包( https://github.com/ncb000gt/node-cron )来安排我们想要发送文本消息的时间。您可以通过运行以下命令来安装它们:
npm install twilio
npm install cron创建一个名为 app.js 的新文件,并需要 twilio 和 cron 包:
var twilio = require('twilio'),
client = twilio('ACCOUNTSID', 'AUTHTOKEN'),
cronJob = require('cron').CronJob;让我们写一些每天下午 6 点发送短信的代码:
var textJob = new cronJob( '0 18 * * *', function(){
client.sendMessage( { to:'YOURPHONENUMBER', from:'YOURTWILIONUMBER', body:'Hello! Hope you're having a good day!' }, function( err, data ) {});
}, null, true);您可能想知道我们作为 cronJob 的第一个参数传递的字符串是什么。这是一种特定于 Cron 的格式,允许我们定义希望该作业启动的时间和频率。
在这种情况下,每天 18 小时的 0 分钟。这篇文章( www.nncron.ru/help/EN/working/cron-format.htm )很好地打破了 Cron 格式。
在对 cronJob 的回调中,我们使用 Twilio 客户端库发送消息。我们传递收件人和发件人号码以及我们想要发送的消息正文。
运行这段代码,等待你的短信。如果是上午 10 点,你可能不想等 8 个小时来看看你的代码是否工作。只需更新 Cron 格式,在更早的时间发送即可。给你个提示。要在上午 10:13 发送,您可以使用以下格式:“13 10 * * *”。
你现在有了这个应用的基本版本,但你很可能不想每天只给自己发一条消息。如果你有,那么恭喜你!你们都完了!对于我们其余的人,我们可以做一些小的代码修改,让这个发送到多个电话号码。
首先,让我们添加一个名为 numbers 的新变量,它包含我们要向其发送消息的电话号码:
var numbers = ['YOURPHONENUMBER', 'YOURFRIENDSPHONENUMBER'];然后,让我们更新 textJob 中的代码,循环遍历这些电话号码并向它们发送消息:
for( var i = 0; i < numbers.length; i++ ) {
client.sendMessage( { to:numbers[i], from:'YOURTWILIONUMBER', body:'Hello! Hope you’re having a good day.'}, function( err, data ) {
console.log( data.body );
});
}现在,我们在需要的时间向不同的号码发送短信,让我们更新代码,以了解用户何时向我们的应用发送短信。Twilio 使用 webhooks ( https://en.wikipedia.org/wiki/Webhook )来让您的服务器知道何时有消息或电话进入我们的应用。我们需要设置一个端点,我们可以告诉 Twilio 将它用于消息传递 webhook。
我们将使用 express 框架( http://expressjs.com/ )来设置我们的 Node web 服务器,以接收来自 Twilio 的 POST 请求,因此我们需要安装 Express 包。我们还将使用 body-parser 模块,所以我们也要安装它:
npm install express
npm install body-parser在 app.js 文件的开头,我们需要 require express 并将其初始化为一个名为 app 的变量。我们还将使用 bodyParser 中间件( https://github.com/expressjs/body-parser )来方便地使用我们将在 POST 请求中获得的数据:
var express = require('express'),
bodyParser = require('body-parser'),
app = express();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
extended: true
}));我们将为/message 添加一个路由,用一些 TwiML ( www.twilio.com/docs/api/twiml )进行响应。TwiML 是一组基本指令,当你收到来电或短信时,你可以用它来告诉 Twilio 该做什么。我们的代码将如下所示:
app.post('/message', function (req, res) {
var resp = new twilio.TwimlResponse();
resp.message('Thanks for subscribing!');
res.writeHead(200, {
'Content-Type':'text/xml'
});
res.end(resp.toString());
});我们使用 Twilio Node 库来初始化一个新的 TwimlResponse。然后我们使用消息动词( www.twilio.com/docs/api/twiml/sms/message )来设置我们想要用什么来响应消息。在这种情况下,我们只会说“感谢订阅!”然后,我们将响应的内容类型设置为text/xml,并发送我们构建的 TwimlResponse 的字符串表示。
最后,让我们将服务器设置为侦听端口 3000:
var server = app.listen(3000, function() {
console.log('Listening on port %d', server.address().port);
});现在让我们启动我们的应用:
node app.js现在我们已经运行了服务器,我们需要告诉 Twilio 使用这个消息 URL 作为我们的消息请求 URL:
向您的 Twilio 号码发送短信,您应该会收到回复。如果你不知道,看看 Twilio 应用监视器( www.twilio.com/user/account/developer-tools/app-monitor )来帮助确定哪里出了问题。
我们设置了一个脚本,每天在同一时间发送短信,我们让用户能够在我们的应用中发送短信。只剩下最后一件事要做了。当用户向我们的应用发送文本时,我们需要保存他们的信息。我们将使用 Flybase ( www.flybase.io/ )作为我们的数据存储,因此我们需要安装 Flybase Node 模块:
npm install flybase现在我们已经安装了 Flybase 模块,让我们在 app.js 文件的顶部要求并初始化它:
var api_key = "{YOUR-API-KEY}";
var db = "dailysms";
var collection = "users";
var usersRef = require('flybase').init(db, collection, api_key);当你注册一个 Flybase 帐户时,他们会为你的帐户提供一个 API 密钥。请务必更新此代码,用此键替换{YOUR-API-KEY}。
从 Flybase 内部,创建一个名为dailysms的新应用。
因为我们将从 Flybase 中提取电话号码,所以我们希望将 numbers 变量更新为一个空数组,然后用数据库中的信息填充它。
Flybase 是一个实时数据库,它是围绕订阅事件而构建的,而不是按需阅读。我们将订阅两个事件:首先,我们希望检索所有现有电话号码的列表,然后我们希望在添加新用户时得到通知:
var 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 );
});现在,我们需要添加用户到我们的数据库时,他们在订阅文本。让我们重新审视一下我们的消息路径,以进行更新:
```javascript
app.post('/message', function (req, res) {
var resp = new twilio.TwimlResponse();
if( req.body.Body.trim().toLowerCase() === 'subscribe' ) {
var fromNum = req.body.From;
if(numbers.indexOf(fromNum) !== -1) {
resp.message('You already subscribed!');
} else {
resp.message('Thank you, you are now subscribed. Reply "STOP" to stop receiving updates.');
usersRef.push({phonenumber:fromNum});
}
} else {
resp.message('Welcome to Daily Updates. Text "Subscribe" receive updates.');
}
res.writeHead(200, {
'Content-Type':'text/xml'
});
res.end(resp.toString());
});
```js
当 Twilio 消息 webhook 向您的服务器触发一个新的 POST 请求时,我们会在请求参数( [`www.twilio.com/docs/api/twiml/sms/twilio_request#request-parameters`](http://www.twilio.com/docs/api/twiml/sms/twilio_request%2523request-parameters) )中包含关于消息的信息。
我们将使用 Body 参数来检查用户发送的文本内容,使用 From 参数来确定用户发送的文本数量。如果他们已经输入了单词“subscribe ”,并且他们还不在我们的数据库中,我们将使用我们的 Flybase 引用上的 push 函数来添加他们。
我们的应用现已准备就绪。让我们运行并尝试一下:node app.js
## 摘要
我们做到了!现在你已经建立了一个简单的每日短信提醒应用,这是你自定义每日信息的机会。