텔레그램 봇(Telegram Bot) 시작하기

Intro


몇년 전 부터 ‘핫’한 챗봇. 나도 한번 만들어보자. 하는 분들을위한 포스트.
Node.jsPython으로 쉽고 빠르고 간단하게 만들어보자.
카카*톡이나 페이스*메신져 등등 여러가지 채팅 프로그램이 있지만 나는 텔레그램(Telegram)이라는 어플을 이용하겠다. 다른 프로그램보다 확장성이나 사용 편의성, api등 장점이 많다고 판단해서이다. 다른 채팅 플랫폼도 방법의 차이일 뿐 기본적인 구성과 개념은 비슷하니 참고용으로 봐도 좋겠다.


Bot-Father


텔레그램을 설치했다면 봇을 만들어보자.
텔레그램에서 @botfather(봇들의 아버지)를 검색한다.

img1

채팅을 들어가서 /start라고 보내면 다음과 같은 메세지가 오면서 봇 파더의 사용법을 쭉 알려준다.

img2

우리는 새로운 봇을 만들 것 이기 때문에 /newbot이라고 입력해 준다. 그 뒤로 질문에 답해가면서 봇을 생성하자.
ex)봇의 이름, 봇의 id 등..

img3

이미 생성된 봇 id일 경우에는 위와같이 불가능하다고 뜨니 잘 확인해 보자.
성공적으로 생성되었다면 다음과 같은 메세지와 함께 봇의 TOKEN을 알려주는데 이 토큰은 우리가 봇을 관리하는데 필요한 암호와 같은 역할을 하기때문에 노출시키지 말고 따로 잘 보관하도록 하자.

img4

이제 봇은 만들어졌다. 만들때 입력했던 봇의 이름을 검색하면 뜬다. 이제 봇을 동작시킬 코드를 만들어보자.


Python 으로 시작하기


우선 파이썬으로 만들어보자. 평소 사용하는 에디터를 열고 프로젝트를 생성한다.
그리고 텔레그램 봇 공식 API를 사용해도 되지만 더 편리한 구현을 위해 패키지를 사용하자.

$pip install python-telegram-bot

설치가 끝나면 생성한 프로젝트에 파일을 만들어 본격적으로 작성 해 보자.

# 패키지를 임포트 해주자.
import telegram

bot = telegram.Bot(token='YOUR_TELEGRAM_BOT_TOKEN')

# 없어도 되지만 추가하면 좋다. 가장 마지막으로 bot과 채팅한 id를 지정하고 나중에 로그로 확인한 후 값을 넣어 주자.
chat_id = bot.getUpdates()[-1].message.chat.id

# 메세지 보내기
bot.sendMessage(chat_id=chat_id, text='Hello World')

이게 끝이다. 단 4줄로 봇을 완성했다 :)
이 파일을 crontab에 올려두고 돌리면 매 정시마다 알림을 보내주는 봇이 된다.


고작 이걸로 뭘 할수있겠어!

그렇다. 너무 간단해서 딱히 쓸모가 없다.
조금 더 나아가서 웹 페이지에 새 글 알림을 텔레그램으로 보내주는 봇을 만들어보자.

웹 크롤링 또는 웹 스크레이핑에 대한 기초적인 지식이 있다면 상관없지만 뭔지 모르겠다면 웹 크롤러 만들기 포스트들을 구경하고 오면 이해가 빠를 듯 하다.

우선 내 블로그를 테스트로 봇을 만들어 보자. 내 블로그의 글 목록은 Archive탭에 있다. 거기서 글들의 링크를 마우스 우클릭 후 검사를 해보자.

img5

이 링크의 위치는 'div' > 'ul' > 'li' > 'a' 이다.
아까 만든 파일을 불러와서 코드를 작성하자. 우선 필요한 패키지들을 설치한다.

$ pip install requests bs4


코드 작성. 크롤링 해온 글 데이터와 저장되어있는 데이터를 비교해서 다르다면 최신글이 업로드 된 것이기 때문에 알림을 보내고, 같다면 패스하는 코드.

import requests
from bs4 import BeautifulSoup
import os

bot = telegram.Bot(token='YOUR_TELEGRAM_BOT_TOKEN')
chat_id = bot.getUpdates()[-1].message.chat.id

# 페이지 URL
req = requests.get('https://cozy-ho.github.io/archive.html')

html = req.text
soup = BeautifulSoup(html, 'html.parser')
# 새 글의 위치
post = soup.find('div',{'class' : 'content'}).li

itsnew = post.text

with open('itsnew.txt','r+') as fread:
    before = fread.readline()
    if before != itsnew:
        # 라인을 읽어서 긁어온 데이터와 같으면 넘기고 다른경우 알림 메세지를 보낸다.
        bot.sendMessage(chat_id=chat_id, text='New post Uploaded!!')

# 최신 글 제목을 파일에 작성한다.    
with open('itsnew.txt','w+') as fwrite:
    fwrite.write(itsnew)
    fwrite.close()
    fread.close()


완성! 이제 crontab에 올려두고 원하는 시간간격으로 ‘1분마다, 5분마다, 매 시간 등등..’알림을 받을 수 있다.
더 기능을 넣자면 긁어온 데이터중 링크까지 메세지로 같이 보내 바로 볼수있게 만들거나, if문을 통해 원하는 키워드가 들어간 글이 올라왔을때만 알림을 받는 봇을 만들 수도 있다.


Node.js로 만들기


Node.js도 비슷하다 프로젝트 파일을 생성한 뒤 의존성 패키지들을 설치한다.
여기서는 노드를 통해 파이썬 스크립트를 불러와 방금 만들었던 파일을 그대로 실행시키는 코드를 작성하겠다.
자세한 API 사용법은 텔레그램 봇 API_doc를 참고하자.

$ npm install telegram-bot-api python-shell –save

설치한 뒤 main.js작성.

var telegram = require('telegram-bot-api');

const ps = reauire('python-shell');

//외부 스크립트 사용을위한 옵션값 지정
var options = {
    mode:'text',
    //리눅스 기준
    pythonPath: '/usr/bin/python',
    pythonOptions: ['-u'],
    scriptPath: '/root/telebot/test'
};

var chat_id = YOUR_CHAT_ID;

// 텔레그램 봇 설정
var api = new telegram({
    token : 'YOUR_BOT_TOKEN',
    updates:{
        enabled:true
    }
});

// 봇에게 Message가 왔을때 행동 작성
api.on('message', function(nessage){
    if(message.text.indexOf('hi') != -1 || message.text.indexOf('안녕') != -1){
        // 메세지에 'hi'나 '안녕'이 포함된 경우에 ~~
        api.sendMessage({
            chat_id: chat_id,
            text: '안녕하세요? :)'
        });
    }else if(message.text.indexOf('new') != -1 || message.text.indexOf('새글') != -1){
        // 메세지에 'new'나 '새글'이 포함된 경우에 ~~
        ps.PythonShell.run('test.py', options, function(err){
            // options를 참고해서 text.py라는 스크립트를 실행해라 ~~
            if(err) throw err;
            console.log('finished.');
        });
    }
});

api.sendMessage({
    // 프로그램 실행시 발송되는 메세지 작성
    chat_id: chat_id,
    text: '안녕하세요? 개인 비서 Jarvis 입니다.\n무엇을 도와드릴까요?'
});


Node를 이용해 간단히 만들어 보았다. 실행해 두고 필요할때 new 또는 새글있어?라고 메세지를 보내면 위에서 작성했던 파이썬 스크립트가 동작해 메세지를 보내준다.