이제 아래 화면에서 텔레그램을 통하여 내가 원하는 출발역/도착역/년/월/일/시를 선택합니다.

(사람수 선택 등은 어느정도 익히시면 알아서 하실 수 있을거에요~)

자동 예매 매크로를 걸면서 좌석종류 등을 언제 따지겠습니까..ㅎ

출발역의 경우 서울로 기본 입력되어 있지만 이는 신경쓰지 말고 내가 목포에서 출발을 원한다고 해서 목포를 입력하면 목포가 출발역인지 도착역인지 알 수가 없습니다. 그래서 '출발'을 앞에 붙여서 '출발목포'로 메세지를 입력하면 일단 '출발' 단어를 인식하여 출발역으로 인식하고 '출발'글자는 떼고 '목포'만을 코레일 홈페이지에 입력되도록 korail.py 함수로 보내주는 것입니다.

1
2
3
4
5
6
7
8
9
10
11
12
    def start_telegram(self, msg, info = None):
        tel_text = msg['text']
        chat_id = msg['chat']['id']                         
 
        input_departure = re.compile('출발*')           # 출발 도시
        input_departure_city = re.compile('[^출발]')    # 출발 글자 삭제
 
        if input_departure.match(tel_text): #출발역 선택
            departure_city = input_departure_city.findall(tel_text)
            departure_city = ''.join(departure_city)
            self.bot.sendMessage(chat_id, departure_city)
            self.korail.fill_departure_city(departure_city)
cs

input_departure = re.compile('출발*')

: 출발로 시작하는 모든 텍스트를 의미함을 변수로 지정합니다.

input_departure_city = re.compile('[^출발]')

: Not 출발을 의미함을 변수로 지정합니다.

 

if input_departure.match(tel_text):

: 내가 입력하는 메세지가 '출발'로 시작하는 모든 텍스트를 입력했을 때,

 

departure_city = input_departure_city.findall(tel_text)

: 내가 입력한 메세지 중에서 '출발'을 제외한 모든 텍스트를 리스트로 보여줍니다. ['목', '포']

 

departure_city = ''.join(departure_city)

: 리스트의 각 인자를 합쳐서 텍스트로 만들어줍니다. '목포'

 

self.bot.sendMessage(chat_id, departure_city)

self.korail.fill_departure_city(departure_city)

: 제대로 도시가 갔는지 텔레그램 챗봇이 알려주고 korail.py의 fill_departure_city()함수에 인수 '목포'를 넘겨줍니다.

 

바로 korail.py의 '목포'를 받는 함수를 봅시다.

1
2
3
4
5
    def fill_departure_city(self, city):
        dep_city = self.driver.find_element_by_id("start")
        dep_city.clear()        
        dep_city.send_keys(city)
        dep_city.send_keys(Keys.RETURN)
cs

def fill_departure_city(self, city):

:'목포'라는 하나의 인수를 받기 때문에 self 와 city 두 개 넣습니다.

 

dep_city = self.driver.find_element_by_id("start")

dep_city.clear()

dep_city.send_keys(city)

dep_city.send_keys(Keys.RETURN)

:출발역 입력 창의 tag의 id가 start임을 확인해서 dep_city로 찾습니다.

 그 다음 칸을 비우고,

 '목포' 값으로 채웁니다.

 엔터키를 누릅니다.

 

selenium에 대해서 어느정도 익숙해졌다면 뭐 크게 어렵지 않은 작업이라고 생각됩니다.

 

그래서 위와 같은 방법대로 도착역, 년, 월, 일, 시를 모두 입력할 수 있도록 작성합니다.

저의 경우에는 년의 경우에는 그냥 기본값 2020년을 이용하는 것으로 하였고 월, 일, 시의 경우 두자리 숫자로 뒤에 년, 월, 일 시를 붙이는 식으로 입력하도록 작성하였습니다.

 

1. telegram.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
    def start_telegram(self, msg, info = None):
        tel_text = msg['text']
        chat_id = msg['chat']['id']                         
 
        input_departure = re.compile('출발*')           # 출발 도시
        input_departure_city = re.compile('[^출발]')    # 출발 글자 삭제
        input_arrival = re.compile('도착*')             # 도착 도시
        input_arrival_city = re.compile('[^도착]')      # 도착 글자 삭제
        input_year = re.compile('2020')                 # 년
        input_month = re.compile('[0-9]+월')             # 월
        input_month_number = re.compile("[^월]")         # 월 글자 삭제
        input_day = re.compile('[0-9]+일')               # 일
        input_day_number = re.compile('[^일]')           # 일 글자 삭제
        input_hour = re.compile('[0-9]+시')              # 시
        input_hour_number = re.compile('[^시]')          # 시 글자 삭제
 
        if input_departure.match(tel_text): #출발역 선택
            departure_city = input_departure_city.findall(tel_text)
            departure_city = ''.join(departure_city)
            self.bot.sendMessage(chat_id, departure_city)
            self.korail.fill_departure_city(departure_city)
        
        if input_arrival.match(tel_text):   #도착역 선택
            arrival_city = input_arrival_city.findall(tel_text)
            arrival_city = ''.join(arrival_city)
            self.bot.sendMessage(chat_id, arrival_city)
            self.korail.fill_arrival_city(arrival_city)
        
        if input_year.match(tel_text):      #출발년도 선택
            self.korail.fill_year(tel_text)
        
        if input_month.match(tel_text):     #출발달 선택
            departure_month = input_month_number.findall(tel_text)
            departure_month = ''.join(departure_month)
            self.korail.fill_month(departure_month)
        
        if input_day.match(tel_text):       #출발일 선택
            departure_day = input_day_number.findall(tel_text)
            departure_day = ''.join(departure_day)
            self.korail.fill_day(departure_day)
        
        if input_hour.match(tel_text):      #출발시간 선택
            departure_hour = input_hour_number.findall(tel_text)
            departure_hour = ''.join(departure_hour)
            self.korail.fill_hour(departure_hour)
cs

2. korail.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
    def fill_departure_city(self, city):
        dep_city = self.driver.find_element_by_id("start")
        dep_city.clear()        
        dep_city.send_keys(city)
        dep_city.send_keys(Keys.RETURN)
 
    def fill_arrival_city(self, city):
        arr_city = self.driver.find_element_by_id("get")
        arr_city.clear()
        arr_city.send_keys(city)
        arr_city.send_keys(Keys.RETURN)
 
    def fill_year(self, year):
        select_year = Select(self.driver.find_element_by_id("s_year"))
        select_year.select_by_value(year)
 
    def fill_month(self, month):
        select_month = Select(self.driver.find_element_by_id("s_month"))
        select_month.select_by_value(month)
 
    def fill_day(self, day):
        select_day = Select(self.driver.find_element_by_id("s_day"))
        select_day.select_by_value(day)
 
    def fill_hour(self, hour):
        select_hour = Select(self.driver.find_element_by_id("s_hour"))
        select_hour.select_by_value(hour)
cs

정규 표현식을 어떻게 이용했는지 잘 보시기 바랍니다. 월, 일, 시의 경우 꼭 내가 두자리 숫자로 입력해야 한다는 것을 잊지 맙시다.

 

또한 년, 월, 일, 시 의 경우에는 위와 같이 Select()로 찾은 객체를 지정해주고 .select_by_value() 로 정한 시간을 입력합니다. 체크박스일때 선택하는 방법입니다.

 

이제 다음 내용부터가 단순 웹 크롤링을 넘어선 매크로, 예매 자동화의 영역일듯 합니다.^^

목차

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