텔레그램 챗봇까지 만들었으면 이제 파이썬으로 텔레그램 대화방에 접속해 보겠습니다.

 

1. telegram.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import telepot
from korail.korail import *
import re
import textwrap
 
class Telegram():
    def __init__(self):
        print("텔레그램 구동합니다")
        self.token = "텔레그램에서 받은 토큰값을 입력합니다."
        self.bot = telepot.Bot(self.token)
        self.korail = Korail()
        self.bot.message_loop(self.start_telegram)
        while 1:
            pass 
cs

Telegram class를 실행하고 __init___ 함수를 실행합니다.

 

self.token = "토큰값"

: 모든 변수는 다른 함수에서도 쓸 수 있게 self. 를 꼭 붙여줍니다.

 

self.bot = telepot.Bot(self.token)

: self.bot은 telepot의 Bot 기능을 호출합니다. 괄호 안의 토큰값을 통해 한번에 내가 만든 봇대화방의 챗봇을 호출하는 것이죠. 너무 간단하네요.

 

self.korail = Korail()

: 이제 korail.py의 Korail() class를 실행시킵니다. 하지만 Korail() class의 __init__ 함수에는 어떠한 명령어도 없으니 당장은 안심해도 됩니다.

 

self.bot.message_loop(self.start_telegram)

while 1:

    pass

:앞서 호출한 챗봇이 (다음에 나오는) self.start_telegram 함수를 message_loop 시키라는 명령이며 이어서 while 구문을 사용하여 무한루프 시킵니다. 즉 봇 대화창에서 언제나 내가 보내는 (또는 코레일 홈페이지에서 보내는) 메세지 또는 정보를 받아 처리할 수 있도록 하는 것입니다.

 

1
2
3
4
5
6
7
8
    def start_telegram(self, msg, info = None):
       tel_text = msg['text']
       chat_id = msg['chat']['id']
 
        if tel_text == "로그인":
            self.bot.sendMessage(chat_id, "로그인... 잠시만 기다려주세요")
            self.korail.login()
            self.bot.sendMessage(chat_id, "로그인 완료")    
cs

이제 start_telegram 함수입니다. 함수명은 dialog_telegram 또는 conversation_telegram이 훨씬 나은 이름일 듯 합니다. 바로 이 함수 안에서 챗봇과 대화를 하거든요.

 

앞서 __init__함수에서 위 함수를 무한 메세지 루프(message_loop) 시켰습니다.

 

이제 프로그램이 동작되는 동안 텔레그램에 내가 입력하는 모든 메세지는 첫번째 변수(msg) 로 전달이 됩니다. 두번째 info의 경우는 나중에 korail 함수에서 텔레그램 챗봇 대화방에 메세지를 전달할 경우 메세지 뿐만 아니라 각종 정보를 함께 전달하는 경우를 대비하여 넣었습니다. 하지만 내가 대화창에 메세지를 입력할 경우에는 메세지 외의 정보가 없기 때문에 info = None으로 기본 설정을 해 놓습니다.

다시 한번 강조하면 텔레그램 봇 대화방에 정보를 입력하는 주체는 저 뿐만 아니라 korail.py 에 있는 함수들도 그 주체가 됩니다.

 

그런데 내가 입력하는 메세지는 단순 텍스트(str) 형태로 함수에 전달되지 않고 다음과 같이 복잡한 형태의 딕셔너리 타입으로 전달이 됩니다. 단순히 '로그인'을 입력했을 때 입니다.

 

{'message_id': 4자리숫자

 'from': {'id': 10자리숫자, 'is_bot': False, 'first_name': '이름', 'last_name': '', 'language_code': 'ko'},

 'chat': {'id': 10자리숫자, 'first_name': '이름', 'last_name': '', 'type': 'private'}, 

 'date': 1597023224,

 'text': '로그인'}

 

유추할 수 있듯이 모든 채팅방에 입력되는 메세지마다 각각의 id가 있고 메세지를 입력하는 주체의 정보(from), 챗방의 정보(chat, 제가 만들었으니 메세지 입력 주체와 동일합니다.), 날짜, 그리고 메세지 내용이 들어가 있습니다.

 

하지만 다른 정보는 다 제쳐두고 저는 단지 제가 입력한 메세지의 텍스트 내용만 필요하기 때문에 tel_text = msg['text'] 로 설정하여 즉 msg 딕셔너리 안의 메세지 정보만을 tel_text로 저장하고 if tel_text == "로그인": 에 따른 명령어를 설정합니다.

내가 '로그인'을 입력했을 때 명령을 수행하는 것이지요.

 

self.bot.sendMessage(chat_id, "로그인... 잠시만 기다려주세요")

:이제 제가 로그인을 입력했으니 챗봇이 대답할 차례입니다. 챗봇의 sendMessage 기능을 이용합니다만 다음과 같은 설명이 있습니다. (비쥬얼 스튜디오 코드를 이용하면 마우스를 갖다대면 자동으로 필요한 인자에 대한 정보를 줍니다.)

다른건 기본값이 None으로 되어 있어 걍 무시하고 결국 chat_id 와 text 만 필수적으로 필요하다는 것을 알 수 있습니다.

그렇기 때문에 chat_id 값을 얻기 위하여 미리 chat_id = msg["chat"]["id"] 변수를 지정하고 두번째 인수에는 챗봇이 대답하는 메세지 내용을 적으면 됩니다.

 

self.bot.korail.login()

self.bot.sendMessage(chat_id, "로그인 완료")

 

이제 드디어 korail.py 안에 있는 login 함수를 수행하고 무사히 잘 마치면 챗봇이 "로그인 완료" 되었다고 답변합니다.

 

다음은 selenium으로 코레일 웹탐험을 해보겠습니다.

목차

Python, Telegram으로 KTX 열차표 예매하기(#1 준비)
Python, Telegram으로 KTX 열차표 예매하기(#2 __init__.py)
Python, Telegram으로 KTX 열차표 예매하기(#3 telegram.py, korail.py)
Python, Telegram으로 KTX 열차표 예매하기(#4 텔레그램봇 만들기)

Python, Telegram으로 KTX 열차표 예매하기(#5 telegram, telepot)
Python, Telegram으로 KTX 열차표 예매하기(#6 selenium, 웹 자동화)
Python, Telegram으로 KTX 열차표 예매하기(#7 selenium, regular expression)
Python, Telegram으로 KTX 열차표 예매하기(#8 열차표 확인하기)
Python, Telegram으로 KTX 열차표 예매하기(#9 예매하기)
Python, Telegram으로 KTX 열차표 예매하기(#10 마무리)

+ Recent posts