이제 아래 화면에서 텔레그램을 통하여 내가 원하는 출발역/도착역/년/월/일/시를 선택합니다.
(사람수 선택 등은 어느정도 익히시면 알아서 하실 수 있을거에요~)
출발역의 경우 서울로 기본 입력되어 있지만 이는 신경쓰지 말고 내가 목포에서 출발을 원한다고 해서 목포를 입력하면 목포가 출발역인지 도착역인지 알 수가 없습니다. 그래서 '출발'을 앞에 붙여서 '출발목포'로 메세지를 입력하면 일단 '출발' 단어를 인식하여 출발역으로 인식하고 '출발'글자는 떼고 '목포'만을 코레일 홈페이지에 입력되도록 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 마무리)