텔레그램 봇(Telegram Bot) 시작하기
Intro
몇년 전 부터 ‘핫’한 챗봇. 나도 한번 만들어보자. 하는 분들을위한 포스트.Node.js
와 Python
으로 쉽고 빠르고 간단하게 만들어보자.
카카*톡이나 페이스*메신져 등등 여러가지 채팅 프로그램이 있지만 나는 텔레그램(Telegram)이라는 어플을 이용하겠다. 다른 프로그램보다 확장성이나 사용 편의성, api등 장점이 많다고 판단해서이다. 다른 채팅 플랫폼도 방법의 차이일 뿐 기본적인 구성과 개념은 비슷하니 참고용으로 봐도 좋겠다.
Bot-Father
텔레그램을 설치했다면 봇을 만들어보자.
텔레그램에서 @botfather
(봇들의 아버지)를 검색한다.
채팅을 들어가서 /start
라고 보내면 다음과 같은 메세지가 오면서 봇 파더의 사용법을 쭉 알려준다.
우리는 새로운 봇을 만들 것 이기 때문에 /newbot
이라고 입력해 준다. 그 뒤로 질문에 답해가면서 봇을 생성하자.
ex)봇의 이름, 봇의 id 등..
이미 생성된 봇 id일 경우에는 위와같이 불가능하다고 뜨니 잘 확인해 보자.
성공적으로 생성되었다면 다음과 같은 메세지와 함께 봇의 TOKEN
을 알려주는데 이 토큰은 우리가 봇을 관리하는데 필요한 암호와 같은 역할을 하기때문에 노출시키지 말고 따로 잘 보관하도록 하자.
이제 봇은 만들어졌다. 만들때 입력했던 봇의 이름을 검색하면 뜬다. 이제 봇을 동작시킬 코드를 만들어보자.
Python 으로 시작하기
우선 파이썬으로 만들어보자. 평소 사용하는 에디터를 열고 프로젝트를 생성한다.
그리고 텔레그램 봇 공식 API를 사용해도 되지만 더 편리한 구현을 위해 패키지를 사용하자.
$pip install python-telegram-bot
설치가 끝나면 생성한 프로젝트에 파일을 만들어 본격적으로 작성 해 보자.
1
2
3
4
5
6
7
8
9
10
11
# 패키지를 임포트 해주자.
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
탭에 있다. 거기서 글들의 링크를 마우스 우클릭 후 검사를 해보자.
이 링크의 위치는 'div' > 'ul' > 'li' > 'a'
이다.
아까 만든 파일을 불러와서 코드를 작성하자. 우선 필요한 패키지들을 설치한다.
$ pip install requests bs4
코드 작성. 크롤링 해온 글 데이터와 저장되어있는 데이터를 비교해서 다르다면 최신글이 업로드 된 것이기 때문에 알림을 보내고, 같다면 패스하는 코드.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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://yuta-97.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
작성.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
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
또는 새글있어?
라고 메세지를 보내면 위에서 작성했던 파이썬 스크립트가 동작해 메세지를 보내준다.