Xây dựng app theo dõi covid bằng NodeJS – Phần 3


1057

Trước khi đọc phần 3, hãy đọc trước phần 1 và phần 2:

Xây dựng app theo dõi covid bằng NodeJS – Phần 1

Xây dựng app theo dõi covid bằng NodeJS – Phần 2

Sử dụng Twilio API

Twilio cung cấp nhiều dịch vụ, và API SMS là một trong số đó. Sử dụng API SMS Twilio, chúng ta có thể thêm dịch vụ SMS trong ứng dụng web covid. Và đó sẽ là điều trọng tâm trong bài viết này.

Để sử dụng API SMS Twilio, tạo một tài khoản trên trang web Twilio và mua number hỗ trợ SMS. Twilio cung cấp số miễn phí với một số hạn chế.

Nhưng may mắn thay,hiện tại với #DevTwilioHackathon, họ đang cung cấp 20 $ miễn phí bằng cách sử dụng mã khuyến mãi DEVHACK20. Tôi đã mua một number với mã khuyến mãi này.

Và bây giờ, truy cập bảng điều khiển trên trang web twilio, sẽ nhận được ‘ACCOUNT SID” và ‘AUTH TOKEN’ để kết nối với API Twilio. Thêm nó vào tệp .env trong thư mục dự án vì không muốn bất cứ ai có thể nhìn thấy nó.

Image for post

Để sử dụng API twilio trong ứng dụng, chúng ta cần Twilio Helper Library. Cài đặt theo câu lệnh sau

npm install twilio

Bây giờ, Twilio cung cấp các đoạn code để kết nối với API khác nhau bằng nhiều ngôn ngữ lập trình khác nhau, và sử dụng để kết nối với twilio api.

const accountSid = process.env.ACCOUNT_SID;
const authToken = process.env.AUTH_TOKEN;
const client = require('twilio')(accountSid, authToken);
client.messages
  .create({
     body: 'Thank you for your registration. You will receive Corona-Virus updates everyday.To stop the service reply with "STOP"',
     from: process.env.PHN_NUM,
     to: // user's mobile number (with country code).
   })
  .then(message => console.log(message.sid));

Thêm đoạn code này vào route/ users / add_user để bất cứ khi nào người dùng mới được thêm vào cơ sở dữ liệu, hệ thống sẽ gửi SMS cho người dùng. Dưới đây là SMS mẫu mà ứng dụng gửi cho người dùng.

Image for post

Lấy dữ liệu từ API bên ngoài NodeJS

Ở phần này, chúng ta muốn gửi các bản cập nhật trường hợp covid cho người dùng nhưng chúng ta lấy dữ liệu từ đâu? Đó là từ API bên ngoài. Có rất nhiều bộ dữ liệu Virus có sẵn công khai trực tuyến.

Chúng ta sử dụng api.covid19india.org để lấy dữ liệu vì nó được cộng đồng hóa vàdựa trên dữ liệu được tuyên bố bởi các Chính phủ các nước nên là một nguồn dữ liệu đáng tin cậy. Và liên tục cập nhật mỗi 5 phút, vì vậy chúng ta sẽ nhận được các bản cập nhật mới nhất.

Ngoài ra, api này không yêu cầu xác thực gì cả

Trong NodeJS, không thể sử dụng fetch như javascript phía client, nhưng có một package npm làm dược điều đó. Vì vậy, hãy cài đặt nó.

Cài đặt node-fetch

npm install node-fetch

Bây giờ, thêm một tệp mới trong thư mục dự án có tên là script.js. Và thêm code để lấy dữ liệu từ api và sử dụng chúng

const fetch = require("node-fetch");
const get_data = async () => {
  cases = {};
  await fetch("https://api.covid19india.org/data.json")
    .then((res) => {
      return res.json();
    })
    .then((data) => {
      data_array = data.statewise;
      total_obj = data_array.filter((data) => data.state === "Total")[0];
      gj_obj = data_array.filter((data) => data.state === "Gujarat")[0];
      mh_obj = data_array.filter((data) => data.state === "Maharashtra")[0];
      cases.total_cases = total_obj.confirmed;
      cases.total_new = total_obj.deltaconfirmed;
      cases.mh_total = mh_obj.confirmed;
      cases.mh_new = mh_obj.deltaconfirmed;
      cases.gj_total = gj_obj.confirmed;
      cases.gj_new = gj_obj.deltaconfirmed;
    })
    .then();
  return cases;
};

Được rồi, để tôi giải thích một chút. Ở đây, chúng ta đang lấy dữ liệu của tiểu bang từ api và nó trả về một loạt các đối tượng trong đó có nhiều thuộc tính như tổng số trường hợp, trường hợp mới, tổng số người chết, số người chết mới, tổng số đã phục hồi, v.v.

Chúng ta muốn tìm tổng số trường hợp và trường hợp mới ở các tiểu bang. Tôi chỉ hiển thị 2 tiểu bang (Gujarat & Maharashtra) và có thể làm tương tự cho bất kỳ tiểu bang nào để có thể nhận được cùng một dữ liệu cho tất cả các bang của Ấn Độ.

Vì vậy, tôi đã tạo ra một object có tên là ‘cases’ và trong đối tượng này, tôi đã thêm 6 key, cụ thể là‘ Total_case, ‘Total_new, ‘mh_total’, ‘mh_new’, ‘gj_total’, ‘gj_new’ và các giá trị của chúng đưa ra số lượng Tổng số vụ tại Ấn Độ

Gửi thông tin covid cho người dùng theo nhà nước của họ

Chúng ta gửi một thông điệp riêng biệt tới người dùng theo tiểu bang, nếu người dùng đã đăng ký với tiểu bang ‘Gujarat, thì chỉ gửi thông tin cập nhật về các trường hợp ở Gujarat và ở Ấn Độ. Vì vậy, để làm điều đó, tạo hai thông điệp khác nhau để gửi cho người dùng và cho tất cả người dùng trong cơ sở dữ liệu.

Chúng ta sẽ kiểm tra trạng thái và gửi tin nhắn cho họ. Tạo hàm get_users để lấy số điện thoại di động của người dùng. Và chia chúng thành các mảng khác nhau tùy theo tiểu bang của họ.

const User = require("../models/User"); // To retrieve users from the Database.
const get_users = async () => {
  let numbers = {};
  // Getting all the active users from the Database
  const active_users = await User.find({
    active: true,
  });
  // Getting an array of numbers of Active Users in Gujarat
  guj_users_num = active_users
    .filter((user) => user.state === "Gujarat")
    .map((user) => user.number);
  // Getting an array of numbers of Active Users in Gujarat
  mh_users_num = active_users
    .filter((user) => user.state === "Maharashtra")
    .map((user) => user.number);
  numbers.MH = mh_users_num;
  numbers.GJ = guj_users_num;
  return numbers;
};

Trước tiên chúng ta sẽ lấy được tất cả người dùng đang hoạt động từ cơ sở dữ liệu. Và chèn số điện thoại di động vào các mảng khác nhau. Sau đó thêm mảng đó vào object ’numbers’ với key tương ứng.

Bây giờ, tạo hàm send_msg () để tạo và gửi tin nhắn cho người dùng bằng API Twilio.

const send_msg = async () => {
  // Getting Users' Mobile Numbers And Data From API.
  const users_num = await get_users();
  const cases_data = await get_data();
  // Message For Gujarat Users
  const gj_msg = `Total Cases In India: ${cases_data.total_cases} \n Total Cases In Gujarat: ${cases_data.gj_total} \n New Cases In India: ${cases_data.total_new} \n New Cases In Gujarat: ${cases_data.gj_new} \n #StayHome #StaySafe`;
  // Message For Maharashtra Users
  const mh_msg = `Total Cases In India: ${cases_data.total_cases} \n Total Cases In Maharashtra: ${cases_data.mh_total} \n New Cases In India: ${cases_data.total_new} \n New Cases In Maharashtra: ${cases_data.mh_new} \n #StayHome #StaySafe`;
  // Sending Messages To Users In Gujarat
  users_num.GJ.forEach((user) => {
    client.messages
      .create({
        body: gj_msg,
        from: process.env.PHN_NUM,
        to: "+91" + user,
      })
      .then((msg) => console.log(msg.sid))
      .catch((err) => console.log(err));
  });
  // Sending Messages To Users In Maharashtra
  users_num.MH.forEach((user) => {
    client.messages
      .create({
        body: mh_msg,
        from: process.env.PHN_NUM,
        to: "+91" + user,
      })
      .then((msg) => console.log(msg.sid))
      .catch((err) => console.log(err));
  });
};

Lập lịch gửi SMS tự động

Chúng ta sẽ gửi tin nhắn cho người dùng nhưng làm cách nào để chúng tôi lên lịch gửi tự động vào một thời điểm cụ thể? Cron Jobs! Package node-cron giúp lên lịch công việc để thực hiện tại một thời điểm cụ thể. Hãy cài đặt theo câu lệnh sau

npm install node-cron

Method lập lịch của mô-đun cron có hai arguments. Đầu tiên là thời gian và thứ hai là hàm muốn lên lịch. Tôi đã đặt thời gian là 9 giờ sáng. và 8 giờ tối hàng ngày.

Và bây giờ, phải gọi phương thức task.start () trong tệp app.js máy chủ khởi động như thế này.

const script = require("./script");
app.listen(process.env.PORT || 3000, () => {
  script.tasks.start();
});

Bây giờ khi deploy ứng dụng lên máy chủ. Nó sẽ tự động gửi SMS đến user vào lúc 9 giờ sáng và 8 giờ tối. Sử dụng dữ liệu được lấy bởi api bên ngoài. Tin nhắn sẽ như hình sau

Image for post

Kết luận

Bingo! Chúng ta đã tạo ra một ứng dụng đầy đủ chức năng đăng ký người dùng và gửi cho họ các bản cập nhật trường hợp tự động hàng ngày. Bây giờ trong bài đăng tiếp theo, chúng ta sẽ thêm chức năng nhận tin nhắn cho người dùng trong trường hợp họ muốn dừng dịch vụ và sau đó chúng ta sẽ deploy ứng dụng lên máy chủ heroku.

Tham khảo thêm NodeJS tại đây : Cách xử lý timer trong NodeJS


Like it? Share with your friends!

1057