본문 바로가기
프로젝트/SRT&KTX 매진표 예매

SRT&KTX 기차표 매크로 예매 - (6) 아이디/비밀번호 저장하기

by 매크로메이커 2024. 1. 12.

개발하면서 프로그램을 계속 껐다 켰다 반복하다보니, 매번 로그인하는게 너~~~무 귀찮다.

 

그래서 id&pw 저장하는 기능을 만들고 다음 스텝으로 넘어가려고 한다.

 

json 형태로 파일을 떨어뜨릴거라, 계정이 pc에 저장되는 아주 위험한 작업이다..!

공용 컴퓨터에서 할 경우 개인계정이 노출될 수 있음을 주의하자!

 

나중에는 실행파일을 만들어서 배포할 예정이므로, db가 생성되는 경로를 다르게 만들어야 한다.

def get_db_path():
    try:
        # PyInstaller에 의해 임시폴더에서 실행될 경우 임시폴더로 접근하는 함수
        # 한 단계 상위에 db를 생성해야 삭제되지 않음
        return os.path.join(os.path.join(sys._MEIPASS, os.pardir), 'train_db.json')
    except Exception:
        return os.path.join(os.path.abspath("."), 'train_db.json')

 

try 구문 안의 내용이 실행파일을 위한 코드이고, Exception 안의 내용은 .py 파일로 실행했을 때를 위한 코드이다.

 

exe 파일로 실행하면, 임시 경로에 파일이 풀어져서 실행되는데 그 경로가 sys._MEIPASS 이다.

파일을 실행할 때마다 sys._MEIPASS 폴더는 사라지므로, 한 단계 상위 폴더에 db를 만들어 주기 위해서 위와 같이 코드를 작성했다.

 

db를 불러오는 함수를 만들어보자.

def load_db():
    try:
        with open(get_db_path(), 'r') as file:
            data = json.load(file)
            return data
    except:  # 파일이 없거나, dict 형태로 변환에 실패했을 경우
        return dict()

db 파일이 없거나, 손상되어 dict로 변환이 불가능한 경우를 예방하기 위해, 예외처리를 해준다.

 

db를 저장하는 함수를 간단하게 만들자. 여기서 data는 dictionary 타입이다.

def save_db(data):
    with open(get_db_path(), 'w', encoding='utf-8') as file:
        json.dump(data, file, indent="\t")

 

이렇게 완성된 파일은 아래와 같다

util.py
import datetime
import json
import os
import sys


def get_nowtime():
    return datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")


def get_db_path():
    try:
        # PyInstaller에 의해 임시폴더에서 실행될 경우 임시폴더로 접근하는 함수
        # 한 단계 상위에 db를 생성해야 삭제되지 않음
        return os.path.join(os.path.join(sys._MEIPASS, os.pardir), 'train_db.json')
    except Exception:
        return os.path.join(os.path.abspath("."), 'train_db.json')


def save_db(data):
    with open(get_db_path(), 'w', encoding='utf-8') as file:
        json.dump(data, file, indent="\t")


def load_db():
    try:
        with open(get_db_path(), 'r') as file:
            data = json.load(file)
            return data
    except:  # 파일이 없거나, dict 형태로 변환에 실패했을 경우
        return dict()

 

로그인 정보를 저장할지 물어보는 checkBox을 하나 만들어주고,

로그인 정보 저장을 위한 라디오 버튼

 

db를 UiMainClass에서 불러오자.

class UiMainClass(QDialog):
    def __init__(self):
        self.srt = SRT(self.error_callback, self.srt_try_callback)
        self.srt_stations = self.srt.get_stations()
        self.srt_thread = None

        self.radiobuttons = []
        self.schedules = []

        self.reservation_list = []
        self.reservation_idx = 0

        self.db = load_db()

 

db에서 불러온 정보를 Init_ui 에서 업데이트 해주자!

    def init_ui(self):
        self.main_ui.label_version.setText(version)
        self.main_ui.label_srt_logged_in.hide()

        ### SRT ###
        # db에 데이터가 있는 경우 불러오기
        if 'srt_login_type' in self.db.keys():
            if self.db['srt_login_type'] == 0 or self.db['srt_login_type'] == 1 or self.db['srt_login_type'] == 2:
                self.main_ui.comboBox_srt_login_type.setCurrentIndex(self.db['srt_login_type'])
        if 'srt_id' in self.db.keys():
            self.main_ui.lineEdit_srt_id.setText(self.db['srt_id'])
        if 'srt_pwd' in self.db.keys():
            self.main_ui.lineEdit_srt_pwd.setText(self.db['srt_pwd'])
        if 'save_login_info' in self.db.keys() and self.db['save_login_info']:
            self.main_ui.checkBox_srt_save_login.setChecked(True)

 

db에 저장은 로그인 버튼을 클릭할 때 진행하므로, pushButton_srt_login_clicked 에서 db에 저장한다.

로그인이 성공했을 때만, db를 바꾼다.

    def pushButton_srt_login_clicked(self):
        login_type = self.main_ui.comboBox_srt_login_type.currentIndex()
        srt_id = self.main_ui.lineEdit_srt_id.text()
        srt_pwd = self.main_ui.lineEdit_srt_pwd.text()

        if self.srt.login(str(login_type + 1), srt_id, srt_pwd):
            # 로그인 성공
            self.main_ui.groupBox_login.hide()
            self.main_ui.label_srt_logged_in.setText(f'로그인 계정 : {srt_id}')
            self.main_ui.label_srt_logged_in.show()

            if self.main_ui.checkBox_srt_save_login.isChecked():
                # 로그인 정보 저장
                self.db['srt_login_type'] = login_type
                self.db['srt_id'] = srt_id
                self.db['srt_pwd'] = srt_pwd
                self.db['save_login_info'] = True
            else:
                # 로그인 정보 삭제
                self.db['srt_login_type'] = 0
                self.db['srt_id'] = ''
                self.db['srt_pwd'] = ''
                self.db['save_login_info'] = False
            save_db(self.db)

 

실행해보면 로그인 정보가 잘 저장되고 불러와진다..!

 

 

[참고 사이트]

 

파이썬 pyinstaller 활용하여 exe 파일 만드는 방법 - Dorulog

파이썬을 활용해서 프로그램을 만들때 실행파일인 EXE로 만들 수 있습니다.

dorulog.com

 

 

Python JSON file 다루는 방법 (json 파일 읽기, 쓰기, 수정 하는 방법)

Python JSON file 다루는 방법 (json 파일 읽기, 쓰기, 수정 하는 방법) Python 에서 json 파일을 읽고, 쓰고, 수정하는 방법을 알려드리도록 하겠습니다. JSON 파일 쓰는 방법 - json.dump() import json data = { "olivi

jsikim1.tistory.com