1편
2편
매일 매일 블로그에 글을 써야지 생각은 하는데, 막상 글 쓰는게 너무 어렵다.....
하루종일 쇼핑몰 .... 코딩 ..... .....
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편에서 만나자 !
'프로그램 개발일지' 카테고리의 다른 글
[Python] tkinter 테마 적용하기 - ttkbootstrap (0) | 2024.07.27 |
---|---|
[Python] 스마트 스토어 API 활용 네이버 커머스 API 4편 (2) | 2024.07.24 |
[Python] 스마트 스토어 API 활용 네이버 커머스 API 2편 (0) | 2024.06.27 |
[ADB] adb 한글 전송이 안 될때 / 한글 입력이 안 될때 (0) | 2024.06.18 |
[Python] 파이썬 블루스택 제어하기 - 1 (2) | 2024.06.15 |