본문 바로가기

프로그램 개발일지

[Python] 스마트 스토어 API 활용 네이버 커머스 API 3편

반응형
 

Instagram

 

www.instagram.com

 

1편

 

 

[Python] 스마트 스토어 API 활용 네이버 커머스 API 1편

프로그래밍으로 돈을 벌기 시작한건 내 쇼핑몰 때문이였다. 스마트스토어의 상품 노출 로직을 이해하고 있었지만, 상품을 등록하는 작업들이 은근 단순반복 노동에 가까웠다. 자동화 할 수

myworld1004.tistory.com

 

2편

 

 

[Python] 스마트 스토어 API 활용 네이버 커머스 API 2편

1편:  [Python] 스마트 스토어 API 활용 네이버 커머스 API 1편프로그래밍으로 돈을 벌기 시작한건 내 쇼핑몰 때문이였다. 스마트스토어의 상품 노출 로직을 이해하고 있었지만, 상품을 등록하는

myworld1004.tistory.com

 

 

 

 

 

 

 

 

매일 매일 블로그에 글을 써야지 생각은 하는데, 막상 글 쓰는게 너무 어렵다.....

하루종일 쇼핑몰 .... 코딩 ..... .....

 

 

 

1편에서 네이버커머스 토큰을 얻었고, 2편에서는 상품목록을 가져왔다.

 

 

 

 

네이버커머스 api들을 앞으로도 유용하게 써먹기 위해서 class로 만들어줄 예정이다.

 

이번 3편부터는 본격적으로 시작해보자 !

 

 

 

 

 

 

 

class SmartStore():
    def __init__(self):

 

 

 

먼저 SmartStore 라는 class를 만들어주자

 

를 하기전에 class가 뭔지 짚고 넘어가보자.

 

 

gpt한테 물어봤다.

 

 

 

Q. 파이썬 class에 대해서 자세하게 설명해줘 초보자도 알아듣기 쉽게

 

A.

파이썬의 클래스는 객체 지향 프로그래밍(OOP)의 핵심 개념 중 하나입니다. 클래스는 객체를 생성하기 위한 청사진(또는 설계도)이라고 생각할 수 있습니다. 객체는 클래스의 인스턴스(instance)입니다. 쉽게 설명하자면, 클래스는 붕어빵 틀이고, 객체는 그 틀에서 만들어진 붕어빵입니다.

 

 

 

 

class Dog:
    # 클래스 속성
    species = "Canis familiaris"

    # 초기화 메서드 (생성자)
    def __init__(self, name, age):
        self.name = name  # 인스턴스 속성
        self.age = age    # 인스턴스 속성

    # 메서드
    def bark(self):
        return f"{self.name}가 멍멍 짖습니다."

my_dog = Dog("바둑이", 3)
print(my_dog.name)  # 출력: 바둑이
print(my_dog.age)   # 출력: 3
print(my_dog.bark())  # 출력: 바둑이가 멍멍 짖습니다.

 

 

 

 

대충 이렇다고 한다. 나는 그런거 모르겠고 사실 뭔가 코딩하는 사람 처럼 보여서 쓴다.

....

 

 

 

 

 

class SmartStore():
    def __init__(self):
        self.id = '클라이언트 ID'
        self.secret = '클라이언트 시크릿'
        self.token = self.tokens()
        
    def tokens(self):
        timestamp = str(int((time.time() - 10) * 1000))
        pwd = f'{self.id}_{timestamp}'
        hashed = bcrypt.hashpw(pwd.encode('utf-8'), self.secret.encode('utf-8'))
        client_secret_sign = pybase64.standard_b64encode(hashed).decode('utf-8')

        url = "https://api.commerce.naver.com/external/v1/oauth2/token"
        headers = {'Content-Type': 'application/x-www-form-urlencoded'}
        data = {
            'grant_type': 'client_credentials',
            'client_id': self.id,
            'timestamp': timestamp,
            'client_secret_sign': client_secret_sign,
            'type': 'SELF'
            }
        response = requests.post(url, headers=headers, data=data)
        response_json = json.loads(response.text)
        if 'access_token' in response_json:
            token = response_json['access_token']
            return token
        else:
            return None

 

 

우리 SmartStore(이하 스스) 클래스는 이렇게 시작을 한다.

스스 클래스가 생성되면, 가장 먼저 def __init__(self): 부분이 시작된다.

 

생성 되자마자, 토큰을 받아오기 위함이다. --> api를 사용하려면 토큰이 있어야 하니깐 !

 

 

 

 

 

스스가 생성되면, 스스 클래스 내부의 함수인 tokens의 반환값을 self.token에 저장한다.

이 self.token은 스스 클래스 내부의 어디서도 사용할 수 있고,

심지어 클래스 밖에서도 사용할 수 있다 !

 

 

 

2편에서 상품 목록을 가져왔는데, 조금 deep하게 수정을 해보자 .

 

 

상품조회는 500개씩만 할 수 있는데, 내 상품이 500개가 넘어갈때는 어떻게 해야할까.

단순히 반복문을 쓰면 될꺼 같지만,

맞다. 반복문 쓰면 된다.

 

 

 

from datetime import datetime as date

def productlist(self):

 

 

 

from datetime import datetime as date

 

 

 

상품목록 가져올땐 오늘 날짜가 중요하다.

오늘 날짜를 가져오기 위해 모듈을 불러와주자.

 

 

그 뒤 productlist 함수를 새로 만들어주고

 

 

a, c, itemlist = [], [], []
conn = http.client.HTTPSConnection("api.commerce.naver.com")
today = date.now().date()

 

필요한 변수들을 선언해준다.

 

 

 

 

상품목록 api에는 판매중인지, 판매중지인지 선택을 해서 가져올 수 있다.

 

따라서 전체 상품을 가져오려면 판매중, 판매중지 둘 다 호출해서 가져와야 한다.

 

나는 for문을 사용했다.

 

for rq in range(0,2):
    if rq == 0:
        sale = "SALE"
    elif rq == 1:
        sale = "SUSPENSION"

 

 

첫 시작일때 sale은 'SALE' --> 판매중일때 필요값

두번째 일땐 'SUSPENSION' --> 판매중지일때 필요값

 

 

 

pages = 1
while True:
    payload = f"{{\"searchKeywordType\":\"SELLER_CODE\",\"productStatusTypes\":\"{sale}\",\"page\":{pages},\"size\":500,\"orderType\":\"NO\",\"periodType\":\"PROD_MOD_DAY\",\"fromDate\":\"2000-12-22\",\"toDate\":\"{today}\"}}"
    headers = {
        'Authorization': "Bearer " + self.token,
        'content-type': "application/json"
        }
    conn.request("POST", "/external/v1/products/search", payload, headers)
    res = conn.getresponse()
    data = str(res.read().decode('utf-8'))
    if '"totalElements":0' in data:
        break

    products = data.count('channelProducts":')

    for i in range(1, products + 1):

 

 

pages는 우리가 검색할 페이지를 1로 지정하는거다.

1부터 쭉 올라가야겠지 ?

 

1부터 쭉 올라가다가, 총 상품수가 넘는 페이지가 되면 네이버에서는 "totalElements":0 가 포함된 값을 반환한다.

 

따라서 data에 이 값이 있으면 break해서 while문을 빠져 나와야한다.

 

 

아무튼 그건 그렇고, data값에 channelProducts":의 숫자를 파악하고

 

for문을 돌려보자.

 

 

 

channelProducts":의 갯수가 곧 받아온 데이터에서의 상품 수니까 !

 

 

 

    try:
        baba = data.split('channelProducts":')[i]
        origincode = data.split('"channelProducts":[{"originProductNo":')[i].split(',')[0].strip()
        name = baba.split('"name":"')[1].split('",')[0]
        category1 = baba.split('"wholeCategoryName":"')[1].split('",')[0]
        category2 = baba.split('"wholeCategoryId":"')[1].split('",')[0]
        chNo = baba.split('"channelProductNo":')[1].split(',')[0]
        type = baba.split('"statusType":"')[1].split('",')[0]
        saleprice = baba.split('"salePrice":')[1].split(',')[0]
        disprice = baba.split('"discountedPrice":')[1].split(',')[0]
        stock = baba.split('"stockQuantity":')[1].split(',')[0]
        d_type = baba.split('deliveryAttributeType":"')[1].split('","')[0]
        d_fee = baba.split('"deliveryFee":')[1].split(',')[0]
    except:
        return 1
    alls = (origincode, name, category1, category2, chNo, type, saleprice, disprice, stock, d_type, d_fee)
    itemlist.append(alls)
    pages += 1

return itemlist

 

 

data값을 보면서 필요한 값들은 위 코드처럼 split해서 가져오자 !

 

 

그 값을 alls 변수에 넣고, itemlist 변수에 추가해준다.

 

 

 

 

 

s = SmartStore()
itemlists = s.productlist()



for item in itemlists:
    print(item)

 

 

 

이 코드를 가장 아래 해놓고 실행해보자.

 

 

상품목록을 전부 받아온 뒤에, 차례로 print 하게된다.

 

 

 

 

 

 

4편에서 만나자 !

 

 

 

 

 

 

 

 

 

코딩쟁이들 놀이터 : 네이버 카페

세상 모든 코딩쟁이들의 카페입니다

cafe.naver.com

 

 

 

 

주식회사 유메

#프로그램제작 #프로그램

open.kakao.com

 

 

 

[종합 매크로] 공지사항

---업데이트 예정

myworld1004.tistory.com

 

반응형