Telegram 를 이용한 마이크로 알림 서비스 만들기

HJ MOON·2020년 8월 4일
1

무엇을 하고 싶은가?

첫번째는 서버에서 어떤 일이 일어났을때 관리자에게 텔레그램을 통해 경고,안내를 보내는것이다.

두번째는 일정 시각마다 데이터베이스로부터 특정한 값을 정리한뒤 텔레그램으로 알려주고 싶다. ( 이건 구글 클라우드 스케쥴러가 필요 )

백그라운드 알림을 무엇으로 보내지?**

간단한 리액트 어드민 프로젝트를 진행하다보니 간단한 수준의 알림 서비스가 필요하게 됐다.

웹앱 프로젝트 이기때문에 SMS, 카카오알림톡, PWA 등을 고려했다. 하지만 모두 탈락...

SMS: 유료
카카오알림톡 : 유료
프로그래시브웹앱(PWA): 서비스워커를 활용! 그러나.. iOS에서는 백그라운드 알림 불가

텔레그램 ??

일반 대중을 위한 서비스라면 절대 불가능하겠지만 관리자를 위한 서비스인데

관리자에게 텔레그램을 설치해달라고 요청해서

텔레그램을 알림 서비스로 활용하라고 하는것도 가능하지 않을까?

빠르게 세팅할 수 있고 무엇보다 무료다. 텔레그램봇을 생성해서 TOKEN을 얻는 방법은 수도없이 많이 포스팅되어있으므로 여기선

생략한다.

Google Cloud Functuons?

지금 진행중인 프로젝트는 프론트엔드 프로젝트이고 파이어베이스의 데이터베이스와 사용자인증을 사용하고

있어서 별도의 백엔드가 필요없었다. 하지만 봇으로 알림을 하려면 최소한 polling이든 웹훅이든 해줄 서버가 필요하다.

이럴때 쓰기 좋은것이 대표적인 서버리스 서비스인 Google Cloud Function이다. (비슷한 AWS Lamda 나 Netlify Functions를 써도 좋다.)

Telegraf를 사용해보자

https://telegraf.js.org/

텔레그램의 API를 그대로 사용해도 좋지만 npm에서 telegraf를 찾아냈다. 홈페이지에서 가져온 예시는 다음과 같다.

Example

const { Telegraf } = require('telegraf')

//env 환경변수에 우리가 봇파더에게 구해온 토큰을 넣으면 됩니다. 
const bot = new Telegraf(process.env.BOT_TOKEN)

bot.start((ctx) => ctx.reply('Welcome'))
bot.help((ctx) => ctx.reply('Send me a sticker'))
bot.on('sticker', (ctx) => ctx.reply('👍'))
bot.hears('hi', (ctx) => ctx.reply('Hey there'))
bot.launch()

아래 비교에서 알수있듯이 숏컷을 사용해서 기존 텔레그램 API를 간단하게 사용하게 해주고 가독성과 코딩속도를
높일 수 있습니다. npm에서 telegraf를 찾아서 설치해줍니다.

const bot = new Telegraf(process.env.BOT_TOKEN)

bot.on('text', (ctx) => {
  // 명시적 사용법
  ctx.telegram.sendMessage(ctx.message.chat.id, `Hello ${ctx.state.role}`)

  // 숏컷을 사용하면 이렇게 간단하게 줄일 수 있습니다. 
  ctx.reply(`Hello ${ctx.state.role}`)
})

이제 Google Cloud Functions 코드에 이식해봅니다. Functions 생성,배포 하는 방법은 다루지 않습니다. 해당 튜토리알을 참조하세요.



const functions = require("firebase-functions");
const admin = require("firebase-admin"); // 파이어베이스에 접근하기 위해서 필요합니다. 
const Telegraf = require('telegraf')

// 구글클라우드펑션은 별도의 토큰,키 관리방법을 제시합니다.  
// 설정방법은 다음과 같습니다. 터미널에서 >firebase functions:config:set someservice.key="THE API KEY"
// https://firebase.google.com/docs/functions/config-env 참조

const bot = new Telegraf(functions.config().telegrambot.key);

// hi 라고 말하면 응답하는 설정을 생성하고 bot을 launch합니다. 이렇게 아래 두줄입니다. 

bot.hears('hi', (ctx) => ctx.reply('Hey there'))
bot.launch()

// 텔레그램으로 발송할 가공된 데이터 예시 ( 누구에게 보낼지 텔레그램 chat_id를 얻어와야합니다.)  

const user = {name:"익명",telegram:"736048139"}
const dataArr = [{a:1},{a:1},{a:1}]

// telegram api 를 이용해 메시지 보내기

bot.telegram.sendMessage(user.telegram,`${userMock.name}님 ${dataArr.length}건의 확인할 내역이 있습니다.`)

사실 여기까지만 할거면 Telegraf는 필요없지만, 봇을 본격적으로 활용하기위해서 Telegraf를 설치했습니다.
다음 포스트에선 봇을 활용해 데이터베이스로부터 값을 반환받아 보겠습니다.

TIP telegraf에 의해 '생성'된 bot객체는 telegram객체를 가지고 있으므로
telegram의 API를 사용하려면 bot.telegram.<TELEGRAM_APINAME> 와 같은 형태로 접근할 수 있습니다. 위 코드에서는 bot.telegram.sendMessage(chat_id,message)에서 사용했습니다.

profile
@_@ 빠르게 변하는 세상

0개의 댓글