Telegram으로 KTX 열차표 자동 예매

 

Python, Telegram으로 KTX 열차표 예매하기(#1 준비)

이번에 만들 프로그램은 텔레그램 봇을 이용한 KTX 자동 예매 프로그램입니다. 1. 개념 이해 위 프로그램은 PC에서 파이썬 파일을 구동하고, 텔레그램 봇을 통해 파이어폭스 웹브라우져를 실행시

conansjh20.tistory.com

일전에 파이썬과 텔레그램을 이용하여 KTX 열차표 자동예매를 만들었습니다. 이번에는 PC에서 PyQt5로 프로그램을 만들어 SRT 열차표 예매하는 프로그램을 만들어 보겠습니다.

 

아래는 결과화면입니다.1초단위로 계속 브라우저 새로고침을 하며 열차표 자리가 나면 바로 예약합니다.😎

 

결과화면

브라우저를 학대하는 기분이 드네요.ㅋㅋ;

사실 이전 텔레그램을 이용하여 KTX 열차표 예매하는 코딩짜기보다 훨씬 난이도는 낮지만 웹 크롤링이라는 것이 참... 어렵진 않은데 피로도가 쌓이는 작업입니다. 말로 설명하긴 어려운데 정말 다양한 케이스가 있어 그것에 맞는 코드를 찾는데 참 삽질을 많이 했습니다.

 

사용한 파이썬 라이브러리는 다음과 같습니다.

  1. PyQt5 (pip install pyqt5)
  2. Selenium (pip install selenium)
  3. sys (내장 라이브러리, pyqt5를 돌리는데 필수로 들어갑니다.)
  4. time (내장 라이브러리, 중간중간 시간 딜레이를 줄 때 사용합니다.)
  5. datetime (내장 라이브러리, 년월일 데이터를 가공하는데 쓰입니다.)
  6. playsound (내장 라이브러리, mp3 파일을 재생하는데 쓰입니다. 매크로 돌려놓고 딴일하다가 예약하면 음악이 재생되도록 했습니다.😋)

PyQt5는 파이썬 프로그램을 GUI로 구현해 주는 프로그램입니다. 대표적으로 Tkinter, Pygame등이 있고 아예 웹브라우저로 구현할 때는 Flask를 사용하기도 합니다. 각각의 경우에 맞는 프로그램을 쓰는것이 가장 좋겠지요.

 

그리고 PyQt5를 설치하면 Qt Designer라는 툴을 제공하는데 직접 레이아웃을 짤 수 있습니다. 훨씬 편하지요. Qt Designer의 경로는 별도의 가상환경을 세팅하여 설치하지 않았다면 다음의 경로에 있습니다.

C:\Users\내이름\AppData\Local\Programs\Python\Python38\Lib\site-packages\qt5_applications\Qt\bin\designer.exe

파일을 찾았으면 바로가기로 빼 놓읍시다. 매번 들어가기 귀찮으니..

 

기본적인 프로그램의 구동 순서를 이해하고 진행하는 것은 중요할 것 같습니다. 뭐든지 그렇지만 삽질을 최소화하기 위해서는 아이디어 만큼이나 기획이 중요합니다.

  1. 파이어폭스 웹브라우저 구동
  2. SRT 웹페이지로 이동하여 자동 로그인 및 예매화면으로 이동(최초 1번만 수행)
  3. PyQt GUI 창 오픈
  4. 출발지, 목적지, 날짜, 시간을 입력하고 검색 (반복가능)
  5. SRT 웹페이지에서 검색하여 PyQt로 전송
  6. SRT 웹페이지를 보고 원하는 좌석이 매진일경우 PyQt화면의 예약에 Check한 후 아래 예약 시도를 클릭
  7. 예약할때까지 계속 창을 새로고침하다가 자리가 나면 바로 예약하고 mp3를 재생해줌.

이제 본격적인 코딩을 해 봅시다.🤓

PyQt5, Qt Designer로 Layout 짜기

왼쪽 상단에 원하는 정보(출발지/목적지/일자/시간)를 선택하고 검색하는 화면입니다. 그리고 왼쪽에는 검색 후 결과를 보여주는 화면이며 왼쪽하단에 예약시도 버튼이 있습니다. 그리고 오른쪽 SRT 지도는 출발지/목적지를 선택하는 참고일 뿐 별다른 기능은 없습니다.

 

항상 여러 파일이 모여있는 파이썬 프로그램을 코딩할 경우 실행파일은 __init__.py로 작성해 봅니다.

 

일단 기본적인 PyQt5의 기본창이 뜨는 필수적인 코딩입니다.

from PyQt5 import QtWidgets
from PyQt5 import uic
from PyQt5.QtCore import *
from srt_book import SRT_page
import sys
import time
import playsound
import datetime

class Form(QtWidgets.QDialog):
    def __init__(self, parent=None):
        QtWidgets.QDialog.__init__(self, parent)
        self.ui = uic.loadUi("gui.ui")


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    w = Form()
    sys.exit(app.exec())

일단 관련된 모든 모듈을 불러옵니다. PyQt5안에서도 세부적인 모듈이 있어 세가지로 나뉘어 있는데 그냥 저렇게 사용합시다.

 

그리고 from srt_book import SRT_page는 짐작하시듯 srt_book.py안의 SRT_page라는 클래스를 불러옵니다.

그리고 이어서 위와 같이 작성했는데 다른 건 그대로 사용하고 self.ui = uic.loadUi("gui.ui")는 제가 앞서 언급한 Qt Designer를 통해서 만든 레이아웃을 불러오는 구문입니다. gui.ui에는 각 요소들(레이블, 버튼, 표, 그림)들의 위치정보를 포함한 각종 정보들이 모두 코딩으로 들어있습니다.

 

그리고 우리는 __init__.py에는 각 요소들의 이름만 가져와서 각종 event를 넣어 구동하게 만들면 됩니다.

 

기본적인 Qt Designer 사용법을 알아봅니다.

새 폼 만들기를 통해 Main Window를 만듧니다.


위의 사진과 같이 오른쪽 동그라미는 창이름과 창의 크기를 설정하는 메뉴이고 다른 수많은 메뉴들은 창의 속성을 컨트롤합니다.


창 사이즈 변경 불가/가능 등과 같은 설정들이 있겠지요.

 

그리고 왼쪽의 각종 요소들을 내 폼에 끌어와 레이아웃을 구성하는 것입니다. 본 프로그램의 경우 다음의 요소들을 끌어왔습니다.

  • QComboBox : 출발지/도착지 선택하는 메뉴입니다.
  • QDateEdit : 날짜 선택 메뉴입니다.
  • QLabel : 오른쪽 SRT 지도표시에 사용되었습니다. 가장 일반적인 특징없는 요소라고 보시면 됩니다.
  • QCheckBox : 예약 체크 버튼입니다.
  • QTableWidget : 검색후 기차편 정보가 보여지는 테이블 위젯입니다.
  • QPushButton : 열차편 검색/예약 시도 버튼

그리고 위의 그림 오른쪽 상단과 같이 내가 각 요소를 내 폼에 끌어놓으면 오른쪽 객체 탐색기에 추가가 되고 왼쪽은 이름(곧 변수명)이고 오른쪽은 요소 속성(클래스)이 나옵니다.

 

각 요소들의 사용법은 실제로 사용할 때 설명하도록 하겠습니다.

 

첨부 파일을 참고하셔서 전체 레이아웃을 확인하세요. (SRT 지도 그림파일도 함께)

gui.ui
11.1 kB
map.png
38.1 kB

그리고 __init__.py 파일에 추가한 요소들에 대한 변수를 저장합니다.

class Form(QtWidgets.QDialog):
    def __init__(self, parent=None):
        QtWidgets.QDialog.__init__(self, parent)
        self.ui = uic.loadUi("gui.ui")
        self.dep = self.ui.depCity                  #출발지
        self.arr = self.ui.arrCity                  #도착지
        self.dat = self.ui.depDate                  #출발일
        self.hou = self.ui.depHour                  #출발시간
        self.table = self.ui.resTable               #검색결과 표
        self.check_list = [self.ui.checkBox_01,     #체크박스 10개
                            self.ui.checkBox_02,
                            self.ui.checkBox_03,
                            self.ui.checkBox_04,
                            self.ui.checkBox_05,
                            self.ui.checkBox_06,
                            self.ui.checkBox_07,
                            self.ui.checkBox_08,
                            self.ui.checkBox_09,
                            self.ui.checkBox_10
        ]
        self.ui.show()

SRT 지도는 어떠한 기능도 없기때문에 저장할 필요가 없고 검색 버튼과 예약하기 버튼은 잠시 홀딩합니다.

그리고 창을 띄우는 self.ui.show()도 추가해봅시다.

 

이제 프로그램을 실행하면 기본적인 Layout이 작성 되었습니다.😎

 

Python, SRT 자동예매(매크로) 프로그램 만들기 (feat. PyQt5) - 1. 시작, 레이아웃 작성
Python, SRT 자동예매(매크로) 프로그램 만들기 (feat. PyQt5) - 2. Selenium 원격 컨트롤
Python, SRT 자동예매(매크로) 프로그램 만들기 (feat. PyQt5) - 3. 자동 예매, 매크로, 끝

+ Recent posts