目錄
>現在我們準備構建該應用程序了。在繼續之前,我想簡要概述我們將如何實現該應用程序。將會有三個主要文件:一個用於服務器,一個用於Google日曆的緩存事件,一個用於提醒用戶。該服務器用於允許用戶登錄並獲得訪問令牌。這些事件將保存在MySQL數據庫中,並且將在.json文件中添加全局應用程序配置。 Node的CRON實現將用於執行緩存事件的任務並提醒用戶。
數據庫中有兩個表:用戶和約會。用戶表用於存儲用戶數據。在此應用程序的情況下,我們只能存儲一個用戶,只存儲訪問令牌。
時間
創建Cacher
我如何測試我的SMS約會提醒應用程序的功能?
>測試您的SMS預約提醒應用程序的功能對於確保其按預期工作至關重要。您可以使用Twilio的內置測試工具來模擬發送和接收消息。您也可以將單元測試框架(例如Jest或Mocha)用於JavaScript代碼。請記住測試所有功能,包括預約創建,提醒計劃和發送SMS。 。消息內容通常在您的服務器端代碼中定義。您可以對此進行修改以包括您想要的任何信息,例如約會時間,位置或與約會有關的任何其他詳細信息。
如果SMS未能發送?
我可以為多個用戶使用此應用程序嗎?是的,您可以將此應用用於多個用戶。您需要修改代碼以將約會與特定用戶相關聯,並確保將提醒發送到正確的電話號碼。這可能涉及在數據庫中添加用戶身份驗證和管理用戶數據。
我可以將此應用程序與我現有的調度系統集成嗎?您現有的調度系統。這將涉及修改代碼與系統的API或數據庫進行交互。確切的詳細信息將取決於調度系統的細節。
我可以向國際號碼發送提醒嗎?但是,您需要確保您遵守每個國家 /地區的SMS法規,並且成本可能高於國內消息。 🎜>您可以使用各種工具監視應用程序的性能。 Twilio為您的SMS使用情況提供分析,您可以使用服務器監視工具來跟踪服務器端代碼的性能。您還應該實施日誌記錄以幫助診斷出現的任何問題。
首頁 web前端 js教程 如何使用Twilio構建SMS約會提醒應用程序

如何使用Twilio構建SMS約會提醒應用程序

Feb 18, 2025 am 11:04 AM

如何使用Twilio構建SMS約會提醒應用程序

本文由馬克·沃勒(Marc Towler)和布魯諾·莫塔(Bruno Mota)審查。感謝SitePoint所有的同行評審員製作SitePoint內容的最佳功能! 在本教程中,我們將使用node.js構建SMS提醒應用程序。我們將使用用戶的Google日曆獲得約會,然後與Twilio一起發送短信。

>一如既往,您可以從GitHub repo中找到本教程中使用的代碼。

鑰匙要點

>使用Google和Twilio設置必要的帳戶,並啟用用於獲取約會的Google Calendar API等API。 >
    >實現OAuth 2.0以供用戶身份驗證,以安全地訪問Google日曆數據。 >
  • >使用MySQL數據庫存儲從Google Calendar獲取的用戶數據和約會詳細信息。
  • >使用node.js中的cron安排任務,以自動從Google日曆中獲取事件並通過Twilio發送SMS提醒。 處理錯誤,並確保在開發和部署應用程序期間對問題進行故障排除。
  • >設置內容
  • 首先,您需要擁有一個Google帳戶和一個Twilio帳戶。如果您還沒有這些,則可以繼續註冊。這是鏈接:
  • Google
twilio

>您不必擔心Twilio,可以免費嘗試。

    Google Console Project
  • >擁有Google帳戶後,請轉到Google控制台並創建一個新應用。默認情況下,Google Console頁面向您顯示了您使用的最新應用程序的儀表板。但是,如果您尚未從事任何項目,它將顯示以下內容:
  • >
>您可以單擊右上角的“選擇項目”菜單,然後選擇“創建項目”。這打開了一個模態窗口,該窗口允許您輸入項目的標題。

>

創建項目後,將顯示儀表板。從那裡,您可以單擊使用Google API,搜索Google Calendar API並啟用它。 >

>啟用API後,它將要求您創建憑據。單擊轉到憑據開始設置。這將向您顯示以下內容:

如何使用Twilio構建SMS約會提醒應用程序

單擊“添加憑據”按鈕,然後選擇OAuth 2.0客戶端ID。

>這將要求您首先配置同意屏幕。單擊配置同意屏幕。 如何使用Twilio構建SMS約會提醒應用程序

>輸入向用戶顯示的產品名稱的值,然後單擊“保存”。如何使用Twilio構建SMS約會提醒應用程序

>配置後,您現在可以創建客戶端ID。選擇應用程序類型的Web應用程序,留下默認名稱(如果需要),輸入http:// localhost:3000/登錄授權重定向的URIS,然後單擊創建。

如何使用Twilio構建SMS約會提醒應用程序>這打開了一個模式,該模態顯示客戶端ID和客戶端秘密。暫時注意這些注意事項,因為我們稍後將使用它們。

>

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框架。我們正在使用它來提供登錄頁面。
  • 時刻 - 日期和時間庫。我們正在使用它來輕鬆地格式化我們從Google Calendar API獲得的日期。
  • 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;
登入後複製
登入後複製
登入後複製
登入後複製
>附加功能負責將約會保存到約會表中。這接受了約會的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');
      }
    });

});
登入後複製
登入後複製
在包含選項的對像中,我們有以下內容:

>

  • auth - 這是OAuth2Client。這用於對請求進行身份驗證。
  • >
  • 日曆 - 我們將在其中獲得約會的日曆的ID。在這種情況下,我們使用的是主要日曆。 Google日曆實際上允許您創建許多日曆。其他人也可以向您分享他們的日曆。這些日曆中的每個日曆都有自己的ID。這就是我們在這裡指定的。如果您有興趣訪問其他日曆,請務必在日曆上查看API文檔。 > MaxResults - 您要返回的結果總數。
  • >單個事件 - 允許您指定是否僅返回單個一次性事件。在這裡,我們使用了True,這意味著重複發生的事件不會返回。
  • >
  • 訂單 - 允許您指定返回結果的順序。在這種情況下,我們使用了啟動時間,該開始時間根據其開始時間按順序訂購結果。僅當單個Events選項設置為true時才可用。
  • >
  • 所有這些選項以及許多其他選項都可以在事件中找到:列表文檔
  • >
>從數據庫中獲取access_token,並將其用於為oauth2client客戶端設置憑據。完成此操作後,創建一個新的CRON作業,該作業每天都會在午夜12點運行緩存方法。

創建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提醒應用程序。具體來說,我們研究瞭如何通過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中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

前端熱敏紙小票打印遇到亂碼問題怎麼辦? 前端熱敏紙小票打印遇到亂碼問題怎麼辦? Apr 04, 2025 pm 02:42 PM

前端熱敏紙小票打印的常見問題與解決方案在前端開發中,小票打印是一個常見的需求。然而,很多開發者在實...

神秘的JavaScript:它的作用以及為什麼重要 神秘的JavaScript:它的作用以及為什麼重要 Apr 09, 2025 am 12:07 AM

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

誰得到更多的Python或JavaScript? 誰得到更多的Python或JavaScript? Apr 04, 2025 am 12:09 AM

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

如何實現視差滾動和元素動畫效果,像資生堂官網那樣?
或者:
怎樣才能像資生堂官網一樣,實現頁面滾動伴隨的動畫效果? 如何實現視差滾動和元素動畫效果,像資生堂官網那樣? 或者: 怎樣才能像資生堂官網一樣,實現頁面滾動伴隨的動畫效果? Apr 04, 2025 pm 05:36 PM

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

JavaScript的演變:當前的趨勢和未來前景 JavaScript的演變:當前的趨勢和未來前景 Apr 10, 2025 am 09:33 AM

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

JavaScript難以學習嗎? JavaScript難以學習嗎? Apr 03, 2025 am 12:20 AM

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

如何使用JavaScript將具有相同ID的數組元素合併到一個對像中? 如何使用JavaScript將具有相同ID的數組元素合併到一個對像中? Apr 04, 2025 pm 05:09 PM

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

前端開發中如何實現類似 VSCode 的面板拖拽調整功能? 前端開發中如何實現類似 VSCode 的面板拖拽調整功能? Apr 04, 2025 pm 02:06 PM

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

See all articles