From 4f7fd9c20b248c8daf227292f3ce95376f788eba Mon Sep 17 00:00:00 2001 From: Envy_PC Date: Fri, 17 May 2024 23:04:36 +0900 Subject: [PATCH] Pushbutton connect --- requirements.txt | 6 +++++ ui/apikey_widget.py | 52 +++++++++++++++++++++++++++++++++++++ ui/main_window.py | 48 ++++++++++++++++++++++++++-------- utils/playwright_helpers.py | 18 ++++++++----- 4 files changed, 106 insertions(+), 18 deletions(-) create mode 100644 ui/apikey_widget.py diff --git a/requirements.txt b/requirements.txt index e69de29..5e43f6e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -0,0 +1,6 @@ +pyqt5 +asyncqt +playwright +cryptography +loguru +pyperclip \ No newline at end of file diff --git a/ui/apikey_widget.py b/ui/apikey_widget.py new file mode 100644 index 0000000..ed7de1d --- /dev/null +++ b/ui/apikey_widget.py @@ -0,0 +1,52 @@ +from PyQt5.QtWidgets import QWidget, QVBoxLayout, QLabel, QPushButton, QHBoxLayout +import pyperclip + +class ApiKeyWidget(QWidget): + def __init__(self): + super().__init__() + self.setWindowTitle("API Keys") + self.setGeometry(100, 100, 400, 400) + + self.layout = QVBoxLayout() + self.setLayout(self.layout) + + # 초기화된 UI 구성 요소를 저장할 리스트 + self.key_widgets = [] + + # 확인 버튼 추가 및 초기화 + self.confirm_button = QPushButton("확인") + self.confirm_button.clicked.connect(self.close) + self.layout.addWidget(self.confirm_button) + + def call_UI(self, api_keys): + # 기존 위젯 제거 + self.clear_layout() + + if api_keys: + for key, value in api_keys.items(): + h_layout = QHBoxLayout() + + key_label = QLabel(f"키 이름: {key}") + value_label = QLabel(f"키 값: {value}") + copy_button = QPushButton("키 복사") + + copy_button.clicked.connect(lambda checked, v=value: self.copy_to_clipboard(v)) + + h_layout.addWidget(key_label) + h_layout.addWidget(value_label) + h_layout.addWidget(copy_button) + + self.layout.insertLayout(self.layout.count() - 1, h_layout) + self.key_widgets.append((key_label, value_label, copy_button)) + + self.show() + + def clear_layout(self): + for widgets in self.key_widgets: + for widget in widgets: + widget.deleteLater() + self.key_widgets.clear() + + def copy_to_clipboard(self, value): + pyperclip.copy(value) + print(f"Copied to clipboard: {value}") diff --git a/ui/main_window.py b/ui/main_window.py index 5976d15..38ac28c 100644 --- a/ui/main_window.py +++ b/ui/main_window.py @@ -5,14 +5,17 @@ from ui.business_settings import BusinessSettingsDialog from ui.help_dialog import HelpDialog from utils.playwright_helpers import PlaywrightHelper from utils.config import ConfigManager -import asyncio +import asyncio, pyperclip +from ui.apikey_widget import ApiKeyWidget class MainWindow(QMainWindow): def __init__(self, config, logger): super().__init__() self.config = config self.logger = logger + self.current_api_keys = {} self.playwright_helper = PlaywrightHelper() + self.api_widget = ApiKeyWidget() self.setWindowTitle('Change-Percenty2') self.setGeometry(100, 100, 450, 800) @@ -186,6 +189,14 @@ class MainWindow(QMainWindow): self.market_info_at_label = QLabel('------') self.market_info_cc_btn.clicked.connect(lambda: self.market_info_cc_btn_clicked(self.market_info_cc_btn)) + self.market_info_ss_btn.clicked.connect(lambda: self.market_info_cc_btn_clicked(self.market_info_ss_btn)) + self.market_info_dm11_btn.clicked.connect(lambda: self.market_info_cc_btn_clicked(self.market_info_dm11_btn)) + self.market_info_gb11_btn.clicked.connect(lambda: self.market_info_cc_btn_clicked(self.market_info_gb11_btn)) + self.market_info_esm_btn.clicked.connect(lambda: self.market_info_cc_btn_clicked(self.market_info_esm_btn)) + self.market_info_lton_btn.clicked.connect(lambda: self.market_info_cc_btn_clicked(self.market_info_lton_btn)) + self.market_info_ip_btn.clicked.connect(lambda: self.market_info_cc_btn_clicked(self.market_info_ip_btn)) + self.market_info_wmp_btn.clicked.connect(lambda: self.market_info_cc_btn_clicked(self.market_info_wmp_btn)) + self.market_info_at_btn.clicked.connect(lambda: self.market_info_cc_btn_clicked(self.market_info_at_btn)) self.market_info_box.addWidget(self.market_info_label,1,1,1,2) @@ -290,8 +301,14 @@ class MainWindow(QMainWindow): self.at_checkbox.setChecked(False) def market_info_cc_btn_clicked(self, button): - print(f"button 클릭됨 : {button}") - # self.label.setText(f'{button.text()} clicked') + currentBtnMarket = button.text() + if self.current_api_keys: + print("get_market_infos 호출") + market_api_infos = self.get_market_infos(self.current_api_keys, currentBtnMarket) + print("call_UI") + self.api_widget.call_UI(market_api_infos) + else: + print(f"{currentBtnMarket}의 마켓정보 없음") async def fetch_settings(self): self.logger.debug("Fetching settings...") @@ -303,18 +320,19 @@ class MainWindow(QMainWindow): user_id = self.config.get('USER', 'user_id') password = self.config.decrypt(self.config.get('USER', 'password')) - api_keys = await self.playwright_helper.login_and_fetch_api_keys('https://percenty.co.kr', user_id, password, self.status_label, self.progress_bar) - print(f"가져온 apikeys\n{api_keys}") + web_api_keys = await self.playwright_helper.login_and_fetch_api_keys('https://percenty.co.kr', user_id, password, self.status_label, self.progress_bar) + self.current_api_keys = web_api_keys + print(f"가져온 apikeys\n{web_api_keys}") - business_info = self.search_apikeys(api_keys) + business_info = self.search_apikeys_for_business(web_api_keys) # 가져온 API 키를 UI에 업데이트하는 로직 추가 - self.update_market_info(api_keys, business_info) + self.update_market_info(web_api_keys, business_info) self.progress_bar.setValue(100) self.status_label.setText('현재 상태: 설정 가져오기 완료') await self.playwright_helper.close_browser() - def search_apikeys(self, api_keys): + def search_apikeys_for_business(self, api_keys): self.status_label.setText('현재 상태: 키 검증하기') business_info = { @@ -328,7 +346,7 @@ class MainWindow(QMainWindow): # max_business = int(self.config.get('DEFAULT', 'max_businesses')) all = self.config.get_all_businesses() - print(f"사업자 수 : {len(all)}") + print(f"저장된 사업자 수 : [{len(all)}] 개") print(f"all : {all}") progress_step = 15 / len(all) @@ -337,7 +355,6 @@ class MainWindow(QMainWindow): try: # 저장된 모든 사업자 정보 가져오기 - for business_section in all: print(f"키검증 business_section : {business_section}") stored_api_keys = self.config.get_api_keys(business_section) @@ -359,9 +376,18 @@ class MainWindow(QMainWindow): print(f"business_info{business_info}") return business_info + def get_market_infos(self, current_api_keys, market_name): + # 현재 current_api_keys는 이미 전체 마켓 데이터를 포함하는 사전입니다. + if market_name in current_api_keys: + market_details = current_api_keys[market_name] + api_keys = {key: value for key, value in market_details.items() if 'key' in key.lower() or '키' in key} + return api_keys + else: + return None + def update_market_info(self, api_keys, business_info): - print(f"update_market_info : {api_keys}, {business_info}") + print(f"update_market_info : {api_keys}\n\n{business_info}") # 사업자 정보 업데이트 self.business_info_label_context.setText(business_info['사업자별칭']) diff --git a/utils/playwright_helpers.py b/utils/playwright_helpers.py index 330f8fc..cccb5e3 100644 --- a/utils/playwright_helpers.py +++ b/utils/playwright_helpers.py @@ -30,17 +30,21 @@ class PlaywrightHelper: progress_bar.setValue(20) status_label.setText('현재 상태: 퍼센티 로그인 완료') - - # 팝업 다이얼로그 닫기 (있는 경우) - try: - await page.click("xpath=body > div:nth-child(10) > div > div.ant-modal-wrap.ant-modal-centered > div > div.ant-modal-content > div.ant-modal-footer > button.ant-btn.css-1li46mu.ant-btn-primary") - except: - pass - # 마켓 설정 페이지로 이동 await page.click("xpath=/html/body/div[1]/div/div/div/div/aside/div/ul/li[7]/ul/li[2]") # await page.click("div#root li.ant-menu-item.ant-menu-item-selected.ant-menu-item-only-child > span") + # 마켓 설정상 팝업 다이얼로그가 있는 경우 닫기 (있는 경우) + try: + # await page.click(".ant-modal-footer [type='button']") + await page.click("div.ant-modal-footer > button[type=\"button\"].ant-btn.css-1li46mu.ant-btn-primary") + + # .ant-modal-content + # .ant-modal-footer [type='button'] + + except: + pass + progress_bar.setValue(30) status_label.setText('현재 상태: 마켓 설정')