-
-
Notifications
You must be signed in to change notification settings - Fork 1
/
productschemaadd.py
121 lines (105 loc) Β· 3.77 KB
/
productschemaadd.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
import os
import sys
import requests
import hashlib
import time
import json
from dotenv import load_dotenv
# Load environment variables from .env file
load_dotenv()
# Retrieve variables from environment
app_key = os.getenv('APP_KEY')
app_secret = os.getenv('APP_SECRET')
session_key = os.getenv('SESSION_KEY')
# Define the log directory
LOG_DIR = 'api_logs/' # Directory to store log files
os.makedirs(LOG_DIR, exist_ok=True) # Create directory if it doesn't exist
# API endpoint and parameters
url = 'https://eco.taobao.com/router/rest'
# Check if necessary command-line arguments are provided
if len(sys.argv) < 2:
print("Usage: python script.py <cat_id>")
sys.exit(1)
cat_id = sys.argv[1] # Get cat_id from command-line argument
# Construct XML data for the product schema
xml_data = """
<itemSchema>
<field id="productTitle" name="Product name" type="input">
<value>wang chen test api submit sourcing updateFields 333</value>
</field>
<field id="paymentMethod" name="Payment Options\n" type="complex">
<complex-value>
<field id="predefined_method" type="multiCheck">
<values>
<value>L/C</value>
<value>D/A</value>
</values>
</field>
<field id="self_defined_0" type="input">
<value>dddd</value>
</field>
</complex-value>
</field>
</itemSchema>
"""
# Parameters for the API call
params = {
"app_key": app_key,
"format": "json",
"method": "alibaba.icbu.product.schema.add",
"partner_id": "apidoc",
"session": session_key,
"sign_method": "md5",
"timestamp": time.strftime("%Y-%m-%d %H:%M:%S"),
"v": "2.0",
"cat_id": cat_id, # Replace with the actual cat_id
"language": "en_US", # Replace with the desired language
"param_product_top_publish_request": json.dumps({
"xml": xml_data
}),
}
# Calculate sign
def calculate_sign(params, secret):
sorted_params = sorted(params.items())
sign_string = secret + ''.join([f'{k}{v}' for k, v in sorted_params]) + secret
return hashlib.md5(sign_string.encode('utf-8')).hexdigest().upper()
# Add sign to parameters
params["sign"] = calculate_sign(params, app_secret)
# Remove sensitive information for logging
def remove_sensitive_info(params):
safe_params = params.copy()
safe_params.pop("app_key", None)
safe_params.pop("session", None)
safe_params.pop("sign", None)
return safe_params
# Log file names
log_file = f"{LOG_DIR}product_schema_add_logs_{time.strftime('%Y-%m-%d_%H-%M-%S')}.json"
error_log_file = f"{LOG_DIR}product_schema_add_error_{time.strftime('%Y-%m-%d_%H-%M-%S')}.json"
try:
# Make the API request
add_product_schema_request = requests.get(url, params=params)
add_product_schema_response = add_product_schema_request.json()
# Log API request
with open(log_file, "w") as f:
json.dump({
"request_params": remove_sensitive_info(params),
"response": add_product_schema_response,
}, f, indent=4)
# Example of handling the response data
if add_product_schema_response.get("error_response"):
with open(error_log_file, "w") as f:
json.dump({
"request_params": remove_sensitive_info(params),
"response": add_product_schema_response,
}, f, indent=4)
print(f"Error: {add_product_schema_response['error_response']['msg']}")
else:
print("API call successful.")
# Process your response data as needed
except requests.exceptions.RequestException as e:
with open(error_log_file, "w") as f:
json.dump({
"request_params": remove_sensitive_info(params),
"error_message": str(e),
}, f, indent=4)
print(f"Request failed: {e}")