이제부턴 본격적인 코딩이 시작됩니다. 그리고 telegram.py와 korail.py를 왔다갔다하며 동시에 작성을 해야 합니다.
편의상 코드 페이지의 배경을 telegram.py는 검은색 korail.py는 보라색으로 하여 작성하겠습니다.
1. import
1) telegram.py
1
2
3
4
|
import telepot
from korail.korail import *
import re
import textwrap
|
cs |
import telepot
: 텔레그램봇을 이용할 수 있게 해주는 라이브러리입니다. 인터넷을 보면 다른 텔레그램봇 라이브러리도 있지만 텔레그램에서 가장 사용을 추천하는 라이브러리라고 합니다.
from korail.korail import *
:korail 폴더에서 korail.py를 불러오는 역할을 합니다. 앞서 설명한대로 __init__.py 가 메인 실행 프로그램이기 때문에 이 파일 기준의 경로에 따라 korail 폴더의 korail.py를 불러옵니다.
즉, 앞 포스트와 연계하여 본다면 __init__.py에서 telegram.py를 import하고 telegram.py가 korail.py를 import하는 구조입니다. (나중에 korail.py에서 다시 telegram.py로 넘어가야 하는 경우가 생기는데 그것은 나중에 다루도록 하겠습니다.)
import re
: 개인적으로 코딩의 꽃이라고 생각하는 정규표현식(regular expression)입니다. 아무리 강조해도 지나치지 않고 본 프로그램에서도 핵심적으로 사용됩니다.
import textwrap
: 장문의 텍스트를 하나의 변수로 저장할 때 사용하는 라이브러리로 위 프로그램에서는 "도움말"을 입력하였을 때 장문의 설명이 출력될 때 사용합니다.(정규표현식과 마찬가지로 기본으로 내장된 함수입니다.)
2) korail.py
1
2
3
4
|
from selenium import webdriver
from selenium.webdriver.support.ui import Select
from selenium.webdriver.common.keys import Keys
import time
|
cs |
from selenium import webdriver
: 셀레니움 라이브러리 안에서 webdriver 기능을 불러옵니다. webdriver 기능을 파이어폭스 브라우져로 설정한 다음 웹 안에서의 모든 접근/명령을 파이썬 코딩을 통해 진행하게 됩니다.
from selenium.webdriver.support.ui import Select
: html 언어중 checkbox를 선택할 수 있게 해주는 selenium 내부의 Select 기능이라 보시면 됩니다.
from selenium.webdriver.common.keys import Keys
: 마찬가지로 selenium 안에 있는 웹상에서 직접 키보드 키를 입력하게 해주는 기능입니다. 본 프로그램에서는 로그인할 때 아이디 입력하고 비밀번호 입력한 뒤 바로 엔터를 치게 하는 기능으로 이용합니다.
import time
:time.sleep(시간 초단위) 으로 프로그램 진행에 딜레이를 줍니다. 인터넷 웹페이지는 컴퓨터 성능 및 인터넷 속도에 따라 창이 바뀌는데 시간이 소요되지만 프로그램의 경우 훨씬 더 빠르게 각 구문이 진행되기 때문에 중간중간 딜레이를 시켜줘야 합니다. time 역시 매우 중요한 기능입니다. 빠른게 무조건 좋지만은 않군요.ㅎ
2. 기본적인 클래스 구조 확인
1) telegram.py
1
2
3
4
5
6
7
8
9
|
import telepot
from korail.korail import *
import re
import textwrap
class Telegram():
def __init__(self):
def start_telegram(self, msg, info = None):
|
cs |
Telegram 이란 이름의 클래스를 만들고 함수는 딱 두개입니다.
def __init__(self):
:기본적으로 실행되는 명령어들을 모아 놓았습니다.
- 텔레그램봇에 접속
- korail.py 실행
- start_telegram 함수를 무한 loop 시킵니다.
def start_telegram(self, msg, info = None):
: 앞서 __init__에서 무한 loop시킨 함수로 텔레그램에서 실시간으로 입력되는 메세지를 받게되는 함수라고 보면 됩니다. 받는 인자를 보면 msg와 info입니다. 바로 msg가 실시간으로 입력되어지는 텔레그램 메세지이며 info는 그 외의 정보라고 보면 됩니다. (info는 None으로 미리 설정해 둡니다.)
텔레그램 메세지를 입력하면 항상 반응할 수 있어야 하기 때문에 위의 함수 안에서 모든 명령/정보가 전달되고 통제된다고 보면 됩니다.
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
|
class Korail():
def __init__(self):
def login(self):
def back_to_home(self):
def fill_departure_city(self, city):
def fill_arrival_city(self, city):
def fill_year(self, year):
def fill_month(self, month):
def fill_day(self, day):
def fill_hour(self, hour):
def search_seats(self):
def try_seats(self, order):
|
cs |
변수나 함수의 이름을 짓는 방법에 대한 규칙(convention)이 있습니다. 얼마전 유튜브 '노마드 코더' 동영상을 보며 배운 규칙 중 가장 공감되었던 규칙 중 하나는 함수의 이름은 '동작형', 변수의 이름은 '명사형'으로 지어야 한다는 것이었고 이름만 보고도 그 기능을 파악할 수 있게 너무 막연하지도 너무 디테일하지도 않게 만들어야 한다는 것이었습니다.(너무 디테일하면 이름이 너무 길어지게 됩니다.) 어찌보면 당연한 말인데 자주 간과하곤 합니다.
각각의 함수에 대한 설명은 따로 작성하지 않겠습니다. 아마도 위의 함수들의 이름만 봐도 대충 그 기능이 짐작 되시리라 생각됩니다. 흐뭇하네요.
참고로 위 함수 중 fill_hour의 경우 fill_time을 안쓰고 fill_hour로 작성하였습니다. 앞서 말한 이유대로 가급적 time같은 단어는 너무 막연한 단어라 최대한 사용을 자제하는 것이 좋습니다.(그렇지만 어느순간 쓰고있습니다...) 결국 위 동영상 속 유튜버는 프로그램을 완성 후 다시 변수/함수의 이름을 수정하고 주석들을 새로 달아주는 교정의 과정을 강조합니다. 애초에 처음부터 완벽하게 코딩하는 사람은 거의 없기 때문입니다.
처음부터 너무 지루하게 개념정리만 하고 있는 것 같지만 개념을 이해하면 분명 더 나은 방법으로 코딩하는 분도 계실 수 있고 좀 더 다음 진도를 예상하며 나아갈 수 있을 것이라 생각되어 이렇게 작성하였습니다.
목차
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 마무리)