如何使用Twilio構建SMS約會提醒應用程序
>一如既往,您可以從GitHub repo中找到本教程中使用的代碼。
鑰匙要點
>使用Google和Twilio設置必要的帳戶,並啟用用於獲取約會的Google Calendar API等API。
- >實現OAuth 2.0以供用戶身份驗證,以安全地訪問Google日曆數據。
- >使用MySQL數據庫存儲從Google Calendar獲取的用戶數據和約會詳細信息。
- >使用node.js中的cron安排任務,以自動從Google日曆中獲取事件並通過Twilio發送SMS提醒。
處理錯誤,並確保在開發和部署應用程序期間對問題進行故障排除。 - 。
- >設置內容
- 首先,您需要擁有一個Google帳戶和一個Twilio帳戶。如果您還沒有這些,則可以繼續註冊。這是鏈接:
>您不必擔心Twilio,可以免費嘗試。
- Google Console Project
- >擁有Google帳戶後,請轉到Google控制台並創建一個新應用。默認情況下,Google Console頁面向您顯示了您使用的最新應用程序的儀表板。但是,如果您尚未從事任何項目,它將顯示以下內容:
- >
>
創建項目後,將顯示儀表板。從那裡,您可以單擊使用Google API,搜索Google Calendar API並啟用它。 >
>啟用API後,它將要求您創建憑據。單擊轉到憑據開始設置。這將向您顯示以下內容:

單擊“添加憑據”按鈕,然後選擇OAuth 2.0客戶端ID。
>這將要求您首先配置同意屏幕。單擊配置同意屏幕。
>輸入向用戶顯示的產品名稱的值,然後單擊“保存”。
>配置後,您現在可以創建客戶端ID。選擇應用程序類型的Web應用程序,留下默認名稱(如果需要),輸入http:// localhost:3000/登錄授權重定向的URIS,然後單擊創建。

>
twilio>創建了一個Twilio帳戶後,請轉到“設置”頁面,並記下“ councipen”和“ accountId and authtoken”的值。
接下來轉到可編程的語音儀表板。這是您可以看到沙箱號碼的地方。您可以使用此數字來測試Twilio。但是稍後,您需要購買電話號碼,以便Twilio發送的短信不會
“從Twilio Sandbox發送”添加了。 Twilio沙箱號碼的另一個限制是它只能與經過驗證的數字一起使用。這意味著您必須在Twilio上註冊一個電話號碼才能向其發送消息。您可以從“管理呼叫者ID”頁面上執行此操作。 構建應用程序
>現在我們準備構建該應用程序了。在繼續之前,我想簡要概述我們將如何實現該應用程序。將會有三個主要文件:一個用於服務器,一個用於Google日曆的緩存事件,一個用於提醒用戶。該服務器用於允許用戶登錄並獲得訪問令牌。這些事件將保存在MySQL數據庫中,並且將在.json文件中添加全局應用程序配置。 Node的CRON實現將用於執行緩存事件的任務並提醒用戶。
安裝依賴項
在您的工作目錄上,創建一個軟件包。
在此文件中,我們正在指定應用程序依賴的庫的名稱和版本。這是每個庫的使用情況:- config - 用於存儲和檢索全局應用程序配置。
- > cron - 用於在一天中的特定時間執行特定任務。在此應用程序中,我們正在使用它來運行該任務,以從用戶Google日曆並發送文本提醒。 。
- express - node.js的Defatto Web框架。我們正在使用它來提供登錄頁面。
- MOMMTEMZONE - 時區插件暫時。這設置了應用程序的默認時區。
- > mysql - node.js的mySQL客戶端
- twilio - Node.js的官方Twilio客戶端這使我們能夠發送文本提醒。
- >執行NPM從您的終端安裝以安裝所有依賴項。
如前所述,我們將為此應用使用MySQL數據庫。繼續使用您選擇的數據庫管理工具創建一個新數據庫。然後使用以下SQL轉儲文件來創建表:timment-notifier.sql。
數據庫中有兩個表:用戶和約會。用戶表用於存儲用戶數據。在此應用程序的情況下,我們只能存儲一個用戶,只存儲訪問令牌。
約會表用於存儲我們從Google日曆API中獲得的事件。請注意,它沒有一個用戶,因為我們只有一個用戶。我們將獲取所有作為零作為通知字段的值的行。>應用程序配置
>在您的工作目錄上,創建一個配置文件夾,然後在內部創建一個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" } }
>在公共目錄內創建一個db.js文件,然後添加以下內容:
>這使用配置庫來獲取我們在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" } }
Google
> Google.js文件用於初始化Google客戶端和OAuth2客戶端。為了初始化OAuth2客戶端,我們需要傳遞客戶端ID,客戶端秘密和重定向URL,我們在配置文件中已添加了該客戶端。然後,我們初始化Google日曆服務。最後,我們導出OAuth2客戶端,日曆和Google配置。 >
{ "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" } }
>現在我們準備在服務器上工作了。服務器負責獲取訪問令牌。可以用於與Google日曆API通信,而無需當前登錄用戶。首先創建一個server.js文件並添加以下內容:
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
> 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;
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;
>
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;
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'); } }); });
>
- auth - 這是OAuth2Client。這用於對請求進行身份驗證。 >
- 日曆 - 我們將在其中獲得約會的日曆的ID。在這種情況下,我們使用的是主要日曆。 Google日曆實際上允許您創建許多日曆。其他人也可以向您分享他們的日曆。這些日曆中的每個日曆都有自己的ID。這就是我們在這裡指定的。如果您有興趣訪問其他日曆,請務必在日曆上查看API文檔。
> MaxResults - 您要返回的結果總數。 - >
訂單 - 允許您指定返回結果的順序。在這種情況下,我們使用了啟動時間,該開始時間根據其開始時間按順序訂購結果。僅當單個Events選項設置為true時才可用。- >
- 所有這些選項以及許多其他選項都可以在事件中找到:列表文檔
>
創建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" } }
分解它:
{ "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;
在功能中,我們從應用程序配置中獲取用戶電話號碼。
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" } }
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;
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;
>
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提醒應用程序。具體來說,我們研究瞭如何通過Google日曆API獲得用戶的約會。我們已將這些保存在數據庫中,並通過Twilio通知了用戶。您可以從GITHUB存儲庫中找到本教程中使用的代碼。
經常詢問有關使用Twilio
構建SMS預約應用程序的問題(常見問題解答)我如何測試我的SMS約會提醒應用程序的功能?
>測試您的SMS預約提醒應用程序的功能對於確保其按預期工作至關重要。您可以使用Twilio的內置測試工具來模擬發送和接收消息。您也可以將單元測試框架(例如Jest或Mocha)用於JavaScript代碼。請記住測試所有功能,包括預約創建,提醒計劃和發送SMS。 。消息內容通常在您的服務器端代碼中定義。您可以對此進行修改以包括您想要的任何信息,例如約會時間,位置或與約會有關的任何其他詳細信息。
>>我如何安排不同時區的提醒?安排不同時區的提醒可能有些棘手。您需要為每個約會存儲時區信息,並在安排提醒時使用此信息。 JavaScript的日期對象可以處理時區轉換,或者您可以使用Moment.js之類的庫來進行更複雜的方案。
如果SMS未能發送?
如果SMS未能發送?您還可以在代碼中設置錯誤處理以記錄這些失敗並採取適當的操作,例如重新發送消息或通知用戶。
>我可以為多個用戶使用此應用程序嗎?是的,您可以將此應用用於多個用戶。您需要修改代碼以將約會與特定用戶相關聯,並確保將提醒發送到正確的電話號碼。這可能涉及在數據庫中添加用戶身份驗證和管理用戶數據。
此應用程序中的數據的安全性? Twilio提供安全的通信渠道,但您還需要確保服務器和數據庫安全。這可能涉及使用安全協議,加密敏感數據以及遵循Web安全性的最佳實踐。
我可以將此應用程序與我現有的調度系統集成嗎?您現有的調度系統。這將涉及修改代碼與系統的API或數據庫進行交互。確切的詳細信息將取決於調度系統的細節。
>發送帶有Twilio的SMS提醒的費用是多少您發送的消息和發送給的國家。 Twilio在其網站上提供了詳細的定價結構。
我可以向國際號碼發送提醒嗎?但是,您需要確保您遵守每個國家 /地區的SMS法規,並且成本可能高於國內消息。 🎜>您可以使用各種工具監視應用程序的性能。 Twilio為您的SMS使用情況提供分析,您可以使用服務器監視工具來跟踪服務器端代碼的性能。您還應該實施日誌記錄以幫助診斷出現的任何問題。
>以上是如何使用Twilio構建SMS約會提醒應用程序的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

JavaScript是現代Web開發的基石,它的主要功能包括事件驅動編程、動態內容生成和異步編程。 1)事件驅動編程允許網頁根據用戶操作動態變化。 2)動態內容生成使得頁面內容可以根據條件調整。 3)異步編程確保用戶界面不被阻塞。 JavaScript廣泛應用於網頁交互、單頁面應用和服務器端開發,極大地提升了用戶體驗和跨平台開發的靈活性。

Python和JavaScript開發者的薪資沒有絕對的高低,具體取決於技能和行業需求。 1.Python在數據科學和機器學習領域可能薪資更高。 2.JavaScript在前端和全棧開發中需求大,薪資也可觀。 3.影響因素包括經驗、地理位置、公司規模和特定技能。

實現視差滾動和元素動畫效果的探討本文將探討如何實現類似資生堂官網(https://www.shiseido.co.jp/sb/wonderland/)中�...

JavaScript的最新趨勢包括TypeScript的崛起、現代框架和庫的流行以及WebAssembly的應用。未來前景涵蓋更強大的類型系統、服務器端JavaScript的發展、人工智能和機器學習的擴展以及物聯網和邊緣計算的潛力。

學習JavaScript不難,但有挑戰。 1)理解基礎概念如變量、數據類型、函數等。 2)掌握異步編程,通過事件循環實現。 3)使用DOM操作和Promise處理異步請求。 4)避免常見錯誤,使用調試技巧。 5)優化性能,遵循最佳實踐。

如何在JavaScript中將具有相同ID的數組元素合併到一個對像中?在處理數據時,我們常常會遇到需要將具有相同ID�...

探索前端中類似VSCode的面板拖拽調整功能的實現在前端開發中,如何實現類似於VSCode...
