Replies: 13 comments 13 replies
|
안녕하세요. 커머스API 안아영입니다. 1. 'Enum값을 입력하지 않았거나 허용되지 않은 Enum 값입니다' 오류해당 오류는 전시 상태 코드( 2. 상품 상세 정보에 html을 작성하는 방법상품 등록/수정 시 상품 상세 정보( 사용이 불가능한 태그/속성 예시
자세한 내용은 스마트스토어 고객센터를 참고 부탁드립니다. 3. 상품 대표 이미지와 추가 이미지를 설정하는 방법상품 등록/수정 시, 상품 대표/추가 이미지는 '상품 이미지 다건 등록API' 호출 시 반환하는 이미지 URL(
'상품 이미지 다건 등록API'는 multipart/form-data 형식으로 요청을 보내야 하기에 직접 수동으로 HTTP 요청 메시지를 구성하시기 보다는 사용하시는 프로그래밍 언어의 기본 라이브러리 또는 추가 외부 라이브러리에서 지원하는 인터페이스 랩핑된 메소드를 사용하시는 것을 권장드립니다. 추가로, 프로그래밍 언어나 특정 기술의 사용방법의 경우, 작성법과 개발 의도 등에 따라 다르게 적용할 수 있기에 별도의 기술지원이 불가능하다는 점 양해부탁드립니다. 감사합니다. |
|
{"code":"GW.IP_NOT_ALLOWED","message":"호출이 허용되지 않은 IP입니다.","timestamp":"2025-01-08T00:26:25.699+09:00","traceId":"pr1-185309-6ftds7^1733910842415^251162324"}
어떻게 처리하면 좋을지 문의드립니다. 호출을 허용하는 IP를 별도 생성해야하나요?
…-----Original Message-----
From: ***@***.***>
To: ***@***.***>;
Cc: ***@***.***>; ***@***.***>;
Sent: 2025-01-06 (월) 13:40:48 (GMT+09:00)
Subject: Re: [commerce-api-naver/commerce-api] 상품등록 문의 (에러발생) (Discussion #2216)
안녕하세요. 커머스API 안아영입니다.
1. 'Enum값을 입력하지 않았거나 허용되지 않은 Enum 값입니다' 오류
해당 오류는 전시 상태 코드(smartstoreChannelProduct.channelProductDisplayStatusType) 필드 값으로 유효하지 않은 값을 입력하였기에 발생하였습니다. 상품 등록/수정 시, 전시 상태 코드 필드 값은 '전시 중(ON)'과 '전시 중지(SUSPENSION)'만 입력하실 수 있습니다. 따라서 전시 상태 코드 필드 값을 유효한 값으로 변경 후 API 재호출 부탁드립니다.
2. 상품 상세 정보에 html을 작성하는 방법
상품 등록/수정 시 상품 상세 정보(originProduct.detailContent) 필드에 HTML 코드를 문자열로 그대로 입력하시면 해당 내용이 상품 상세 정보로 설정됩니다.
다만, 상품 상세 정보 필드 값으로 보안상에 문제가 될 수 있거나 상품 상세 페이지의 UI를 변동시킬 수 있는 태그와 속성은 필터링 되어 상품 상세 정보에 적용되지 않는 점 참고 부탁드립니다.
사용이 불가능한 태그/속성 예시
HTML, META, SCRIPT, STYLE, BODY, HEAD
스마트스토어 상세 페이지 전역에 영향을 미칠만한 HTML 태그 및 Attribute
자세한 내용은 스마트스토어 고객센터를 참고 부탁드립니다.
https://help.sell.smartstore.naver.com/faq/content.help?faqId=4414 (스마트스토어 고객센터)
3. 상품 대표 이미지와 추가 이미지를 설정하는 방법
상품 등록/수정 시, 상품 대표/추가 이미지는 '상품 이미지 다건 등록API' 호출 시 반환하는 이미지 URL(images[n].url) 필드 값을 상품 이미지(originProduct.images) 필드의 하위 필드인 이미지 URL(url)에 입력하시면 설정하실 수 있습니다.
상품 대표 이미지
originProduct.images.representativeImage.url: "상품 이미지 다건 등록API에서 반환받은 url"
상품 추가 이미지
originProduct.images.optionalImages[n].url: "상품 이미지 다건 등록API에서 반환받은 url"
'상품 이미지 다건 등록API'는 multipart/form-data 형식으로 요청을 보내야 하기에 직접 수동으로 HTTP 요청 메시지를 구성하시기 보다는 사용하시는 프로그래밍 언어의 기본 라이브러리 또는 추가 외부 라이브러리에서 지원하는 인터페이스 랩핑된 메소드를 사용하시는 것을 권장드립니다.
상품 이미지 등록에 관한 자세한 내용은 하단의 자주 묻는 질문을 참고 부탁드립니다.
#117
추가로, 프로그래밍 언어나 특정 기술의 사용방법의 경우, 작성법과 개발 의도 등에 따라 다르게 적용할 수 있기에 별도의 기술지원이 불가능하다는 점 양해부탁드립니다.
감사합니다.
—
Reply to this email directly, view it on GitHub, or unsubscribe.
You are receiving this because you authored the thread.Message ID: ***@***.***>
|
|
안녕하세요 커머스 API 담당자님,
회신감사드립니다.
API호출 IP는 공식IP확인하는 방법을 알게되어 해결은 한 것 같습니다.
다만, 이미지 등록문제에서 계속 에러가 발생합니다.
지난 번 메일 주신것을 근거로 아래와 같이 수정을 했는데요.
결론적으로 아래와 같은 에러 계속 발생합니다...
"이미지 업로드 실패 또는 응답에 이미지 URL이 없음"
이미지 업로드가 계속 실패하는데, 아무리 수정해도 어찌할바를 모르겠습니다. 네이버 API 규정내용을 꼼꼼히 읽어도 도저히 모르겠습니다.
쉽게 답변해주신다면 감사드리겠습니다 ㅠㅠ
로컬에 image1, image2, ... 형식으로 저장해서 어디에 있는지 위치를 확인하여, 그대로 URL 변수로 담았습니다.
그리고는 그것을 원드라이브에 옮겨서 경로복사를 하여,
다건 등록 api에서 반환된 url로 설정하여,
representative_image_url 및 optional_images_urls를 만들어서 처리했습니다.
근데 왜 도대체 이미지 업로드가 되지 않는것일까요?
import http.client
import pandas as pd
import json
from bs4 import BeautifulSoup
import requests
# 헤더 설정 (Bearer Token은 실제 토큰으로 교체)
headers = {
'Authorization': "XXXXXXXXXXXXXXXXXXXX", # 실제 Bearer Token으로 교체
'Content-Type': "application/json"
}
# HTML 파일 경로
html_file_path = r"D:\python_lth\selenium\XXXX_HTML생성.html"
# HTML 파일 읽기
with open(html_file_path, "r", encoding="utf-8") as f:
html_content = f.read()
# BeautifulSoup으로 HTML 파싱
soup = BeautifulSoup(html_content, "html.parser")
# 전체 HTML을 그대로 text로 추출하여 detailContent에 삽입
detail_content = str(soup) # HTML 코드 그대로 문자열로 저장
# 추출된 내용 확인
# print(detail_content)
# 엑셀 파일 경로
excel_file = r"D:\xxxxxxx\selenium\31_실전\12_스스 상품등록\XXXXXX.xlsm"
# "스스_업로드용_기본정보" 시트에서 상품 정보 읽기
df_product_info = pd.read_excel(excel_file, sheet_name="스스_업로드용_기본정보", header=0)
df_product_info = df_product_info.reset_index(drop=True) # 인덱스 재설정
# 데이터가 올바르게 로드되었는지 점검
print("첫 몇 줄 데이터 확인:")
print(df_product_info.head()) # DataFrame의 처음 몇 줄 출력
# 상품 정보 읽기 (인덱스를 정확히 맞춘 후)
name = df_product_info.iloc[0]['상품명'] # A2 -> 상품명
sale_price = int(df_product_info.iloc[0]['판매가 설정']) # B2 -> 판매가 설정, int로 변환
sale_type = "NEW" # 새 상품
status_type = "SALE" # 판매 중
leaf_category_id = int(df_product_info.iloc[0]['카테고리ID']) # I2 -> 카테고리ID, int로 변환
# image_url = df_product_info.iloc[0]['이미지URL'] # E2 -> 이미지 URL (대표 이미지)
delivery_fee = int(df_product_info.iloc[0]['배송비']) # F2 -> 배송비, int로 변환
delivery_type = "DELIVERY" # 배송유형 (유효한 값으로 수정)
origin = df_product_info.iloc[0]['원산지'] # H2 -> 원산지
# "스스_업로드용_옵션정보" 시트에서 옵션 정보 읽기
df_options = pd.read_excel(excel_file, sheet_name="스스_업로드용_옵션정보", header=0)
# 옵션 정보 (옵션1, 사이즈, 옵션가, 재고수량)
options = []
for index, row in df_options.iterrows():
options.append({
"name": row["옵션"], # '옵션'이라는 엑셀 컬럼 이름을 그대로 사용
"size": row["사이즈"], # '사이즈'라는 엑셀 컬럼 이름을 그대로 사용
"price": int(row["옵션가"]), # '옵션가'라는 엑셀 컬럼 이름을 그대로 사용, int로 변환
"stockQuantity": int(row["재고수량"]), # '재고수량'이라는 엑셀 컬럼 이름을 그대로 사용, int로 변환
})
url = "https://api.commerce.naver.com/external/v1/product-images/upload"
# 이미지 파일 디렉토리 설정
image_directory = r"C:\Users\▣11_image다중등록"
import os
# 이미지 파일 리스트 생성
image_file_paths = [
os.path.join(image_directory, f"image{index + 1}.png") # 예: image1.png, image2.png
for index in range(3) # 업로드할 파일 개수 (3개 예시)
]
# 파일 객체 생성
files = [
('imageFiles', (os.path.basename(file_path), open(file_path, 'rb'), 'image/png'))
for file_path in image_file_paths
]
# API 요청 보내기 (multipart/form-data 형식)
response = requests.post(url, headers=headers, files=files)
# 예시로 이미지 URL 추출 (API 응답에서 이미지 URL을 추출)
# 예시로 이미지 URL 추출 (API 응답에서 이미지 URL을 추출)
uploaded_images = response.json().get('result', {}).get('imageUrls', [])
if not uploaded_images:
print("이미지 업로드 실패 또는 응답에 이미지 URL이 없음")
exit()
representative_image_url = uploaded_images[0] # 첫 번째 이미지를 대표 이미지로 설정
optional_image_urls = uploaded_images[1:] # 나머지 이미지를 추가 이미지로 설정
# 대표 이미지와 추가 이미지는 다건 등록 API에서 반환된 URL로 설정
representative_image_url = "https://1drv.ms/i/s!AoA6JnZcNmWsgtQpQY8jcTsyRKeOJw?e=FDkUSa" # 상품 이미지 다건 등록 API에서 반환된 URL
optional_images_urls =["https://1drv.ms/i/s!AoA6JnZcNmWsgtQpQY8jcTsyRKeOJw?e=XNVks7",
"https://1drv.ms/i/s!AoA6JnZcNmWsgtQvzMOO0hZLCxhQig?e=ontVji"] # 상품 이미지 다건 등록 API에서 반환된 URL들
print(response.status_code)
print(response.text) # 응답 본문 출력
# 상품 등록을 위한 payload 준비
product_data = {
"originProduct": {
"statusType": status_type,
"saleType": sale_type,
"leafCategoryId": leaf_category_id,
"name": name,
"detailContent": detail_content, # 추출한 HTML 내용을 여기에 삽입
"images": {
"representativeImage": {"url": representative_image_url},
"optionalImages": [{"url": url} for url in optional_images_urls] # 추가 이미지 URL들
},
"saleStartDate": "2025-01-04T00:00:00.000Z", # 판매 시작일
"saleEndDate": "2025-01-04T23:59:59.000Z", # 판매 종료일
"salePrice": sale_price,
"stockQuantity": sum([opt["stockQuantity"] for opt in options]), # 모든 옵션의 재고수량 합산
"deliveryInfo": {
"deliveryType": delivery_type,
"deliveryAttributeType": "NORMAL",
"deliveryCompany": "CJ대한통운",
"outboundLocationId": "string",
"deliveryFee": {
"deliveryFeeType": "FREE",
"baseFee": delivery_fee # 배송비
},
"claimDeliveryInfo": { # claimDeliveryInfo 필드 추가
"returnDeliveryCompanyPriorityType": "PRIMARY",
"returnDeliveryFee": 1000000,
"exchangeDeliveryFee": 1000000,
"shippingAddressId": 0,
"returnAddressId": 0,
"freeReturnInsuranceYn": True
}
},
"productLogistics": [{
"logisticsCompanyId": "string",
"logisticsCenterId": "string"
}],
"detailAttribute": {
"naverShoppingSearchInfo": {
"modelId": 0,
"modelName": "string",
"manufacturerName": "string",
"brandName": "string"
},
"minorPurchasable": True, # minorPurchasable 필드 추가
"originAreaInfo": { # originAreaInfo 필드 추가
"originAreaCode": "string",
"importer": "string",
"content": "string",
"plural": True
},
"afterServiceInfo": { # afterServiceInfo 필드 추가
"afterServiceTelephoneNumber": "string",
"afterServiceGuideContent": "string"
}
},
"optionInfo": {
"simpleOptionSortType": "CREATE",
"optionSimple": options # 읽은 옵션 정보 추가
}
},
"smartstoreChannelProduct": { # smartstoreChannelProduct 필드 추가
"channelProductName": name, # 상품명 사용
"bbsSeq": 0, # 게시글 번호 (필요에 따라 수정)
"storeKeepExclusiveProduct": True,
"naverShoppingRegistration": True,
"channelProductDisplayStatusType": "SUSPENSION" # 또는 "ON"
}
}
# JSON payload로 변환
payload = json.dumps(product_data)
# HTTP Connection 설정
conn = http.client.HTTPSConnection("api.commerce.naver.com")
# API 요청 보내기
conn.request("POST", "/external/v2/products", payload, headers)
# 응답 받기
res = conn.getresponse()
data = res.read()
# 응답 출력
print(data.decode("utf-8"))
…-----Original Message-----
From: ***@***.***>
To: ***@***.***>;
Cc: ***@***.***>; ***@***.***>;
Sent: 2025-01-08 (수) 12:10:52 (GMT+09:00)
Subject: Re: [commerce-api-naver/commerce-api] 상품등록 문의 (에러발생) (Discussion #2216)
안녕하세요. 커머스API 안아영입니다.
현재 해당 애플리케이션에 설정된 API호출 IP는 ...121 와 ...1 으로 끝나는 IP입니다. 그러나 호출 당시 사용된 IP은 ...61 입니다.
API호출 IP는 실제 API를 호출하는 기기의 IP를 설정해야 정상 호출이 가능합니다. 따라서 호출하는 기기 IP와 설정된 API호출 IP가 일치하는지 확인 부탁드립니다.
API호출 IP는 하단의 방법으로 수정이 가능하오니 API호출 IP를 확인/수정 후 API 재호출 시도 부탁드립니다.
[커머스API센터 > 내 정보 > 내 스토어 애플리케이션 > 사용중인 애플리케이션 클릭 > 애플리케이션 > 수정 버튼 > API호출 IP > IP 수정/추가 > 저장 버튼]
https://apicenter.commerce.naver.com/ko/member/application/manage/list (커머스API센터)
이후 문제가 발생하시는 경우 추가 문의를 남겨주시길 부탁드립니다.
감사합니다.
—
Reply to this email directly, view it on GitHub, or unsubscribe.
You are receiving this because you authored the thread.Message ID: ***@***.***>
|
|
답변감사드리며 ,추가문의드립니다.
import requests
import os
# 헤더 설정
headers = {
'Authorization': "Bearer xxxxxx", # 교체
}
# 이미지 파일 디렉토리
image_directory = r"C:\Users\OneDrive\문서\▣11_image다중등록"
# 이미지 파일 경로 리스트 생성
image_file_paths = [
os.path.join(image_directory, f"image{index + 1}.png") # 예: image1.png, image2.png
for index in range(3) # 업로드할 파일 개수
]
# 파일 객체 생성
files = [
('imageFiles', (os.path.basename(file_path), open(file_path, 'rb'), 'image/png'))
for file_path in image_file_paths
]
# API 요청
url = "https://api.commerce.naver.com/external/v1/product-images/upload"
response = requests.post(url, headers=headers, files=files)
# 응답 확인
if response.status_code == 200:
try:
# 이미지 URL 추출
uploaded_images = [image['url'] for image in response.json().get('images', [])]
if uploaded_images:
representative_image_url = uploaded_images[0] # 대표 이미지 URL
optional_image_urls = uploaded_images[1:] # 추가 이미지 URL
print(f"대표 이미지 URL: {representative_image_url}")
print(f"추가 이미지 URL: {optional_image_urls}")
else:
print("이미지 업로드 성공, 그러나 응답에 이미지 URL이 없음.")
except KeyError:
print("응답 데이터 구조 오류: 예상하지 못한 응답 형식.")
else:
# 응답 헤더에서 TraceId 추출
trace_id = response.headers.get('GNCP-GW-Trace-ID', 'TraceId 없음')
print(f"API 호출 실패: 상태 코드 {response.status_code}, TraceId: {trace_id}")
print(f"응답 내용: {response.text}")
1)상기와 같은 방식으로 이미지업로드 하면된다는것인가요?
2)TraceID를 어떻게 공유하면되는지 , 상기와 같은 방식으로 하면된다는것인가요?
Message ID: ***@***.***>
|
|
상품명 판매가 설정 할인가 설정 상품상세설명 이미지URL 배송비 배송유형 원산지 카테고리ID 상품의 상태
0 나이키 스포츠웨어 클럽 패딩 모음전 221000 40000 - - 3000 택배 중국 50000837 SALE
API 호출 실패: 상태 코0드 415, TraceId: cr3-155217-8wk8wd^1733899991626^281606511
응답 내용: {"code":"UNSUPPORTED_MEDIA_TYPE","message":"입력정보가 올바르지 않습니다.","timestamp":"2025-01-10T18:09:28.333+09:00"}
Traceback (most recent call last):
File "d:\python_lth\selenium\31_실전\12_스스 상품등록\(성공)2_상품등록(진행중).py", line 120, in <module>
representative_image_url = uploaded_images[0] # 첫 번째 이미지를 대표 이미지로 설정
^^^^^^^^^^^^^^^
NameError: name 'uploaded_images' is not defined
이러한 에러가 발생했습니다.
아래 Trace id 참고해주십시오. 조언부탁드립니다. ㅠ
TraceId : cr3-155217-8wk8wd^1733899991626^281606511
…-----Original Message-----
From: ***@***.***>
To: ***@***.***>;
Cc: ***@***.***>; ***@***.***>;
Sent: 2025-01-10 (금) 12:20:39 (GMT+09:00)
Subject: Re: [commerce-api-naver/commerce-api] 상품등록 문의 (에러발생) (Discussion #2216)
안녕하세요. 커머스API 안아영입니다.
이전 답변에서 말씀드린 내용처럼 커머스API 기술지원은 사용자의 코드 레벨 가이드 혹은 특정 프로그래밍 언어 이용과 관련된 기술지원은 진행하지 않기에 실제 프로그래밍 코드 실행에 관한 내용은 확인할 수 없는 점 참고 부탁드립니다.
'상품 이미지 다건 등록API'가 정상적으로 호출되었다면 응답 데이터로 업로드된 이미지 정보 목록(images)를 반환하기에 정상적으로 이미지 URL를 조회하실 수 있을 것으로 확인됩니다.
TraceId의 경우, 모든 API 호출 건의 HTTP 응답 헤더 내에 GNCP-GW-Trace-ID 항목으로 제공되기에 오류가 발생하신 호출 건의 GNCP-GW-Trace-ID 항목 값을 공유해주시면 됩니다.
감사합니다.
—
Reply to this email directly, view it on GitHub, or unsubscribe.
You are receiving this because you authored the thread.Message ID: ***@***.***>
|
|
안녕하세요, 내용은 해결했습니다만, 에러로 질문드립니다. TraceId: cr3-155217-8ftz7b^1733899989733^289412222 |
|
조합형으로 올리고 싶은데, 안올려져서 문의드립니다. traceId : cr3-155217-8ftz7b^1733899989733^290945539 |
|
안녕하세요.
일전에 고정IP 하나를 추가하였습니다.
그래서 그 IP만 남기고, 상품등록 진행시
미등록되었었습니다.
제가 궁금한 것은 그 고정 IP가
.43으로 끝나는 IP인데, 그게 호출 정상반영 되었는지 문의드립니다. 그게 중요합니다. 감사합니다.
네이버 메일 앱에서 보냈습니다.
…-----Original Message-----
보낸사람: "커머스API관리자" ***@***.***>
받는사람: "commerce-api-naver/commerce-api" ***@***.***>
참조: "label38up" ***@***.***>,"Mention" ***@***.***>
날짜:2025.01.13 오전 10:39:35 (GMT+09:00)
제목: Re: [commerce-api-naver/commerce-api] 상품등록 문의 (에러발생) (Discussion #2216)
@label38up
안녕하세요 커머스API 권현철입니다.
말씀하신 내용에 대해 답변 드리겠습니다.
답변 1
TraceId: cr3-155217-8ftz7b^1733899989733^289412222
고정IP에 대해 인식하지 못하고 있는 것 같습니다.
2025년 01월 11일 21시 26분 '상품 이미지 다건 등록API' 호출 당시 사용된 인증 토큰이 만료되어 해당 오류가 발생하였습니다.
인증 토큰은 발급 이후 3시간이 만료시간이며 만료된 이후 사용이 불가능합니다.
'인증 토큰 발급 요청API' 재호출을 통해 신규 인증 토큰 발급 후 API 재호출 시도를 한다면 정상 호출이 가능합니다.
답변 2
{"code":"GW.IP_NOT_ALLOWED","message":"호출이 허용되지 않은 IP입니다.
'상품 이미지 다건 등록API' 호출 당시 애플리케이션에 설정된 IP가 아닌 다른 IP로 호출하시어 해당 오류가 발생하였습니다.
2025년 01월 11월 21시 31분 IP가 정상 등록되었지만 API호출 시각과 동시간대에 IP가 삭제되어 해당 오류가 발생한 것으로 확인되었습니다.
현재에는 정상 등록된 것으로 확인되며 API 재호출 시 동일한 오류가 발생한다면 말씀 부탁드립니다.
감사합니다.
—
Reply to this email directly, view it on GitHub, or unsubscribe.
You are receiving this because you were mentioned.Message ID: ***@***.***>
|
|
왜 이번에는 호출이 허용되지 않은 IP입니다. 라고 하늘걸까요???
저는 구글 통해서 고정IP를 쓸 수 있도록 세팅했는데 말입니다.
API 호출 실패: 상태 코드 403, TraceId: cr3-155217-8bwjrg^1733899997115^356400527
응답 내용: {"code":"GW.IP_NOT_ALLOWED","message":"호출이 허용되지 않은 IP입니다.","timestamp":"2025-01-19T21:27:53.288+09:00","traceId":"cr3-155217-8bwjrg^1733899997115^356400527"}
…-----Original Message-----
From: ***@***.***>
To: ***@***.***>;
Cc: ***@***.***>; ***@***.***>;
Sent: 2025-01-13 (월) 16:08:50 (GMT+09:00)
Subject: Re: [commerce-api-naver/commerce-api] 상품등록 문의 (에러발생) (Discussion #2216)
@label38up
안녕하세요 커머스API 권현철입니다.
현재 ...43으로 끝나는 IP설정이 반영되어 있습니다.
API호출 IP는 [커머스API센터 > 애플리케이션 > 내 스토어 애플리케이션 > 활성 상태 애플리케이션 > 애플리케이션 > 수정 > API호출 IP > IP 입력 > 추가 > 저장]으로 설정 및 확인이 가능하며 저장 버튼 클릭 시 반영된다는 점 참고 부탁드립니다.
감사합니다.
—
Reply to this email directly, view it on GitHub, or unsubscribe.
You are receiving this because you were mentioned.Message ID: ***@***.***>
|
|
안녕하세요
.43으로 호출이 가아하는데
왜 .79로 인식하고 있다는건지 전혀 이해가 되지않고있습니다.
클라우드로 실제 Ip를 연결해서 그렇게 쓰고있는건데요.
왜 .79로 인식하고 있다는건지?
어떻게 인지하시는건지 회신해주시면 감사드리겠습니다.
네이버 메일 앱에서 보냈습니다.
…-----Original Message-----
보낸사람: "커머스API관리자" ***@***.***>
받는사람: "commerce-api-naver/commerce-api" ***@***.***>
참조: "label38up" ***@***.***>,"Mention" ***@***.***>
날짜:2025.01.20 오전 10:04:31 (GMT+09:00)
제목: Re: [commerce-api-naver/commerce-api] 상품등록 문의 (에러발생) (Discussion #2216)
@label38up
안녕하세요 커머스API 권현철입니다.
'상품 이미지 다건 등록API' 호출 당시 IP는 ...79로 끝나는 IP로 애플리케이션에 등록된 IP와 달라 해당 오류가 발생하였습니다.
API호출 간 애플리케이션에 등록된IP에 해당하는 기기로 호출하였는지 확인 부탁드리며, API호출 IP는 실제 커머스API를 호출하는 기기의 IP를 등록하는 것을 권장 드립니다.
감사합니다.
—
Reply to this email directly, view it on GitHub, or unsubscribe.
You are receiving this because you were mentioned.Message ID: ***@***.***>
|
|
안녕하세요. 수없이 확인했음에도 불구하고,
저는 고정ip를 사용하여 호출하고 있는것이 맞습니다.
방화벽도 풀었고, 완전히 저는 네이버 api에만 추가해서 사용하려합니다.
.43으로 끝나는 외부 ip 고정형만 쓰려고 하는게 맞습니다!
하기는 trace-id입니다.
cr3-155217-8rvzmg^1733899989404^363015932
대체 무엇이 잘못된 걸까요 ???
…-----Original Message-----
From: ***@***.***>
To: ***@***.***>;
Cc: ***@***.***>; ***@***.***>;
Sent: 2025-01-20 (월) 19:00:14 (GMT+09:00)
Subject: Re: [commerce-api-naver/commerce-api] 상품등록 문의 (에러발생) (Discussion #2216)
@label38up
안녕하세요 커머스API 권현철입니다.
클라우드 서비스를 이용하시는 경우 커머스API 호출 시 실제 기기의 IP로 호출되고 있는지와
간혹, 클라우드 서비스 이용간 동적IP로 설정되어 호출 시 IP가 변경되는 경우도 있으니 클라우드 서비스 이용 간 고정IP를 사용하여 호출하고 있는지 확인 가능하실까요?
감사합니다.
—
Reply to this email directly, view it on GitHub, or unsubscribe.
You are receiving this because you were mentioned.Message ID: ***@***.***>
|
|
안녕하세요,
다시 ip를 수정했는데도 불구하고, 아래와 같은 에러 메시지가 뜹니다.
제 컴퓨터에 연동된 외부 고정 ip를 네이버 api에 적었음에도 불구하고, 계속 인지를 못하는 것 같아서 아쉽습니다.
차라리 제 외부 ip를 알려드리고 그거를 연결해주시는 것은 어려우신가요?
81로 끝나는 ip로 연결되어야하는데 말입니다.
네이버에서 호출되는 것은 혹시 79로 끝나는 ip인가요?
만일 그렇다면, 그것은 유동ip이기 때문에 그것으로는 자제하고자합니다.
아래의 traceid 참고 부탁드리겠습니다.
TraceId: pr1-183251-7gmr5c^1737538429700^1659736
API 호출 실패: 상태 코드 403, TraceId: pr1-183251-7gmr5c^1737538429700^1659736
응답 내용: {"code":"GW.IP_NOT_ALLOWED","message":"호출이 허용되지 않은 IP입니다.","timestamp":"2025-01-22T23:40:03.399+09:00","traceId":"pr1-183251-7gmr5c^1737538429700^1659736"}
…-----Original Message-----
From: ***@***.***>
To: ***@***.***>;
Cc: ***@***.***>; ***@***.***>;
Sent: 2025-01-21 (화) 10:43:35 (GMT+09:00)
Subject: Re: [commerce-api-naver/commerce-api] 상품등록 문의 (에러발생) (Discussion #2216)
@label38up
안녕하세요 커머스API 권현철입니다.
호출 IP는 실제 커머스API를 호출한 IP로 해당 IP는 사용자의 기기 또는 네트워크 서비스를 통해 전달되기에 저희 측에서 정확한 확인이 어렵습니다.
API를 호출하는 기기의 IP가 고정IP로 설정되어 있어도 클라우드 네트워크 사용 간 클라우드 서비스 자체적으로 동적IP로 사용될 수 있어 커머스API 호출 시 해당 동적 IP로 호출 될 수 있습니다. 실제 커머스API 호출 간 전달되는 IP가 고정IP인지, API 호출에 사용되는 기기의 IP가 애플리케이션에 등록된 IP와 동일한지 확인 부탁드립니다.
혹, IP 추가가 필요하신 경우 [커머스API센터 > 애플리케이션 > 내 스토어 애플리케이션 > 활성 상태 애플리케이션 > 애플리케이션 > 수정 > API호출 IP > IP 입력 > 추가 > 저장]으로 설정이 가능하오니 참고 부탁드립니다.
감사합니다.
—
Reply to this email directly, view it on GitHub, or unsubscribe.
You are receiving this because you were mentioned.Message ID: ***@***.***>
|
|
cr3-153339-76gg6z^1737527666667^12264595
이번에는 무엇이 잘못되었을까요?
이미지를 읽지 못하고 있는 것 같아요
-----Original Message-----
From: ***@***.***>
To: ***@***.***>;
Cc: ***@***.***>; ***@***.***>;
Sent: 2025-01-23 (목) 11:58:34 (GMT+09:00)
Subject: Re: [commerce-api-naver/commerce-api] 상품등록 문의 (에러발생) (Discussion #2216)
@label38up
안녕하세요 커머스API 권현철입니다.
위 공간은 커머스API 기술지원 공간이기에 판매자 분의 본인 확인이 어려우며 애플리케이션 설정과 같은 부분은 저희 측에서 자체 설정이 불가능합니다. 공유해주신 traceId의 호출 건을 확인한 결과 ...79로 설정된 기기로 '상품 이미지 다건 등록API'를 호출하여 해당 오류가 발생한 것으로 확인되었습니다. API호출 IP는 실제 API를 호출하는기기 또는 네트워크의 IP를 입력하시는 것을 권장드립니다.
번거로우시겠지만 실제 API를 호출하는 IP 또는 이용하시는 클라우드 네트워크 IP, 커머스API 호출 당시 IP가 실제 애플리케이션에 등록된 API호출 IP와 동일한지 확인 가능하실까요?
감사합니다.
—
Reply to this email directly, view it on GitHub, or unsubscribe.
You are receiving this because you were mentioned.Message ID: ***@***.***>
|
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
파이썬 이제 배우기 시작해서 이제 막 네이버 api 연동했습니다.
상품 하나를 등록하기 위해 코딩을 했는데 아래와 같은 에러들이 발생합니다.
0 나이키 스포츠웨어 클럽 패딩 모음전 221000 40000 - - 3000 택배 중국 50000837 SALE
{"code":"BAD_REQUEST","message":"입력한 데이터가 유효하지 않습니다.","invalidInputs":[{"name":"smartstoreChannelProduct.channelProductDisplayStatusType","type":"NotValidEnum","message":"Enum값을 입력하지 않았거나 허용되지 않은 Enum 값입니다."}],"timestamp":"2025-01-05T17:13:10.008+09:00"}
(selenium)xxxxxx.py
첫 몇 줄 데이터 확인:
상품명 판매가 설정 할인가 설정 상품상세설명 이미지URL 배송비 배송유형 원산지 카테고리ID 상품의 상태
0 나이키 스포츠웨어 클럽 패딩 모음전 221000 40000 - - 3000 택배 중국 50000837 SALE
{"code":"BAD_REQUEST","message":"입력한 데이터가 유효하지 않습니다.","invalidInputs":[{"name":"smartstoreChannelProduct.channelProductDisplayStatusType","type":"NotValidEnum","message":"Enum값을 입력하지 않았거나 허용되지 않은 Enum 값입니다."}],"timestamp":"2025-01-05T17:14:08.850+09:00"}
이러한 에러메시지가 나옵니다. 왜 나오는걸까요??
엑셀표로 정리한것을 베이스로 해서 아래와 같은 코드를 짰습니다. 어디가 틀린건지 도무지 알수가 없어 문의드립니다 ㅠ
파일명 및 경로 및 토큰은 x처리하여 문의올립니다.
그리고 이미지와 상세페이지는 차치하였습니다.
이유는 아직 이미지를 어떻게 올리는지 모르고, 상세페이즈는 어떻게 html로 올려야할지 몰라서 그거 빼고 진행하고자 위함입니다.
조언주시면 감사드리겠습니다 ㅠ
그리고 추가 질문으로 대표이미지와 추가 이미지는 어떻게 올려야할까요?? 서버에 올려서 진행을 해야하는 것으로 알고 있습니다.
import http.client
import pandas as pd
import json
엑셀 파일 경로
excel_file = r"D:\pxxxxxxxxxxxxxx\xxxxxxxxxxxxxxxxxxxxxxx.xlsm"
"스스_업로드용_기본정보" 시트에서 상품 정보 읽기
df_product_info = pd.read_excel(excel_file, sheet_name="스스_업로드용_기본정보", header=0)
df_product_info = df_product_info.reset_index(drop=True) # 인덱스 재설정
데이터가 올바르게 로드되었는지 점검
print("첫 몇 줄 데이터 확인:")
print(df_product_info.head()) # DataFrame의 처음 몇 줄 출력
상품 정보 읽기 (인덱스를 정확히 맞춘 후)
name = df_product_info.iloc[0]['상품명'] # A2 -> 상품명
sale_price = int(df_product_info.iloc[0]['판매가 설정']) # B2 -> 판매가 설정, int로 변환
sale_type = "NEW" # 새 상품
status_type = "SALE" # 판매 중
leaf_category_id = int(df_product_info.iloc[0]['카테고리ID']) # I2 -> 카테고리ID, int로 변환
image_url = df_product_info.iloc[0]['이미지URL'] # E2 -> 이미지 URL (대표 이미지)
delivery_fee = int(df_product_info.iloc[0]['배송비']) # F2 -> 배송비, int로 변환
delivery_type = "DELIVERY" # 배송유형 (유효한 값으로 수정)
origin = df_product_info.iloc[0]['원산지'] # H2 -> 원산지
"스스_업로드용_옵션정보" 시트에서 옵션 정보 읽기
df_options = pd.read_excel(excel_file, sheet_name="스스_업로드용_옵션정보", header=0)
옵션 정보 (옵션1, 사이즈, 옵션가, 재고수량)
options = []
for index, row in df_options.iterrows():
options.append({
"name": row["옵션"], # '옵션'이라는 엑셀 컬럼 이름을 그대로 사용
"size": row["사이즈"], # '사이즈'라는 엑셀 컬럼 이름을 그대로 사용
"price": int(row["옵션가"]), # '옵션가'라는 엑셀 컬럼 이름을 그대로 사용, int로 변환
"stockQuantity": int(row["재고수량"]), # '재고수량'이라는 엑셀 컬럼 이름을 그대로 사용, int로 변환
})
상품 등록을 위한 payload 준비
product_data = {
"originProduct": {
"statusType": status_type,
"saleType": sale_type,
"leafCategoryId": leaf_category_id,
"name": name,
"detailContent": "상품 상세 내용",
"images": {
"representativeImage": {"url": image_url},
"optionalImages": [{"url": image_url}] # 추가 이미지로 대표 이미지를 대체
},
"saleStartDate": "2025-01-04T00:00:00.000Z", # 판매 시작일
"saleEndDate": "2025-01-04T23:59:59.000Z", # 판매 종료일
"salePrice": sale_price,
"stockQuantity": sum([opt["stockQuantity"] for opt in options]), # 모든 옵션의 재고수량 합산
"deliveryInfo": {
"deliveryType": delivery_type,
"deliveryAttributeType": "NORMAL",
"deliveryCompany": "CJ대한통운",
"outboundLocationId": "string",
"deliveryFee": {
"deliveryFeeType": "FREE",
"baseFee": delivery_fee # 배송비
},
"claimDeliveryInfo": { # claimDeliveryInfo 필드 추가
"returnDeliveryCompanyPriorityType": "PRIMARY",
"returnDeliveryFee": 1000000,
"exchangeDeliveryFee": 1000000,
"shippingAddressId": 0,
"returnAddressId": 0,
"freeReturnInsuranceYn": True
}
},
"productLogistics": [{
"logisticsCompanyId": "string",
"logisticsCenterId": "string"
}],
"detailAttribute": {
"naverShoppingSearchInfo": {
"modelId": 0,
"modelName": "string",
"manufacturerName": "string",
"brandName": "string"
},
"minorPurchasable": True, # minorPurchasable 필드 추가
"originAreaInfo": { # originAreaInfo 필드 추가
"originAreaCode": "string",
"importer": "string",
"content": "string",
"plural": True
},
"afterServiceInfo": { # afterServiceInfo 필드 추가
"afterServiceTelephoneNumber": "string",
"afterServiceGuideContent": "string"
}
},
"optionInfo": {
"simpleOptionSortType": "CREATE",
"optionSimple": options # 읽은 옵션 정보 추가
}
},
"smartstoreChannelProduct": { # smartstoreChannelProduct 필드 추가
"channelProductName": name, # 상품명 사용
"bbsSeq": 0, # 게시글 번호 (필요에 따라 수정)
"storeKeepExclusiveProduct": True,
"naverShoppingRegistration": True,
"channelProductDisplayStatusType": "SELL" # 유효한 Enum 값 "SELL"로 수정
}
}
JSON payload로 변환
payload = json.dumps(product_data)
헤더 설정 (Bearer Token은 실제 토큰으로 교체)
headers = {
'Authorization': "xxxxx_xxxxxxxxxxxxx", # 실제 Bearer Token으로 교체
'Content-Type': "application/json"
}
HTTP Connection 설정
conn = http.client.HTTPSConnection("api.commerce.naver.com")
API 요청 보내기
conn.request("POST", "/external/v2/products", payload, headers)
응답 받기
res = conn.getresponse()
data = res.read()
응답 출력
print(data.decode("utf-8"))
All reactions