[공부] pyqt5 프로젝트 간단 기록 2024.10.31

 

파이썬 공부 pyqt5를 활용해서 응용프로그램을 만드는 공부를 하고 있습니다. 

 

처음에는 한번에 많은 기능들을 생각하고 추가하려고 하다보니 도저히 시작할 엄두가 나지 않아서 우선 하나하나 기능들을 활용해서 이것저것 추가하는 방식으로 만들어보는 연습을 하기로 했습니다. 가장 먼저 만든 기능은 쿠팡 api를 활용해서 카테고리, 상품개수, 채널명을 입력받고 "등록" 버튼을 누르면 데이터베이스에 API에서 받은 정보를 INSERT 하는 응용프로그램을 만들었습니다. 

 

저는 응용프로그램 폴더와 api폴더 query 폴더를 각각 생성해서 별도의 파이썬 파일을 만들어서 프로젝트를 진행했습니다

 

        self.category_combo = QComboBox()

        sql = mysql_connect()
        categoryies = sql.get_categorty_list()
        for category in categoryies:
            self.category_combo.addItem(category[0])
        layout.addWidget(category_label)
        layout.addWidget(self.category_combo)

 

카테고리 목록 표시는 QComboBox() 기능을 활용했습니다. 리스트는 데이터베이스에서 category 리스트의 정보를 받아와 QComboBox의 아이템에 리스트 정보를 하나씩 추가 했습니다. 

import mysql.connector


class mysql_connect:
    def __init__(self):
        self.host ="111.111.111.111"     # DB접속을 위한 ip주소
        self.user = "userid"          # DB접속 id
        self.password = "password!"  # DB접속 비밀번호
        self.database = "testdb"    # 접근할 DB명

    # 카테고리 리스트를 가지고와 뿌려줄 category_list
    def get_categorty_list(self):
        connection = mysql.connector.connect(host=self.host,user=self.user, password=self.password,
                                             database=self.database)
        cursor = connection.cursor()
        cursor.execute("SELECT category FROM cou_category")
        categories = cursor.fetchall()
        cursor.close()
        connection.close()
        return categories

 

 

데이터베이스에 접근하기 위한 쿼리를 담당하는  mysql_connect 클래스를 밑에 get_category_list 함수를 정의하고 해당 함수를 호출하면 "SELECT category FROM cou_category" cou_category 테이블에서 category 정보만을 가지고와 fetchall() 메서드를 활용해 결과 리스트를 가지고 와 값을 return 합니다. 

 

        # Register Button
        self.register_button = QPushButton("등록")
        self.register_button.clicked.connect(self.register)
        layout.addWidget(self.register_button)

 

 def register(self):
        # Get the selected values

        category = self.category_combo.currentText()
        limit =self.product_count_combo.currentText()
        channel_name = self.channel_name_edit.text()

        coupang = Coupang()
        coupang.best_category(category,limit,subid)

        # Print the values
        print(f"카테고리: {category}")
        print(f"상품 개수: {limit}")
        print(f"채널명: {subid}")

 

 

"등록" 버튼을 누르면 각각 QComboBox , QLineEdit의 내용을 가지고 와 미리 정해둔 Coupang() 클래스에 정의된 함수 best_category에 category, limit, subid 값을 보내줍니다. 

 

class Coupang:

    def __init__(self):
        self.access_key = '1231231231231'  # API access key
        self.secret_key = 'asdfasdf123123123123'  # API secret key
        self.method = 'GET'  # 정보를 얻는것이기 때문에 GET
        self.DOMAIN = "https://api-gateway.coupang.com"

    # coupang 호출시 사용되는 hmac 암호
    def generateHmac(self, url):
        path, *query = url.split("?")
        os.environ["TZ"] = "GMT+0"
        datetime = strftime('%y%m%d',gmtime())+'T'+ strftime('%H%M%S',gmtime())+'Z'
        message = datetime + self.method + path + (query[0] if query else "")
        signature = hmac.new(bytes(self.secret_key , "utf-8"), message.encode("utf-8"), hashlib.sha256).hexdigest()

        return "CEA algorithm=HmacSHA256, access-key={}, signed-date={}, signature={}".format(self.access_key, datetime, signature)


    def best_category(self,category,limit,subid):
        print("가지고온 category 변환해야됨"+ category)
        sql = mysql_connect()
        category_id = sql.get_category_id(category)

        URL = "/v2/providers/affiliate_open_api/apis/openapi/products/bestcategories/"+str(category_id)+"?limit="+limit+"&subId="+subid
        # --- 상품검색! ----끝
        
        url = "{}{}".format(self.DOMAIN, URL)
        response = requests.request(method=self.method, url=url, headers={"Authorization": self.generateHmac(URL),
                                                                          "Content-Type": "application/json;charset=UTF-8"})

        sql.best_category_insert(response.json())

        print(response.json())

 

coupang 클래스에 정의된 함수는 coupang api에 접근하기 위한 정보를 담고 있고 best_category 함수에는 전달받은 값을 가지고 api를 전송할 때 활용됩니다. 

 

받아온 category 정보는 "여성의류","남성의류" 정보로 넘어오게 되는데 쿠팡 api에 데이터를 보낼 때는 카테고리명에 해당하는 id 값 1001, 1002와 같은 데이터로 보내야 되기 때문에 전달받은 문자 ex "여성의류" 같은 정보를 다시 id 값으로 변경을 해줘야 합니다 .

 

따라서  여기서도 sql에 미리 정의한 get_category_id에 category 정보를 넘겨주고 id값을 받아오게 됩니다. 

    def get_category_id(self,category):
        connection = mysql.connector.connect(host=self.host,user=self.user, password=self.password,
                                             database=self.database)
        cursor = connection.cursor()
        print("SELECT * FROM cou_category WHERE category = " + category)
        cursor.execute("SELECT id FROM cou_category WHERE category = '" + category + "'")
        row = cursor.fetchone()

        if row is not None :
            print("카테고리 ID = ",row[0])
        else:
            print("데이터 없음")

        cursor.close()
        connection.close()

        return row[0]

 

전달받은 값 category와 같은 category 정보의 id 값을 가지고 오기위해 SELECT 문에 WHERE의 조건을 추가했습니다.

위에서 카테고리 리스트를 받아 왔을때에는 fetchall() 을 사용해서 모든 행을 한 번에 가지고와 결과를 튜플의 리스트로 반환했지만 이번에는 결과값이 하나이기 때문에 한 행만 가지고 오는 fetchone()을 사용했습니다. 

 

        URL = "/v2/providers/affiliate_open_api/apis/openapi/products/bestcategories/"+ str(category_id) +"?limit="+limit+"&subId="+subid
        # --- 상품검색! ----끝

        url = "{}{}".format(self.DOMAIN, URL)
        response = requests.request(method=self.method, url=url, headers={"Authorization": self.generateHmac(URL),
                                                                          "Content-Type": "application/json;charset=UTF-8"})

 

다시 돌아와 sql 문으로 받은 category_id 값과 전달받은 limit, subid를 가지고 쿠팡 api를 requst 받으면 json 형식으로 데이터를 받아오게됩니다. 

 sql.best_category_insert(response.json())

 

다시 받은 response.json() 값을 정의해둔 best_category_insert 함수에 전달 

  def best_category_insert(self,data):
        connection = mysql.connector.connect(host=self.host, user=self.user, password=self.password,
                                             database=self.database)
        cursor = connection.cursor()
        
        insert_query = """
        INSERT INTO cou_contents (
            product_id, product_name, product_price, product_image,
            product_url, category_name, keyword, rank,
            isrocket, isfreeshipping
        ) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
        """
        for item in data['data']:
            values = (
                item['productId'],
                item['productName'],
                item['productPrice'],
                item['productImage'],
                item['productUrl'],
                item['categoryName'],
                item['keyword'],
                item['rank'],
                item['isRocket'],
                item['isFreeShipping']
            )
            cursor.execute(insert_query, values)

        # Commit the transaction
        connection.commit()

        # Close the cursor and connection
        cursor.close()
        connection.close()

 

받아온 json 데이터를 반복문을 활용해 cursor.execute(insert_query, values) 항목으로 하나하나 데이터베이스에 넣어주고 데이터 베이스에 밀어넣은 값을 적용 connection.commit() 해주었습니다. 

 

 

등록 버튼을 눌러 데이터가 정상적으로 DB에 들어갔는지 확인.

 

아직은 쿠팡 api를 활용해 데이터베이스에 베스트카테고리 목록을 insert 하는 것 까지 한번 해봤습니다. 여기에 이제 하나하나 데이터를 활용하는 프로그램으로 만드는것을 해볼 예정입니다. 

Designed by JB FACTORY