SRT 예매 알림 프로그램
SRT 예매 후, 예매가 완료되면 slack으로 알림받기
이 포스팅은 Selenium을 사용하여 SRT 예매 사이트에 로그인하고,
원하는 날짜와 시간에 맞춰 예약을 완료한 후, 예약이 성공하면 Slack으로 알림을 보내줍니다.
1. 개요
srt의 로그인 화면으로 이동한다.
사용자에게 미리 아이디와 비밀번호를 받고,
아래 로그인 화면에 각각 입력하여 자동적으로 로그인이 되도록 한다.
일반 승차권 예매로 넘어가, 도착지를 설정한다.
출발할 날짜와, 시간을 선택하고 조회하기를 클릭한다.
아래 화면에서 예매가 성공한다면, slack으로 봇이 알림을 주도록 한다.
예매가 되지 않았다면, 예매가 될때까지 시간을 두고 계속 시도해본다.
2. 로그인
우선 필요한 라이브러리를 임포트하고 Chrome 웹드라이버를 설정한다.
그리고 SRT 예매 사이트의 로그인 페이지로 이동합니다.
from selenium import webdriver
from selenium.webdriver.common.by import By
browser = webdriver.Chrome()
url = 'https://etk.srail.kr/cmc/01/selectLoginForm.do?pageId=TK0701000000'
browser.get(url)
사용자에게 입력받은 아이디와 비밀번호로 로그인을 시도한다.
이때 로그인 화면에서, 아이디와 비밀번호를 입력받는 텍스트란을 클릭해서 ID로 요소를 찾는다.
휴대폰번호 radio 버튼 | srchDvCd3 |
휴대전화번호 | srchDvNm03 |
비밀번호 | hmpgPwdCphd03 |
확인 버튼 | loginSubmit |
# 휴대전화번호 / 비번 입력 / 확인버튼 클릭
phone = '01012341234'
pw = '123123'
browser.find_element(By.ID,'srchDvCd3').click()
browser.find_element(By.ID,'srchDvNm03').send_keys(phone)
browser.find_element(By.ID,'hmpgPwdCphd03').send_keys(pw)
# 확인 버튼 클릭
browser.find_element(By.CLASS_NAME,'loginSubmit').click()
3. 예매 페이지
로그인이 완료되면 예매 페이지로 이동한다.
예매 조건 설정 중 원하는 목적지, 날짜, 시간 등을 입력한다.
이때 도착지는 부산으로 디폴트 설정이 되어있다.
따라서, 입력란을 비워버였다가, 동대구를 입력해야 한다.
조건을 입력했으면 예매버튼을 찾아서 클릭한다.
목적지 | ID : arvRsStnCdNm |
날짜 | XPATH : //*[@id="dptDt"]/option[5] |
시간 | XPATH : //*[@id="dptTm"]/option[7] |
조회하기 | XPATH : //*[@id="search_top_tag"]/input |
이번에는 CLASS_NAME이 아니라, ID와 XPATH를 기준으로 요소를 불러온다.
id와 xpath의 특성들은 다음 표와 같다.
By.CLASS_NAME | class = | 구조를 이해해야하는 진입장벽, 코드가 깔끔. |
By.ID | id = | html에서 중복이 불가능한 요소. |
By.XPATH | 요소 마우스 우클릭 - 복사 - xpath 복사 | 버튼을 클릭할 때 활용. |
위의 요소들의 정보를 기준으로 코드를 써보자.
#목적지 선택
browser.find_element(By.ID,'arvRsStnCdNm').clear() #기본값 삭제
browser.find_element(By.ID,'arvRsStnCdNm').send_keys('동대구')
#날짜 변경
browser.find_element(By.XPATH,'//*[@id="dptDt"]/option[5]').click()
#시간 변경
browser.find_element(By.XPATH,'//*[@id="dptTm"]/option[7]').click()
# 조회하기 버튼
browser.find_element(By.XPATH,'//*[@id="search_top_tag"]/input').click()
4. 자리 예매
예매하려고 하는 버튼을 찾아 크롤링을 한다.
크롤링한 결과가 매진이라면 time함수로 대기시간을 조금 주고, 새로고침을 한다.
while True 문을 통해 예매가 될때까지 이것을 반복한다.
매진이 아니라면 예매를 클릭하고 반복문을 종료한다.
# 자리 확인 - 2024년 7월 12일 금요일 오후 12시 예매
num = 0
import time
while True :
res = browser.find_element(By.XPATH,'//*[@id="result-form"]/fieldset/div[6]/table/tbody/tr[1]/td[6]/a')
if res.text =='매진' :
browser.refresh()
time.sleep(0.5)
# num = num+1
# print(num)
else :
res.click()
break
5. Slack 알림
slack에서 예매 알림 메세지를 보낼 워크스페이스를 만든다.
그리고 그 스페이스에 봇을 하나 등록하고 메세지를 보낼 권한을 부여, 참여시킨다.
.slack api를 통해 파이썬 코드로 봇이 문자를 보내게끔 한다.
여기서 시범 코드를 스크린샷 가장 아래에 제공하고 있다.
그대로 복사해서 코드를 실행해보면 되는데, 윈도우에서는 불가하다.
즉 위 코드와 같은 기능을 하는 코드를 만들어 윈도우에서 실행이 가능하다.
curl -X POST -H 'Content-type: application/json' --data '{"text":"Hello, World!"}' https://hooks.slack.com/services/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
따라서, requests와 json 라이브러리로 아래처첨 코드를 짠다.
여기서 data란 딕셔너리 형식으로, json함수에 전달할 출력 메세지를 말한다.
requests.post는 위 시범 코드의 POST 부분이라 볼 수 있다.
import requests
import json
slack_api_url = 'https://hooks.slack.com/services/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'
data = {
'text': 'SRT 예매에 성공했습니다.'
} #dict ->json
requests.post(
slack_api_url,
data = json.dumps(data),
headers = {'Content-type':'application/json'}
)
슬랙봇을 실행한결과는 다음과 같다.
지금까지 크롤링을 이용한 srt 예매 프로그램을 만들어보았다.
그리고 예매가 성공했을 때 slack으로 메세지도 받게끔 했다.
반복문을 돌릴때, 너무 일정한 간격으로 시도하면 사이트에서 접근을 차단할 수 있다.
이 부분은 time과 random을 이용해서 수정하는 것이 좋다.
'Python' 카테고리의 다른 글
crawling 6 - BeautifulSoup (0) | 2024.07.12 |
---|---|
API를 통한 데이터 수집 (0) | 2024.07.12 |
crawling 4 - Google Playstore 리뷰 예제 (0) | 2024.07.11 |
crawling 3 - YES 24 예제 (0) | 2024.07.11 |
crawling 2 - DBPIA 예제 (0) | 2024.07.11 |