ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • NodeJS 텔레그램 API를 이용한 오류 보고 프로그램
    프로그래밍/NodeJS 2019. 4. 21. 22:09
    반응형

    최근에 라즈베리파이가 랜섬웨어를 당하면서 대안책으로 하루마다 MySQL 데이터를 자동으로 구글드라이브로 백업하는 프로그램을 작성했습니다. (글 참고)


    다만 이 백업작업이 항상 제대로 작동하고 있는지 항상 구글드라이브에 직접 SQL파일을 확인하여야했는데 이 프로그램이 실행될 때 마다 휴대폰으로 알람을 받아보면 좋겠다는 생각을 하게되었습니다. 또한 포트폴리오 NodeJS 앱에서 오류가 발생하면 이 또한 휴대폰으로 알람을 받으면 좋겠다는 생각에서 시작하게 되었습니다.


    우선 앞서 작성한 Batch 파일에서 아래 코드를 추가시켜주었습니다.


    START http://expressme.herokuapp.com/telegram
    timeout /T 20 /nobreak >nul
    taskkill /IM chrome.exe /F


    코드를 설명하자면 URL로 Request를 전달하고 20초 후 크롬을 종료하는 아주 간단한 코드입니다. START 대신 hh를 대체해도 되지만 꼼수인것같아서 사용하지 않았습니다. Request를 보낸후 실행된 크롬을 종료시킵니다.


    관련 Stackoverflow 문서 :  Open a URL without using a browser from a batch file


    NodeJS 앱쪽 코드를 살펴보겠습니다.


    [server.js]

    const express = require("express");
    const router = express.Router();
    const request = require("request");
    const moment = require('moment-timezone');

    const telegramKey = process.env.telegramKey;


    router.get(`/`, function (req, res, next) {
    let timeData = moment().tz("Asia/Seoul").format('YYYY-MM-DD HH:mm:ss');
    let coreMessage = `MySQL Data BackUP Complete : ${timeData}`;
    request(`https://api.telegram.org/${telegramKey}/sendmessage?chat_id=550566016&text=${coreMessage}`)
    console.log('Finish');
    res.end();
    });

    module.exports = router;


    텔레그램 API 키의 경우 Heroku 환경 변수에서 따로 관리하기때문에 노출하지 않습니다. 그리고 서버 시간 기록을 위하여 moment 모듈을 사용하여 알람 올 내용을 저장합니다.


    [app.js]

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    // error handler
    app.use(function (err, req, res, next) {
      // set locals, only providing error in development
      res.locals.message = err.message;
      res.locals.error = req.app.get('env'=== 'development' ? err : {};
      console.log(err);
      // console.log(req.connection.remoteAddress.split(`:`).pop());
      let sender = req.connection.remoteAddress.split(`:`).pop();
      let errorMessage = err.message;
      let userAgent = req.get('User-Agent');
      let errorFrom = req.header('Referer');
      // Error Report SQL
      db.query(`INSERT INTO error (sender, userAgent, vendor, language, errorMessage, errorFrom) VALUES (?,?,?,?,?,?)`, [sender, userAgent, 'SYSTEM''SYSTEM', errorMessage, errorFrom]);
      const telegramKey = process.env.telegramKey;
      let timeData = moment().tz("Asia/Seoul").format('YYYY-MM-DD HH:mm:ss');
      let coreMessage = `ERROR TIME : ${timeData} ERROR MESSAGE : ${errorMessage} ERROR FROM : ${errorFrom} ERROR SENDER : ${sender}`;
      request(`https://api.telegram.org/${telegramKey}/sendmessage?chat_id=550566016&text=${coreMessage}`)
      // render the error page
      res.status(err.status || 500);
      res.render('error');
    });
    cs


    그리고 기존의 error를 처리하는 app.js 내에서 에러가 발생하면 MySQL에 오류내용을 저장하는 동시에 telegram API를 사용하여 에러 내용을 포함하고 있는 메세지를 보내줍니다.


    차례대로 MySQL 백업 메세지와 에러 내용이 담겨있는 메세지가 텔레그램으로 실시간으로 받음을 확인할수 있습니다.


    참고로 Telegram API는 간단하게 BotFather를 통해서 생성이 가능합니다. (참조) 



    반응형

    댓글

Designed by Tistory.