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 등으로 설정해놨기 때문이다. 아래 이미지 확인
'Python > KTX 자동 예약하기' 카테고리의 다른 글
당신이 좋아할만한 콘텐츠
-
Python 과 Telegram, selenium으로 KTX 자동 예매하기(8. 예약하기) 2022.01.05
-
Python 과 Telegram, selenium으로 KTX 자동 예매하기(7. 검색 및 결과 데이터 텔레그램으로 전송하기) 2021.12.29
-
Python 과 Telegram, selenium으로 KTX 자동 예매하기(5. korail.py 설정 및 selenium 사용하여 로그인) 2021.12.14
-
Python 과 Telegram, selenium으로 KTX 자동 예매하기(4. telegram.py 설정) 2021.12.14
소중한 공감 감사합니다