새소식

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

Python 과 Telegram, selenium으로 KTX 자동 예매하기(6. 정규표현식(re 모듈)을 사용하여 열차 검색 제어)

  • -
반응형

1. 열차 검색 제어

class KTX_Telegram():
    def __init__(self):
        print('텔레그램 시작합니다.')
        self.token = "BotFather를 통해 봇을 생성했을때 주는 HTTP API token값"
        self.korail = KTX_Korail()
        self.bot = telepot.Bot(self.token)
        self.bot.message_loop(self.conversation_telegram)
        while True:
            pass

    def conversation_telegram(self, msg, result = None):
        con_text = msg['text']
        chat_id = msg['chat']['id']

        if con_text == '로그인':
            self.bot.sendMessage(chat_id, "로그인중입니다. 잠시만 기다려주세요")
            self.korail.login()
            self.bot.sendMessage(chat_id, "로그인 완료")

해당 소스 아래내용으로 추가

 

telegram.py

def conversation_telegram(self, msg, result = None):
    con_text = msg['text']
    chat_id = msg['chat']['id']
    if con_text == '로그인':
        self.bot.sendMessage(chat_id, "로그인중입니다. 잠시만 기다려주세요")
        self.korail.login()
        self.bot.sendMessage(chat_id, "로그인 완료")
    #윗 내용은 이미 전편에서 설정한 내용(추가할 내용의 위치가 헷갈리지 않게 넣어놨어요)

    start_city = re.compile("출발*")
    start_city_find = re.compile("[^출발]")
    
    if start_city.match(con_text):
        city_name = start_city_find.findall(con_text)
        city_name = ''.join(city_name)
        self.korail.korail_start_city(city_name)

- start_city = re.compile("출발*")

: 출발이라는 단어를 찾기 위해 정규표현식 설정

: *은 모든 문자를 의미하는 정규표현식이다. 출발*은 출발로 시작하는 모든 텍스트를 의미한다.

 

- start_city_find = re.compile("[^출발]")

: [] 대괄화 안의 "^" 표시는 not을 의미한다.

: 출 또는 발 이란 단어를 제외하기 위해 ^(not)을 설정한 정규표현식

 

 

- if start_city.match(con_text):

: 출발로 시작하는 단어가 있을경우

 

- city_name = start_city_find.findall(con_text)

: findall은 정규표현식과 매치되는 모든 문자열을 리스트형식으로 리턴한다.

: 위에서 설정한 start_city_find는 출 또는 발이라는 단어를 제외하는 정규표현식이였으므로

  "출발목포" 를 입력했을 경우 ['목', '포'] 라는 단어를 리턴한다.

예)

"출발목포"

결과 : ['목', '포']

"출목발포"

결과 : ['목', '포']

 

- city_name = ''.join(city_name)

: 리스트형식의 데이터를 join을 사용해 붙여가지고 문자열로 리턴한다.

 

- self.korail.korail_start_city(city_name)

: korail.py 모듈의 korail_start_city 함수에게 출발할 도시이름인 city_name을 넘긴다.

 

korail.py

def korail_start_city(self, city):
    start_city = self.driver.find_element_by_id("start")
    start_city.clear()
    start_city.send_keys(city)
    start_city.send_keys(Keys.RETURN)

위 내용은 def login 함수 밑에 추가하면 된다.

 

- def korail_start_city(self, city):

: city는 telegram.py 모듈에서 넘어올 변수

: 레츠코레일 출발 도시를 바꿀 함수이다.

 

- start_city.clear()

: 초기값으로 입력되어 있는 텍스트를 제거한다.

 

- start_city.send_keys(city)

: 출 또는 발이라는 단어를 없앤 문자열을 출발지 값에다가 입력한다.

 

- start_city.send_keys(Keys.RETURN)

: 오른쪽 시프트 위에 있는 Enter를 누른다.

* Keys.RETURN 과 Keys.ENTER 의 차이점

아래 이미지를 보면 오른쪽 시프트 위쪽의 엔터가 RETURN 이고 숫자 키패드 엔터가 ENTER 값이다.

 

위와 같은 방법으로 출발지, 목적지, 출발일의 년,월,일,시 를 선택한다.

 

telegram.py

#출발지 설정을 위한 정규표현식
start_city = re.compile("출발*")
start_city_find = re.compile("[^출발]")

#목적지 설정을 위한 정규표현식
arrival_city = re.compile("도착*")
arrival_city_find = re.compile("[^도착]")

#년을 선택하기 위한 정규표현식
year_select = re.compile("202\d{1}년")
year_select_find = re.compile("[^년]")

#월을 선택하기 위한 정규표현식
month_select = re.compile("[0-9]+월")
month_select_find = re.compile("[^월]")

#일을 선택하기 위한 정규표현식
day_select = re.compile("[0-9]+일")
day_select_find = re.compile("[^일]")

#시간을 선택하기 위한 정규표현식
hour_select = re.compile("[0-9]+시")
hour_select_find = re.compile("[^시]")

if start_city.match(con_text):
    start_city_name = start_city_find.findall(con_text)
    start_city_name = ''.join(start_city_name)
    self.korail.korail_start_city(start_city_name)

if arrival_city.match(con_text):
    arrival_city_name = arrival_city_find.findall(con_text)
    arrival_city_name = ''.join(arrival_city_name)
    self.korail.korail_arrival_city(arrival_city_name)

if year_select.match(con_text):
    year_select_name = year_select_find.findall(con_text)
    year_select_name = ''.join(year_select_name)
    self.korail.korail_year_select(year_select_name)

if month_select.match(con_text):
    month_select_name = month_select_find.findall(con_text)
    month_select_name = ''.join(month_select_name)
    self.korail.korail_month_select(month_select_name)

if day_select.match(con_text):
    day_select_name = day_select_find.findall(con_text)
    day_select_name = ''.join(day_select_name)
    self.korail.korail_day_select(day_select_name)

if hour_select.match(con_text):
    hour_select_name = hour_select_find.findall(con_text)
    hour_select_name = ''.join(hour_select_name)
    self.korail.korail_hour_select(hour_select_name)

 

korail.py

#출발지 입력
def korail_start_city(self, city):
    start_city = self.driver.find_element(By.ID,"start")
    start_city.clear()
    start_city.send_keys(city)
    start_city.send_keys(Keys.RETURN)

#도착지 입력
def korail_arrival_city(self, city):
    arrival_city = self.driver.find_element(By.ID,"get")
    arrival_city.clear()
    arrival_city.send_keys(city)
    arrival_city.send_keys(Keys.RETURN)

#년 선택
def korail_year_select(self, year):
    year_select = Select(self.driver.find_element(By.ID,"s_year"))
    year_select.select_by_value(year)

#월 선택
def korail_month_select(self, month):
    month_select = Select(self.driver.find_element(By.ID,"s_month"))
    month_select.select_by_value(month)

#일 선택
def korail_day_select(self, day):
    day_select = Select(self.driver.find_element(By.ID,"s_day"))
    day_select.select_by_value(day)

#시간 선택
def korail_hour_select(self, hour):
    hour_select = Select(self.driver.find_element(By.ID,"s_hour"))
    hour_select.select_by_value(hour)

 

- Select() 함수

: selenium의 Select box를 선택하기 위해 사용

 

- year_select.select_by_value(year)

: select box의 value값을 선택하기 위해 사용

 

월, 일, 시간을 선택할때 1월 or 1일 or 1시 등 입력할떄는 앞에 0을 붙여줘야 한다.

이유는 select box 의 option value 값을 01, 02 ,03 등으로 설정해놨기 때문이다. 아래 이미지 확인

 

반응형
Contents

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

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