seperti biasa, anda boleh mencari kod yang digunakan dalam tutorial ini dari repo github.
Takeaways Key
Projek Konsol Google
dari sana anda boleh mengklik menu Pilih Projek di sudut kanan atas dan pilih Buat Projek. Ini membuka tetingkap modal yang membolehkan anda memasuki tajuk projek.
Setelah projek dibuat, papan pemuka dipaparkan. Dari sana anda boleh mengklik penggunaan API Google, cari API Kalendar Google dan membolehkannya.
Setelah API diaktifkan, ia akan meminta anda untuk membuat kelayakan. Klik pergi ke kelayakan untuk mula menetapkannya. Ini akan menunjukkan kepada anda perkara berikut:
Klik pada butang Tambah Kelayakan kemudian pilih OAuth 2.0 Client ID.
masukkan nilai untuk nama produk yang ditunjukkan ke medan teks Pengguna dan klik Simpan.
Setelah itu dikonfigurasikan, anda kini boleh membuat ID klien. Pilih aplikasi web untuk jenis aplikasi, tinggalkan nama lalai (jika anda mahu), masukkan http: // localhost: 3000/login untuk uris redirect yang diberi kuasa kemudian klik Buat.
Ini membuka modal yang memaparkan ID pelanggan dan rahsia pelanggan. Perhatikan mereka buat masa ini kerana kami akan menggunakannya kemudian.
Sebaik sahaja anda telah membuat akaun Twilio, pergi ke halaman Tetapan dan perhatikan nilai -nilai untuk AccountSID dan Authtoken di bawah kelayakan API secara langsung.
seterusnya pergi ke papan pemuka suara yang boleh diprogramkan. Di sinilah anda dapat melihat nombor kotak pasir. Anda boleh menggunakan nombor ini untuk menguji Twilio. Tetapi kemudian anda perlu membeli nombor telefon supaya mesej teks yang dihantar oleh Twilio tidak akan mempunyai "dihantar dari Twilio Sandbox" ditambah kepadanya. Satu lagi had nombor kotak pasir Twilio ialah ia hanya boleh digunakan dengan nombor yang disahkan. Yang bermaksud anda perlu mendaftarkan nombor telefon dengan Twilio untuk menghantar mesej kepadanya. Anda boleh melakukan ini dari halaman IDS Urus Pemanggil.
Sekarang kami sudah bersedia untuk membina aplikasinya. Sebelum kami meneruskan, saya ingin memberikan gambaran ringkas tentang bagaimana kami akan melaksanakan aplikasinya. Akan ada tiga fail utama: satu untuk pelayan, satu untuk acara caching dari Google Calendar dan satu untuk mengingatkan pengguna. Pelayan digunakan untuk membenarkan pengguna log masuk dan mendapatkan token akses. Acara akan disimpan dalam pangkalan data MySQL dan konfigurasi aplikasi global akan ditambah dalam fail .json. Pelaksanaan Node Cron akan digunakan untuk melaksanakan tugas untuk acara caching dan mengingatkan pengguna.
di direktori kerja anda, buat fail pakej.json dan tambahkan yang berikut:
{ "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" } }
Dalam fail ini, kami menentukan nama dan versi perpustakaan yang bergantung kepada aplikasi kami. Berikut adalah pemecahan penggunaan untuk setiap perpustakaan:
Jalankan NPM Pasang dari terminal anda untuk memasang semua kebergantungan.
Terdapat dua jadual dalam pangkalan data: pengguna dan pelantikan. Jadual Pengguna digunakan untuk menyimpan data pengguna. Dalam kes aplikasi ini, kami hanya akan menyimpan satu pengguna, dan hanya token akses disimpan.
Jadual pelantikan digunakan untuk menyimpan acara yang kami dapat dari API Kalendar Google. Perhatikan bahawa ia tidak mempunyai medan user_id di dalamnya kerana kami hanya mempunyai satu pengguna. Dan kita akan mengambil semua baris yang mempunyai sifar sebagai nilai untuk medan yang diberitahu.
Berikut adalah templat, pastikan untuk mengisi semua bidang.
{ "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" } }
Pangkalan data
Ini menggunakan Perpustakaan Config untuk mendapatkan nilai konfigurasi yang telah kami tambahkan lebih awal pada fail Config/Default.json. Khususnya kami mendapat konfigurasi pangkalan data supaya kami dapat menyambung ke pangkalan data. Kemudian kami mengeksport modul ini supaya kami dapat menggunakannya kemudian dari fail lain.
fail time.js digunakan untuk menetapkan zon waktu lalai dengan perpustakaan momen-timeZone. Kami juga mengeksport nilai untuk zon waktu kerana kami akan menggunakannya kemudian apabila menjalankan dua tugas kron (acara caching dan pengguna memberitahu).
{ "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;
Pertama kami mengimport modul Google dan DB yang telah kami buat sebelum ini.
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'); } }); });
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 bertanggungjawab untuk menyimpan pelantikan pengguna ke dalam pangkalan data. Ini menghalang kita daripada perlu menanyakan direktori API Kalendar Google setiap kali kita menghantar peringatan. Buat fail Cache.js dan tambahkan yang berikut:
{ "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" } }
Breaking It Down:
pertama kita mengimport semua modul yang kita perlukan.
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;
Fungsi AddPointment bertanggungjawab untuk menyelamatkan pelantikan ke dalam jadual pelantikan. Ini menerima Event_ID, Ringkasan, Mula dan Akhir DateTime pelantikan. Event_id pada dasarnya adalah ID pelantikan khusus dalam Kalendar Google. Kami menggunakannya sebagai nilai untuk kunci utama, yang bermaksud bahawa pendua tidak akan dimasukkan ke dalam jadual pelantikan. Apa yang kurang di sini adalah cara untuk membandingkan pelantikan yang sudah ada dalam pangkalan data dan yang dikembalikan oleh API. Jika atas sebab tertentu jadual pelantikan berubah, pangkalan data tidak akan dikemas kini kerana semua yang kami lakukan di sini adalah memasukkan ke dalam jadual. Saya akan meninggalkannya untuk senarai todo anda.
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;
Fungsi GetEvents bertanggungjawab untuk gelung melalui semua pelantikan yang dikembalikan oleh API. Ini menggunakan kaedah tambahan untuk menyelamatkan pelantikan untuk setiap lelaran gelung.
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;
Kaedah cache adalah yang membuat panggilan sebenar ke API Kalendar Google. Ini adalah melalui penggunaan klien Google. Di sini kami memanggil kaedah senarai pada objek kalendar.Events. Ini menerima dua hujah: Pertama adalah objek yang mengandungi pilihan untuk pertanyaan dan yang kedua adalah fungsi yang akan dilaksanakan sebaik sahaja hasilnya dikembalikan.
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'); } }); });
Dalam objek yang mengandungi pilihan, kami mempunyai yang berikut:
Semua pilihan ini dan banyak lagi boleh didapati dalam acara: Senarai Dokumentasi
Dapatkan akses_token dari pangkalan data dan gunakannya untuk menetapkan kelayakan untuk klien OAuth2Client. Sebaik sahaja itu selesai, buat kerja kron baru yang akan menjalankan kaedah cache setiap hari pada 12 tengah malam.
{ "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" } }
Terakhir tetapi tidak kurang kita mempunyai pemberitahuan (notify.js). Ini bertanggungjawab untuk mendapatkan pelantikan dari pangkalan data dan menentukan jika mereka masak untuk pemberitahuan. Sekiranya mereka, maka kami menghantarnya.
{ "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" } }
Breaking It Down:
mengimport semua modul yang diperlukan.
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;
Buat fungsi updateAppointment. Ini menerima ID pelantikan sebagai hujahnya. Apa yang dilakukan adalah menetapkan nilai untuk medan yang diberitahu kepada 1 yang bermaksud bahawa pemberitahuan untuk pelantikan tertentu telah dihantar.
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;
Seterusnya kita mempunyai fungsi Sendnotifications. Ini bertanggungjawab untuk benar -benar menghantar peringatan teks dengan Twilio. Fungsi ini akan dipanggil selepas mengambil pelantikan dari pangkalan data. Itulah sebabnya ia mempunyai ralat, keputusan, dan argumen Fields yang disampaikan ke dalamnya. Ralat mengandungi sebarang ralat dari pangkalan data. Keputusan mengandungi baris yang dikembalikan dari pangkalan data. Dan medan mengandungi maklumat mengenai medan hasil yang dikembalikan.
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;
di dalam fungsi kami mendapat nombor telefon pengguna dari konfigurasi aplikasi.
{ "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" } }
semak jika terdapat sebarang kesilapan dan jika tidak ada yang meneruskan dengan gelung melalui semua hasil yang dikembalikan.
{ "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" } }
Di dalam gelung kita mengekstrak semua nilai yang kita perlukan dan membina mesej sebenar yang akan dihantar. Kami juga mendapat perbezaan jam antara masa semasa dan masa permulaan pelantikan. Kami periksa sama ada perbezaan jam kurang daripada atau sama dengan 24 jam.
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;
Jika kurang daripada atau sama dengan 24 jam, kami menghantar pemberitahuan. Ini adalah melalui penggunaan pelanggan Twilio. Kami memanggil SendMessage dan lulus dalam objek yang mengandungi kepada (nombor telefon pengguna), dari (nombor sandobox Twilio atau nombor telefon yang anda beli dari Twilio), dan badan yang mengandungi mesej teks. Sekiranya tidak ada kesilapan yang dikembalikan, kami mengandaikan bahawa pemberitahuan telah dihantar. Oleh itu, kami memanggil fungsi updateAppointment untuk menetapkan medan yang diberitahu kepada 1, jadi ia tidak akan dipilih pada masa akan datang tugas dijalankan.
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;
Akhirnya kita mempunyai kaedah permulaan. Apa yang dilakukannya ialah memilih semua pelantikan dari jadual pelantikan yang pemberitahuannya belum dihantar. Fungsi ini akan dilaksanakan setiap 12 tengah hari dan 6 petang.
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;
Itu sahaja! Dalam tutorial ini, anda telah belajar bagaimana untuk membuat aplikasi peringatan SMS dengan Twilio. Khususnya kami telah melihat bagaimana untuk mendapatkan pelantikan pengguna melalui API Kalendar Google. Kami telah menyelamatkan mereka dalam pangkalan data dan memberitahu pengguna melalui Twilio. Anda boleh mencari kod yang digunakan dalam tutorial ini dari repo GitHub.
Bolehkah saya menyesuaikan mesej peringatan dalam aplikasi? . Kandungan mesej biasanya ditakrifkan dalam kod pelayan anda. Anda boleh mengubah suai ini untuk memasukkan sebarang maklumat yang anda mahukan, seperti masa pelantikan, lokasi, atau butiran lain yang berkaitan dengan pelantikan. Peringatan penjadualan untuk zon masa yang berbeza boleh menjadi agak rumit. Anda perlu menyimpan maklumat zon waktu untuk setiap pelantikan dan menggunakannya apabila menjadualkan peringatan. Objek tarikh JavaScript boleh mengendalikan penukaran zon waktu, atau anda boleh menggunakan perpustakaan seperti momen.js untuk senario yang lebih kompleks.
Seberapa selamat data dalam aplikasi ini? Twilio menyediakan saluran komunikasi yang selamat, tetapi anda juga perlu memastikan bahawa pelayan dan pangkalan data anda selamat. Ini mungkin melibatkan menggunakan protokol selamat, menyulitkan data sensitif, dan mengikuti amalan terbaik untuk keselamatan web. sistem penjadualan anda yang sedia ada. Ini akan melibatkan mengubah kod untuk berinteraksi dengan API atau pangkalan data sistem anda. Butiran tepat bergantung kepada spesifik sistem penjadualan anda.
Atas ialah kandungan terperinci Cara Membina Aplikasi Peringatan Pelantikan SMS dengan Twilio. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!