[챗봇 만들기] 30분 만에 텔레그램 봇 만들기

in #kr-dev7 years ago (edited)

08chatbot.jpg

  어제의 준비편 에서 이어지는 내용입니다. 환경 구축의 난이도에 비하면 봇 만드는건 일도 아닙니다. 자세한건 몰라도 됩니다. 결과만 얻으면 만사 오케이인 것이죠!

추가 준비물은 모바일 기기에 설치된 텔레그램입니다.

자, 준비 되셨나요? 같이 가봅시다!

텔레그램 봇 아이디 발급 받기


  봇도 하나의 계정이기 때문에 갑자기 솟아나지 않습니다. 그렇다고 해서 전화번호나 새로운 기기가 필요한 것이 아닙니다. 봇 생성을 지원해주는 시스템이 텔레그램에 마련되어있기 때문이지요.

텔레그램의 대화방 탭에서 BotFather를 검색합니다.

IMG_1946.PNG

BotFather를 선택하면 안내문이 나타납니다. 이 글에서 다루지 않은 상세한 기능을 개발하실 때 여기서 안내하는 메뉴얼을 참고하실 수 있습니다.

시작을 누르면 BotFather를 이용하여 봇을 관리할 수 있는 각종 메세지들이 나타납니다. /newbot을 입력하여 봇을 생성합시다.

/newbot

Alright, a new bot. How are we going to call it? Please choose a name for your bot.

봇의 이름(대화명)을 물어봅니다. 저는 언젠가 로봇비서들이 제 수발을 들어줄 세상이 올 것이라 믿고 있습니다. 아이언맨의 자비스 시스템처럼요. 물론 전 자비스보다 쵸비츠의 치이 같은 로봇이 더 좋습니다. 그래서 치이라고 짓겠습니다.

chii.jpg
글쓴이의 연령대를 알 수 있다.

치이

Good. Now let's choose a username for your bot. It must end in 'bot'. Like this, for example: TetrisBot or tetris_bot.

이제 봇의 계정명을 만들어줘야합니다. 이 때, 실제 유저와 봇을 구분하고 비매너 행위를 방지하기 위해 봇의 계정명은 bot 이라는 단어로 끝이 나야하는 제약조건이 있습니다.

chii_bot

Sorry, this username is already taken. Please try something different.

누가 쓰고 있다고 하네요. 계정명은 그렇게 중요하지 않으니 안겹칠만하게 지어줍니다.

queenchii_bot

Done! Congratulations on your new bot. (이하 생략)

이런 메세지를 받았다면 성공하신 것입니다. 이 메세지의 끝부분을 보면 아래와 같은 형식의 HTTP API 키가 있습니다. 이를 잘 보관해주세요.

Use this token to access the HTTP API: 123456789:ABCDEFGHIJKLMN

봇에게 나를 알려주기


봇이 저에게 메세지를 보낼 수 있게 하려면 숫자로 된 제 아이디를 알려줘야합니다. 봇을 실행시킨 후에 봇에게 아무 말이나 던지면 그 기록을 가져와서 아이디를 얻을 수 있습니다. 그래서 아무 기능 없이 봇만 실행해서 아이디를 가져오도록 하겠습니다.

만들었던 봇을 검색해서 아무 말이나 던져주세요.


IMG_1948.PNG


IMG_1949.PNG

텔레그램 봇을 다루려면 관련 패키지를 설치해야합니다. 저번 글을 참조해서 Anaconda Prompt를 실행해주세요.

우선 만들었던 가상환경을 활성화합니다.
activate py36_maanya

그리고 telegram 패키지를 설치합니다.
pip install python-telegram-bot --upgrade

01.PNG
이렇게 나오면 성공입니다.

  이제 PyCharm을 실행해서 어제 만들었던 프로젝트를 가져옵니다. ChatBot.py에 아래와 같이 코드를 작성하고 실행해주세요. 토큰 부분은 여러분이 발급받으신 토큰을 써주시면 됩니다.

import telegram

chii_token = '123456789:ABCDEDFGHIJKLMNOPQRST'
chii = telegram.Bot(token = chii_token)
updates = chii .getUpdates()
for u in updates:
    print(u.message)


  첫 실행에선 에러를 받을 수도 있습니다. 다시 실행해주시면 정상적으로 동작하며, 메세지가 나타날 때까지 텔레그램에서 말을 걸고 프로그램을 실행하는 것을 반복해주세요. 그럼 PyCharm에서 아래와 같은 글을 받을 수 있습니다.

{'message_id': 3, 'date': 1519112346, 'chat': {'id': 1234567, 'type': 'private', 'first_name': '아냐, 'last_name': '마'}, 'text': '앞구르기 해줘', (이하 생략) }

  여기서 chat에 있는 id 1234567와 같은 형태가 대화 아이디 입니다. 이걸 기억해주세요.

  위의 글은 (first, lastname)마아냐 라는 사람이 (text) '앞구르기 해줘' 라고 (type)개인채팅으로 (date)1519112346 시간에 이야기 했다는 뜻이고 대화방의 (message_id)3번째 메시지라는 뜻입니다.

생략된 정보는 더 많습니다.
이제 대화 아이디도 알았으니 본격적으로 만들어봅시다.

봇에게 기능 만들어주기


  어제 만들었던 ChatBot.py 외에 ChatBotModel.py 를 하나 더 생성해주세요. ChatBot.py 에는 봇 기능에 관련된 코드를 작성할 것이고 ChatBotModel.py에는 봇의 토큰이나 초기화와 관련된 코드를 작성해둘 것입니다. 추후에 여러 봇을 관리하게 편하게요.

ChatBotModel.py

  먼저 모든 텔레그램 봇은 시작과 종료 기능이 있겠지요. 모든 텔레그램 봇이 사용할만한 기능들을 담은 토대를 만듭니다.
  저는 초기화 함수, 메세지 보내는 함수, 종료 함수를 기초 클래스로 만들어 넣었어요.

  • self.id 에 위에서 얻은 대화 아이디를 넣어주세요.
import telegram
from telegram.ext import Updater, CommandHandler

class TelegramBot:
    def __init__(self, name, token):
        self.core = telegram.Bot(token)
        self.updater = Updater(token)
        self.id = 123456789
        self.name = name

    def sendMessage(self, text):
        self.core.sendMessage(chat_id = self.id, text=text)

    def stop(self):
        self.updater.start_polling()
        self.updater.dispatcher.stop()
        self.updater.job_queue.stop()
        self.updater.stop()


   기초 클래스를 기반으로 시작 함수를 포함한 치이 봇을 작성해줍니다. 이어서 복사 붙여넣기 해주세요.

  • self.token 에 발급 받으신 토큰을 넣어주세요.
class BotChii(TelegramBot):
    def __init__(self):
        self.token = '123456789:ABCDEFGHIJKLMN'
        TelegramBot.__init__(self, '치이', self.token)
        self.updater.stop()

    def add_handler(self, cmd, func):
        self.updater.dispatcher.add_handler(CommandHandler(cmd, func))

    def start(self):
        self.sendMessage('치이 봇이 잠에서 깨어납니다.')
        self.updater.start_polling()
        self.updater.idle()




ChatBot.py

ChatBotModel 에서 작성한 치이 봇의 기본 기능입니다.

  • start (시작)
  • sendMessage (나에게 메세지 보내기)
  • add_handler(기능 추가)
  • stop (종료)

이를 바탕으로 치이 봇에게 앞구르기(rumbling) 명령어를 추가하고 실행해봅시다.

import sys
import ChatBotModel

def proc_rolling(bot, update):
    chii.sendMessage('데구르르..')
    sound = firecracker()
    chii.sendMessage(sound)
    chii.sendMessage('르르..')

def proc_stop(bot, update):
    chii.sendMessage('치이 봇이 잠듭니다.')
    chii.stop()

def firecracker():
    return '팡팡!'

chii = ChatBotModel.BotChii()
chii.add_handler('rolling', proc_rolling)
chii.add_handler('stop', proc_stop)
chii.start()

아래 네 줄을 위주로 보시면 됩니다.

chii = ChatBotModel.BotChii()
봇 객체를 선언합니다.

chii.add_handler('rolling', proc_rolling)
명령어 rolling 이 입력되면, proc_rolling 함수가 실행됩니다.

chii.add_handler('stop', proc_stop)
기존의 stop 기능은 조용히 잠들기 때문에 잠든다는 메세지를 추가해서 새로 등록해줬습니다.

chii.start()
봇 시작!

IMG_1950.PNG
명령어는 앞에 / 를 붙이고 써줘야합니다.

끝!


   이것으로 초간단 텔레그램 봇만들기 과정이 끝났습니다. 이미 많은 분들이 봇을 사용하고 계시고 알고 있는 기능들도 많을 거에요. 저는 제 프로그램 코드에 봇을 세워놓고 외출 했을 때 프로그램이 얼마나 진행됐는지 물어보는 용도로 자주 사용합니다.

  데이터 학습을 시켜놓고 어느정도 진행이 되었다, 학습이 완료되었다. 같은걸 알려주는 기능으로요.

  학습 변수를 실시간으로 텔레그램을 통해 입력해서 원격으로 학습을 조절하기도 합니다.

  봇을 이용해서 나만의 가계부를 만든다던지 알람을 만드는 것도 좋겠네요. 여러분은 어떤 기능을 구현하고 싶으신가요? 댓글로 부디 공유해주시면 좋겠습니다.

다음엔 주 직업이 트수인 제가 트위치 챗봇 만드는 방법을 가져오겠습니다.
마아냐(@maanya)였습니다~
마음에 드셨다면 팔로우! 부탁드립니다~ ^^*

Sort:  

오~ 정말 흥미롭네요.
저도 꼭 해보겠습니다~

짜릿해요, 늘 좋아요, 관심이 최고입니다. (´▽`)

잘 정리하셨네요 :) 군대에선 텔레그램 접속이 안 돼서 실습은 못 하지만... 좋은 시리즈 연재 응원하겠습니다

군에선 텔레그램 접속이 안되나요? 세상에... ㄷㄷㄷ 응원 감사합니다~!

30분에 만들어볼께요. ^^ 좋은 글 감사합니다.

금방 하실 수 있을거에요, 혹시 막히면 언제든지 댓글 남겨주세요~!

오 뭔가 복잡하지만 새로운것을 알게되었네요!
이걸로 스팀잇과 연동하는 봇도 만들수있는건가요?
이런쪽은 아무것도 몰라서요 +_+

물론입니다. 어느 프로그램과도 연동할 수 있습니다. 스팀잇과 연동한 기능이 있는 봇으로는 스팀잇 알림봇이 있습니다. +ㅅ+

오, 뭔가 멋지군요~ 스팀잇 알림봇 따라하기 강의 만들어주세요~

한 번 해보겠습니다 +ㅅ+ 댓글 감사합니다.

아, 가만 생각해보니.. 저걸 계속 실행해야 항상 봇처럼 답변하는거죠? 음.. 전기세;;

구글 서버에 올려서 실행하시는 분들이 계시더라고요- 정말 장기간 필요하다면 그런 것을 이용할 수 있습니다.

올! 능력자네요 능력자!
근데 쵸비츠라니 이게 몇 년 만인지...;ㅁ;ㅋㅋㅋㅋㅋ

역시 치이를 알아보시는 분이 계시는군요! 1세대 알파고
댓글 감사합니다 +ㅅ+

우왕 세상 신기하네요

나중엔 DIY 를 알려주는 공방에서 가구나 소품이 아닌 '나만의 챗봇 만들기' 같은걸 팔지도 모릅니다.

옴마나...왜 이렇게 능력자시죠??
사진도 잘 찍으시고 ...옴마.....?

다 여러분들께 배운 것들 입니다. 흐흐흐...

막 따라하고 싶어집니다^^ 좋은 정보 감사합니다.

읽어주셔서 감사합니다. 고맙습니다~ 리스팀까지 해주시다니 감개무량합니다... +ㅅ+

새로운 걸 알려주시니 제가 감사하죠^^

좋은정보 감사합니다 실습하러 가봐야겠어요

실습 의지와 관련 질문은 언제든지 환영입니다. +ㅅ+ 감사합니다.