어푸푸

코레일 자동 예약 매크로 제작기 #3 본문

잡동사니/자동화

코레일 자동 예약 매크로 제작기 #3

예수님부처 2018. 3. 28. 23:34

텔레그램 봇을 만들었으니 거기에 액세스를 해볼 차례입니다. 이제 텔레그램에서 만든 봇에 채팅을 걸 수 있습니다. 사용자명 검색에 '텔레그램 챗 봇 이름' 혹은 '@텔레그램 챗 봇 유저 ID'를 검색하시면 아래 그림과 같이 생성한 챗 봇이 나타나게 됩니다. 이제 기쁜 마음으로 챗 봇에게 말을 걸어봅니다. '안녕?', '으어어', '말 좀 해봐.. ㅜㅜ' 하지만 매정한 우리의 챗 봇, 아무 대답도 하지 않습니다. 챗 봇이 말하지 않는 이유는 현재 가장 핵심이라고 할 수 있는 두뇌가 없기 때문입니다. 우리가 보낸 메세지는 텔레그램 서버에 차곡차곡 수신이 되어 쌓여있지만, 이를 받아서 무언가를 해줄 프로그램이 돌아가고 있지 않은 상태이기 때문이죠.

<생성한 챗 봇을 챗 봇의 이름이나 챗봇의 유저 ID를 검색하여 채팅할 수 있다>

<하지만 도도한 챗 봇은 바로 대답하지 않는다. 오른쪽 그림처럼 대답하게 만들려면 어떻게 해야할까>

이제 챗 봇이 우리의 말을 따라하게 해봅시다. 이는 다른 많은 블로그에서도 다루어지고 있는 내용이니 혹시라도 부족한 점이 있다면 다른 블로그의 글들을 참조하면 아주 좋습니다. 제일 먼저 해야할 것은 텔레그램에서 제공하는 파이썬 텔레그램 라이브러리를 다운 받는 것입니다. 파이썬이 설치되어있고 telepot 라이브러리가 설치되어있지 않다면 cmd에 'pip install telepot'을 쳐보세요. 자동으로 telepot 라이브러리가 다운로드됩니다. 파이썬으로 제공되는 telepot 라이브러리의 API는 아래의 사이트에서 확인하실 수 있습니다.

http://telepot.readthedocs.io/en/latest/reference.html

'굳이 저 API 설명서를 읽어야 해?'라고 생각하시는 분들도 있을거라고 생각이 듭니다. 앞으로 몇 개가 될지는 모르겠지만 '코레일 자동 예약 매크로 제작기' 포스트에 나와있는 내용을 구현하시려면 굳이 안읽어도 된다는 아주 좋은 소식을 먼저 전달드립니다. 하지만 인생만사 새옹지마. 좋은 소식 뒤에는 안좋은 소식이 따라오기 마련인가봅니다. 결론부터 말씀드리자면 이 포스트들은 저와 비슷한 고민을 하셨던 분들에게 영감을 드리고 시간을 아낄 수 있는 정보를 드리기 위해 작성되었고, 작성될 예정입니다. 다시 말해 매크로 프로그램의 소스 코드는 공개되지 않을 것이고, 판매 또한 이루어지지 않을 것입니다. 왜냐하면 이러한 매크로를 사용하는 사람이 소수일 때는 상관이 없지만 점점 늘어나게 되면 생태계가 파괴될 수 있기 때문입니다. 기존에 사람들이 KTX 취소 표를 놓고 경쟁했다면, 생태계가 파괴되는 순간 프로그램들이 KTX 취소 표를 놓고 경쟁하는 상황이 발생하게 됩니다. 이는 별로 바람직한 현상이 아니죠. 그래서 매크로 프로그램은 각자 완성하시는 걸로... 하지만 제가 고민했고 해결한 문제들은 여기에서 다룰 예정이니 관심이 있는 분들에게 도움이 되길 바라며 키보드를 두드려봅니다.

이제 기초적인 프로그램을 한 번 코딩해봅시다. 제일 먼저 bot.py 파일을 만들고 다음과 같은 소스 코드를 입력합시다. 소스코드를 보시면 아시겠지만 이 때 토큰은 프로그램을 실행할 때 입력이 됩니다. 이렇게 처리를 했을 때 장점이 몇 가지 있는데, 제일 좋은 장점은 동일한 소스 코드를 다수의 챗 봇에서 실행할 때 소스 코드를 건드릴 필요 없이 실행 파일만 바꿔주면 된다는 것입니다. 예를 들어서 매크로 프로그램을 짜놓고 두 개의 매크로를 돌리고 싶으면 토큰만 바꾼 배치파일을 실행하면 되는 것입니다.

#	첫 번째 줄 들여쓰기 뭐야..
import sys
import time
import telepot
from telepot.loop import MessageLoop

def handle(msg):
    content_type, chat_type, chat_id = telepot.glance(msg)
    print(content_type, chat_type, chat_id, msg['text'])

    if content_type == 'text':
        bot.sendMessage(chat_id, msg['text'])

TOKEN = sys.argv[1]  # get token from command-line

bot = telepot.Bot(TOKEN)
MessageLoop(bot, handle).run_as_thread()
print ('Listening ...')

# Keep the program running.
while 1:
    time.sleep(10)

이제 이를 (윈도우를 사용하신다면) cmd에서 실행하실 수가 있습니다. 그러나 매번 cmd로 실행하는 것은 아주 귀찮고 우리를 신경쓰이게 하는 일입니다. 굳이 cmd에서 실행할 필요 없이 배치 파일을 만들면 일반적인 프로그램 실행하듯이 더블클릭을 하여 실행할 수 있습니다. 파일 Run.bat을 bot.py가 있는 곳에 생성해주고 내용을 다음과 같이 작성합니다.

python bot.py "토큰"

"토큰"에는 챗 봇을 만들 때 발급받았던 토큰을 입력해주세요. 큰 따옴표는 빼고 입력해주시면 됩니다. 예를 들어서 발급받은 토큰이 1234:aaaa라면 Run.bat에는 다음과 같은 내용이 작성됩니다.

python bot.py 1234:aaaa

Run.bat을 실행시켜봅시다. 이제 텔레그램의 챗 봇에 말을 걸면 그대로 따라하게 됩니다. 하지만 이러한 구조로는 매크로를 만들기가 쉽지가 않습니다. 위 예제에서는 메시지 루프 함수가 호출이 되어 프로그램이 실행되는 한 계속해서 텔레그램 챗 봇으로 메시지가 왔는지 확인하고, 메시지가 왔다면 handle 함수가 호출되게 되는데요, 매크로 구조상 특정한 문자열이 오면 원하는 함수가 호출되고, 그 함수 내부에서 또 다시 메세지를 받아야 하는 경우가 있습니다. 그런 경우에는 메시지 루프 함수로 처리를 하는 것이 쉽지가 않습니다. 예를 들어서 챗 봇에 "예약"이라는 메시지가 수신되었다고 합시다. 그렇다면 프로그램에서는 어느 기차표인지를 입력받고 반복적으로 표가 있는지 조회하다가 표가 나오면 예약을 하는 함수가 호출되어야 할 것입니다. 즉, "예약"이라는 메시지를 받고 호출되는 함수에서 기차의 출발 역과 도착 역, 기차의 출발 시간 등의 정보를 사용자에게 입력받기 위해서 다시 메시지를 받아야 하는 상황이 발생합니다. 이러한 경우에는 메시지 루프 함수로 처리를 하는 것이 쉽지가 않습니다.

<Run.bat이 실행된 상태에서는 챗 봇이 내 말을 따라한다>

이를 해결하기 위해 다른 함수를 사용할 필요가 있습니다. 만약에 사용할 수 있는 다른 함수가 존재한다면요. 이를 위해 텔레그램의 API 설명을 보면 메시지 루프라는 함수는 GetUpdates라는 함수를 반복적으로 호출하는 함수라고 서술이 되어 있습니다. 즉, GetUpdates 함수를 사용하게 되면 조금 더 자유도를 가지고 프로그램을 작성할 수 있게 됩니다. 다음 포스트에서는 GetUpdates 함수를 이용해서 간단한 챗 봇을 만들어보고 제가 처음에 겪었던 문제 점들과  해결 방법들을 이야기 하겠습니다. 여러분 다음 포스트에서 봐요~

코레일 자동 예약 매크로 제작기 #4에서 계속...