>一如既往,您可以從GitHub repo中找到本教程中使用的代碼。
鑰匙要點
>您不必擔心Twilio,可以免費嘗試。
>
>啟用API後,它將要求您創建憑據。單擊轉到憑據開始設置。這將向您顯示以下內容:
單擊“添加憑據”按鈕,然後選擇OAuth 2.0客戶端ID。
>這將要求您首先配置同意屏幕。單擊配置同意屏幕。>輸入向用戶顯示的產品名稱的值,然後單擊“保存”。
>配置後,您現在可以創建客戶端ID。選擇應用程序類型的Web應用程序,留下默認名稱(如果需要),輸入http:// localhost:3000/登錄授權重定向的URIS,然後單擊創建。
>
twilio接下來轉到可編程的語音儀表板。這是您可以看到沙箱號碼的地方。您可以使用此數字來測試Twilio。但是稍後,您需要購買電話號碼,以便Twilio發送的短信不會
“從Twilio Sandbox發送”添加了。 Twilio沙箱號碼的另一個限制是它只能與經過驗證的數字一起使用。這意味著您必須在Twilio上註冊一個電話號碼才能向其發送消息。您可以從“管理呼叫者ID”頁面上執行此操作。 構建應用程序
安裝依賴項
如前所述,我們將為此應用使用MySQL數據庫。繼續使用您選擇的數據庫管理工具創建一個新數據庫。然後使用以下SQL轉儲文件來創建表:timment-notifier.sql。
>應用程序配置
>在您的工作目錄上,創建一個配置文件夾,然後在內部創建一個default.json文件。這是我們將全局應用程序配置放置的地方。這包括時區,我們將要發送提醒的電話號碼,數據庫,Google App和Twilio設置。
>
公共文件
作為好的開發人員,我們需要盡可能避免代碼重複。這就是為什麼我們需要放置我前面提到的這三個主要文件(服務器,緩存,通知)所需的代碼。在工作目錄上創建一個通用文件夾。這是我們要添加通用文件的地方。
>{ "name": "google-calendar-twilio", "version": "0.0.1", "dependencies": { "config": "^1.17.1", "cron": "^1.1.0", "express": "^4.13.3", "googleapis": "^2.1.6", "moment": "^2.10.6", "moment-timezone": "^0.4.1", "mysql": "felixge/node-mysql", "twilio": "^2.6.0" } }>數據庫
>這使用配置庫來獲取我們在config/default.json文件上之前添加的配置值。具體來說,我們正在獲取數據庫配置,以便我們可以連接到數據庫。然後,我們將導出此模塊,以便以後可以從另一個文件中使用它。
time.js文件用於設置使用Misms timeZone庫的默認時區。我們還導出了時區的值,因為在運行兩個CRON任務(緩存事件並通知用戶)時,我們將稍後使用它。
>。{ "name": "google-calendar-twilio", "version": "0.0.1", "dependencies": { "config": "^1.17.1", "cron": "^1.1.0", "express": "^4.13.3", "googleapis": "^2.1.6", "moment": "^2.10.6", "moment-timezone": "^0.4.1", "mysql": "felixge/node-mysql", "twilio": "^2.6.0" } }
>
{ "app": { "timezone": "Asia/Manila" }, "me": { "phone_number": "" }, "db": { "host": "localhost", "user": "root", "password": "secret", "database": "calendar_notifier" }, "google":{ "client_id": "THE CLIENT ID OF YOUR GOOGLE APP", "client_secret": "THE CLIENT SECRET OF YOUR GOOGLE APP", "redirect_uri": "http://localhost:3000/login", "access_type": "offline", "scopes": [ "https://www.googleapis.com/auth/plus.me", "https://www.googleapis.com/auth/calendar" ] }, "twilio": { "sid": "YOUR TWILIO SID", "secret": "YOUR TWILIO SECRET", "phone_number": "+YOUR TWILIO PHONE NUMBER / SANDBOX NUMBER" } }創建服務器
var config = require('config'); var db_config = config.get('db'); var mysql = require('mysql'); var connection = mysql.createConnection({ host: db_config.host, user: db_config.user, password: db_config.password, database: db_config.database }); exports.db = connection;分解它:
首先,我們導入了我們之前創建的Google和DB模塊。
>創建在Localhost端口3000上運行的Express服務器。這就是為什麼我們在應用程序配置和Google的重定向URI上添加了http:// localhost:3000/登錄:
var config = require('config'); var app_timezone = config.get('app.timezone'); var moment = require('moment-timezone'); moment.tz.setDefault(app_timezone); exports.config = { timezone: app_timezone }; exports.moment = moment;>
定義一個UpdateAccessToken功能。這接受了兩個論點:令牌和響應。代幣是用戶獲得必要權限後從Google獲得的訪問令牌。響應是來自Express的響應對象。我們將其傳遞給此功能,以便我們可以向用戶發送響應。在功能內部,我們更新第一行的訪問。如前所述,此應用僅適用於單個用戶。 Access_Token更新後,我們發送響應。
var config = require('config'); var google_config = config.get('google'); var google = require('googleapis'); var OAuth2 = google.auth.OAuth2; var oauth2Client = new OAuth2(google_config.client_id, google_config.client_secret, google_config.redirect_uri); var calendar = google.calendar('v3'); exports.oauth2Client = oauth2Client; exports.calendar = calendar; exports.config = google_config;>
>添加主頁的路由。 http:// localhost:訪問3000時執行此操作。從這裡我們生成身份驗證URL。這使用了OAuth2Client的GenerateAuthurl方法。它接受包含access_type和範圍的對象。我們從之前創建的應用程序配置文件中獲取這些值。最後,我們發送用戶可以單擊的實際鏈接。請注意,您應該始終在視圖中執行此操作,但是為了簡化內容,我們將直接返回鏈接。
var google = require('./common/google'); var connection = require('./common/db'); var express = require('express'); var app = express(); var server = app.listen(3000, function () { var host = server.address().address; var port = server.address().port; console.log('Example app listening at http://%s:%s', host, port); }); function updateAccessToken(tokens, response){ connection.db.query( "UPDATE users SET access_token = ? WHERE id = 1", [JSON.stringify(tokens)], function(err, rows, fields){ if(!err){ console.log('updated!'); response.send('connected!'); }else{ console.log('error updating table'); console.log(err); response.send('error occured, please try again'); } } ); } app.get('/', function(req, res){ var url = google.oauth2Client.generateAuthUrl({ access_type: google.config.access_type, scope: google.config.scopes }); res.send('<a href="' + url + '">login to google</a>'); }); app.get('/login', function(req, res){ var code = req.query.code; console.log('login'); google.oauth2Client.getToken(code, function(err, tokens){ if(!err){ console.log('tokens'); console.log(tokens); updateAccessToken(tokens, res); }else{ res.send('error getting token'); console.log('error getting token'); } }); });
>添加登錄路由。這是用戶在授予應用程序必要權限後重定向的路線。 Google通過稱為代碼的查詢參數傳遞。我們正在通過請求中的查詢對象獲取它。然後,我們調用GetToken方法並將代碼作為參數傳遞。這將為我們提供訪問令牌。因此,我們調用UpdateAccessToken函數以將其保存到數據庫中。
var google = require('./common/google'); var connection = require('./common/db');>
{ "name": "google-calendar-twilio", "version": "0.0.1", "dependencies": { "config": "^1.17.1", "cron": "^1.1.0", "express": "^4.13.3", "googleapis": "^2.1.6", "moment": "^2.10.6", "moment-timezone": "^0.4.1", "mysql": "felixge/node-mysql", "twilio": "^2.6.0" } }
> cacher負責將用戶約會保存到數據庫中。這使我們不必每次發送提醒時都必須查詢Google日曆API目錄。創建一個cache.js文件,並添加以下內容:
>{ "app": { "timezone": "Asia/Manila" }, "me": { "phone_number": "" }, "db": { "host": "localhost", "user": "root", "password": "secret", "database": "calendar_notifier" }, "google":{ "client_id": "THE CLIENT ID OF YOUR GOOGLE APP", "client_secret": "THE CLIENT SECRET OF YOUR GOOGLE APP", "redirect_uri": "http://localhost:3000/login", "access_type": "offline", "scopes": [ "https://www.googleapis.com/auth/plus.me", "https://www.googleapis.com/auth/calendar" ] }, "twilio": { "sid": "YOUR TWILIO SID", "secret": "YOUR TWILIO SECRET", "phone_number": "+YOUR TWILIO PHONE NUMBER / SANDBOX NUMBER" } }
分解它:
首先,我們導入我們需要的所有模塊。
var config = require('config'); var db_config = config.get('db'); var mysql = require('mysql'); var connection = mysql.createConnection({ host: db_config.host, user: db_config.user, password: db_config.password, database: db_config.database }); exports.db = connection;>附加功能負責將約會保存到約會表中。這接受了約會的Event_ID,摘要,開始和結束日期。 Event_ID基本上是Google日曆中特定約會的ID。我們將其用作主要密鑰的值,這意味著重複的人不會插入約會表中。這裡缺少的是比較數據庫中已經在數據庫中的約會以及API返回的約會的手段。如果出於某種原因更改約會的時間表,則不會更新數據庫,因為我們在這裡所做的只是插入表中。我將把它留給您的待辦事項清單。
var config = require('config'); var app_timezone = config.get('app.timezone'); var moment = require('moment-timezone'); moment.tz.setDefault(app_timezone); exports.config = { timezone: app_timezone }; exports.moment = moment;getEvents功能負責通過API返回的所有約會進行循環。這使用了附加方法來保存循環的每次迭代的約會。
>
var config = require('config'); var google_config = config.get('google'); var google = require('googleapis'); var OAuth2 = google.auth.OAuth2; var oauth2Client = new OAuth2(google_config.client_id, google_config.client_secret, google_config.redirect_uri); var calendar = google.calendar('v3'); exports.oauth2Client = oauth2Client; exports.calendar = calendar; exports.config = google_config;>緩存方法是對Google日曆API進行實際調用的方法。這是通過使用Google客戶端的。在這裡,我們在日曆對像上調用列表方法。這接受兩個參數:第一個是包含查詢選項的對象,第二個是返回結果後要執行的函數。
var google = require('./common/google'); var connection = require('./common/db'); var express = require('express'); var app = express(); var server = app.listen(3000, function () { var host = server.address().address; var port = server.address().port; console.log('Example app listening at http://%s:%s', host, port); }); function updateAccessToken(tokens, response){ connection.db.query( "UPDATE users SET access_token = ? WHERE id = 1", [JSON.stringify(tokens)], function(err, rows, fields){ if(!err){ console.log('updated!'); response.send('connected!'); }else{ console.log('error updating table'); console.log(err); response.send('error occured, please try again'); } } ); } app.get('/', function(req, res){ var url = google.oauth2Client.generateAuthUrl({ access_type: google.config.access_type, scope: google.config.scopes }); res.send('<a href="' + url + '">login to google</a>'); }); app.get('/login', function(req, res){ var code = req.query.code; console.log('login'); google.oauth2Client.getToken(code, function(err, tokens){ if(!err){ console.log('tokens'); console.log(tokens); updateAccessToken(tokens, res); }else{ res.send('error getting token'); console.log('error getting token'); } }); });在包含選項的對像中,我們有以下內容:
>
創建Notifier
{ "name": "google-calendar-twilio", "version": "0.0.1", "dependencies": { "config": "^1.17.1", "cron": "^1.1.0", "express": "^4.13.3", "googleapis": "^2.1.6", "moment": "^2.10.6", "moment-timezone": "^0.4.1", "mysql": "felixge/node-mysql", "twilio": "^2.6.0" } }>最後但並非最不重要的一點,我們有通知器(notify.js)。這負責從數據庫中獲得約會,並確定它們是否已經成熟通知。如果是的話,我們將它們發送。
分解它:
{ "app": { "timezone": "Asia/Manila" }, "me": { "phone_number": "" }, "db": { "host": "localhost", "user": "root", "password": "secret", "database": "calendar_notifier" }, "google":{ "client_id": "THE CLIENT ID OF YOUR GOOGLE APP", "client_secret": "THE CLIENT SECRET OF YOUR GOOGLE APP", "redirect_uri": "http://localhost:3000/login", "access_type": "offline", "scopes": [ "https://www.googleapis.com/auth/plus.me", "https://www.googleapis.com/auth/calendar" ] }, "twilio": { "sid": "YOUR TWILIO SID", "secret": "YOUR TWILIO SECRET", "phone_number": "+YOUR TWILIO PHONE NUMBER / SANDBOX NUMBER" } }導入所有必需的模塊。
>創建一個updateAppointment函數。這接受任命的ID作為其論點。它所做的只是將通知字段的值設置為1,這意味著已經發送了特定約會的通知。
var config = require('config'); var db_config = config.get('db'); var mysql = require('mysql'); var connection = mysql.createConnection({ host: db_config.host, user: db_config.user, password: db_config.password, database: db_config.database }); exports.db = connection;接下來,我們將具有sendnotification函數。這是負責實際發送Twilio的文本提醒。從數據庫中獲取約會後,此功能被調用。這就是為什麼它具有錯誤,結果和字段參數傳遞的原因。該錯誤包含數據庫中的任何錯誤。結果包含從數據庫返回的行。並且這些字段包含有關返回結果字段的信息。
在功能中,我們從應用程序配置中獲取用戶電話號碼。
var config = require('config'); var app_timezone = config.get('app.timezone'); var moment = require('moment-timezone'); moment.tz.setDefault(app_timezone); exports.config = { timezone: app_timezone }; exports.moment = moment;>
{ "name": "google-calendar-twilio", "version": "0.0.1", "dependencies": { "config": "^1.17.1", "cron": "^1.1.0", "express": "^4.13.3", "googleapis": "^2.1.6", "moment": "^2.10.6", "moment-timezone": "^0.4.1", "mysql": "felixge/node-mysql", "twilio": "^2.6.0" } }
檢查是否有任何錯誤,是否沒有任何錯誤繼續循環瀏覽所有返回的結果。
>{ "app": { "timezone": "Asia/Manila" }, "me": { "phone_number": "" }, "db": { "host": "localhost", "user": "root", "password": "secret", "database": "calendar_notifier" }, "google":{ "client_id": "THE CLIENT ID OF YOUR GOOGLE APP", "client_secret": "THE CLIENT SECRET OF YOUR GOOGLE APP", "redirect_uri": "http://localhost:3000/login", "access_type": "offline", "scopes": [ "https://www.googleapis.com/auth/plus.me", "https://www.googleapis.com/auth/calendar" ] }, "twilio": { "sid": "YOUR TWILIO SID", "secret": "YOUR TWILIO SECRET", "phone_number": "+YOUR TWILIO PHONE NUMBER / SANDBOX NUMBER" } }在循環內部,我們提取所需的所有值並構造要發送的實際消息。我們還獲得了當前時間和約會開始時間之間的小時差異。我們檢查小時差小於還是等於24小時。
var config = require('config'); var db_config = config.get('db'); var mysql = require('mysql'); var connection = mysql.createConnection({ host: db_config.host, user: db_config.user, password: db_config.password, database: db_config.database }); exports.db = connection;如果小於或等於24小時,我們會發送通知。這是通過使用Twilio客戶端的。我們調用sendmessage並將其傳遞到包含TO(用戶電話號碼)的對象,從(Twilio的Sandobox號碼或您從Twilio購買的電話號碼)以及包含短信的主體。如果沒有任何錯誤,我們假設已發送該通知。因此,我們調用UpdateAppointment函數將“通知”字段設置為1,因此在任務運行時不會選擇它。
var config = require('config'); var app_timezone = config.get('app.timezone'); var moment = require('moment-timezone'); moment.tz.setDefault(app_timezone); exports.config = { timezone: app_timezone }; exports.moment = moment;>最後,我們有了StartTask方法。它所做的就是從尚未發送通知的約會表中選擇所有約會。此功能每12點和下午6點執行一次。
>
var config = require('config'); var google_config = config.get('google'); var google = require('googleapis'); var OAuth2 = google.auth.OAuth2; var oauth2Client = new OAuth2(google_config.client_id, google_config.client_secret, google_config.redirect_uri); var calendar = google.calendar('v3'); exports.oauth2Client = oauth2Client; exports.calendar = calendar; exports.config = google_config;結論
經常詢問有關使用Twilio
構建SMS預約應用程序的問題(常見問題解答)>我如何安排不同時區的提醒?安排不同時區的提醒可能有些棘手。您需要為每個約會存儲時區信息,並在安排提醒時使用此信息。 JavaScript的日期對象可以處理時區轉換,或者您可以使用Moment.js之類的庫來進行更複雜的方案。
如果SMS未能發送?您還可以在代碼中設置錯誤處理以記錄這些失敗並採取適當的操作,例如重新發送消息或通知用戶。
>此應用程序中的數據的安全性? Twilio提供安全的通信渠道,但您還需要確保服務器和數據庫安全。這可能涉及使用安全協議,加密敏感數據以及遵循Web安全性的最佳實踐。
發送帶有Twilio的SMS提醒的費用是多少您發送的消息和發送給的國家。 Twilio在其網站上提供了詳細的定價結構。
以上是如何使用Twilio構建SMS約會提醒應用程序的詳細內容。更多資訊請關注PHP中文網其他相關文章!