새소식

반응형
Python/KTX 자동 예약하기

Python 과 Telegram, selenium으로 KTX 자동 예매하기(4. telegram.py 설정)

  • -
반응형

1. telegram.py import

import telepot
from kor.korail import *
import re

 

- import teleport

: teleport 은 텔레그램봇과 대화할 수 있는 추천 라이브러리 입니다.

: pycharm terminal 을 켜서 "pip install telepot" 입력하여 teleport 라이브러리를 다운받는다.

 

* teleport 다운로드

일단 pycharm IDE의 하단에 Terminal을 켜준다.

 

"pip install telepot" 명령어를 입력하여 telepot 라이브러리를 다운받는다.

 

 

- from kor.korail import *

: KTX_TICKET/kor/korail.py 의 모든 클래스 및 함수를 import 합니다.

: korail.py 파일은 레츠코레일 홈페이지의 웹 크롤링을 하는 모듈입니다.

 

- import re

: 정규표현식을 사용할 수 있는 라이브러리입니다. 텔레그램봇에 사용자가 입력했을 때 해당 문자열에 대한

  정규표현식을 사용할 예정입니다.

 

2. KTX_Telegram() Class 작성

2-1. 텔레그램봇과 대화하기

import telepot
import kor.korail import *
import re

class KTX_Telegram():
    def __init__(self):
        print('텔레그램 시작합니다.')
        self.token = "BotFather를 통해 봇을 생성했을때 주는 HTTP API token값(아래의 이미지 참고)";
        self.bot = telepot.Bot(self.token)
        #아래 KTX_Korail()은 kor/korail.py 파일의 class명이다. 다음단계에서 생성할 예정이므로 주석처리한다.
        #self.korail = KTX_Korail()
        self.bot.message_loop(self.conversation_telegram)
        while True:
            pass
       
        def conversation_telegram(self, msg):
            print(msg)

- class KTX_Telegram():

    def __init__(self):

        print('텔레그램 시작합니다.')

: KTX_Telegram 클래스를 생성하고 초기화 함수인 def __init__(self): 를 설정

 

- self.token = "HTTP API token"

: 텔레그램 BotFather를 통해 봇을 생성했을 경우 HTTP API token 값을 준다. (token : 10자리 숫자:영문자)

 

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

: teleport 라이브러리의 Bot 함수에 텔레그램봇의 token 값을 넘기면 봇이 호출된다.

 

- self.bot.message_loop(self.conversation_telegram)

: 호출한 봇인 self.bot의 message_loop 함수를 사용하여 봇 대화창에 입력한 데이터를 읽어올 수 있다.

: message_loop는 봇 대화창에서 입력되는 메세지를 기다리면서 메세지가 입력되면 handler가 작동된다.

 

- while True:

    pass

: 메인 __init__.py 에서 실행했을 때 KTX_Telegram() class를 호출하고 호출된 KTX_Telegram() class는

초기화 함수인 def __init__(self): 가 실행되고 종료된다. 하지만 해당 프로그램은 예약이 될때까지

종료되지 않고 실행되어야 한다. 이럴때 필요한게 while문이다.

해당 초기화 함수가 while문으로 인해 예약이 될때까지 무한루프를 돈다.

무한 루프를 도는동안 텔레그램봇은 대화창에 입력된 데이터를 계속 전달한다.

 

- def conversation_telegram(self, msg):
        print(msg)

: 텔레그램 봇과 대화할 때 사용하는 콜백 함수

: msg의 내용은 Key : Value 형식인 데이터포맷 JSON 형태로 날라온다. 여기서 우리가 확인할 Key 값은 text 값이다.

텔레그램 봇 대화창에 입력한 데이터는 msg 변수의 text Key 값이다.

해당 데이터는 msg['text'] 로 호출할 수 있다.

{'message_id': 247, 'from':
    {
        'id': 특정 ID 숫자,
        'is_bot': False,
        'first_name': '이름',
        'last_name': '',
        'language_code': 'ko'
    },
'chat':
    {
         'id': 특정 ID 숫자,
         'first_name': '이름',
         'last_name': '',
         'type': 'private'
     },
'date': 1639573393,
'text': '로그인'}

     

텔레그램 봇 대화창에 로그인을 입력한 이미지
HTTP API token 이미지

 

2-2. 레츠코레일 홈페이지에 로그인을 하기 위한 준비

def conversation_telegram(self, msg):
    con_text = msg['text']
    chat_id = msg['chat']['id']
    
    if con_text == '로그인':
        self.bot.sendMessage(chat_id, "로그인중입니다. 잠시만 기다려주세요")
        #아래 korail의 login() 함수는 다음단계에서 진행할 예정이므로 주석처리한다.
        #self.korail.login()
        self.bot.sendMessage(chat_id, "로그인 완료")

 

- con_text = msg['text']

: 위 내용 설명처럼 텔레그램 봇 대화창에 입력한 데이터인 text Key 값을 con_text 변수에 저장한다.

 

- chat_id = msg['chat']['id']

: 모든 텔레그램 봇 대화창에는 해당 대화창을 식별하기 위한 id 값이 있다. chat Key 값 안에 id Key 값을 불러온다.

: 해당 chat_id 값으로 텔레그램 대화창에 메세지를 보낼 수 있다.

 

- if con_text == '로그인':

: 만약 텔레그램 봇 대화창에 입력한 메세지가 로그인일때 아래 문장을 실행한다.

 

- self.bot.sendMessage(chat_id, "메세지명")

: 봇 대화창에 메세지를 보내기 위한 sendMessage 함수이다.

내용은 아래와 같으며 대화를 할떄 필요한 내용은 chat_id와 text 이다.

나머지는 None으로 선언과 동시에 초기화되어 있다.

 

chat_id는 봇 대화창을 식별하기 위한 id 값이며, text는 봇 대화창에 보낼 메세지이다.

 

* sendMessage 내용

def sendMessage(self, chat_id, text,
                parse_mode=None,
                disable_web_page_preview=None,
                disable_notification=None,
                reply_to_message_id=None,
                reply_markup=None):
    """ See: https://core.telegram.org/bots/api#sendmessage """
    p = _strip(locals())
    return self._api_request('sendMessage', _rectify(p))

 

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.