我目前有一个亚马逊 MWS API 集成 Python 代码,用于将数据从 MWS 加载到我的数据库。 直到最近,代码运行良好。但是,从今天开始,我遇到了一些新问题。
无法将日期范围添加到请求的数据中。我将日期作为参数传递,但 API 仅在提交请求的时间请求或获取数据。
感谢任何帮助。
下面的代码 -
def amazon_request():
try:
utc=pytz.UTC
etl_start=datetime.now(pytz.utc)
success=0
message="Request started"
SECRET_KEY = '------------------------'
AWS_ACCESS_KEY = '-----------------'
SELLER_ID = '--------------'
MARKETPLACE_ID = 'A21TJRUUN4KGV'
MWS_AUTH_TOKEN = '------------------'
today = datetime.today()
threedays_ago = today - timedelta(days = 3)
yest = today - timedelta(days = 1)
one_month_ago = (today.replace(day=1) - timedelta(days=1)).replace(day=today.day)
def prev_month_start(inputDate):
day1 = inputDate - pd.offsets.DateOffset(months=1)
day_start = datetime(year= day1.year, month=day1.month, day= 1, hour=0, minute = 0, second=0)
return day_start.isoformat()
prev_month_start_time = prev_month_start(today)
def last_day_of_month(inputDate):
if inputDate.month == 12:
return inputDate.replace(day=31)
return (inputDate - pd.offsets.DateOffset(months=1)).replace(day=1) - timedelta(days=1)
prev_month_end_date = last_day_of_month(one_month_ago)
def month_end(inputDate):
day_end = datetime(year= inputDate.year, month=inputDate.month, day=inputDate.day, hour=23, minute = 59, second=59)
return day_end.isoformat()
prev_month_end_time = month_end(prev_month_end_date)
def Report_Request():
def get_timestamp():
"""Return correctly formatted timestamp"""
return strftime("%Y-%m-%dT%H:%M:%SZ", gmtime())
def calc_signature(method, domain, URI, request_description, key):
"""Calculate signature to send with request"""
sig_data = method + '\n' + \
domain.lower() + '\n' + \
URI + '\n' + \
request_description
return base64.b64encode(hmac.new(str(key).encode('utf-8'), sig_data.encode('utf-8'), hashlib.sha256).digest())
Action = 'RequestReport'
SignatureMethod = 'HmacSHA256'
SignatureVersion = '2'
Timestamp = get_timestamp()
Version = '2009-01-01'
DateRangeStart = prev_month_start_time
print(DateRangeStart)
DateRangeEnd = prev_month_end_time
print(DateRangeEnd)
URI = '/Reports/2009-01-01'
domain = 'mws.amazonservices.in'
proto = 'https://'
method = 'POST'
ReportType = '_GET_GST_MTR_B2B_CUSTOM_'
payload = {
'AWSAccessKeyId': AWS_ACCESS_KEY,
'Action': Action,
'Merchant': SELLER_ID,
'MWSAuthToken': MWS_AUTH_TOKEN,
'SignatureVersion': SignatureVersion,
'Timestamp': Timestamp,
'Version': Version,
'SignatureMethod': SignatureMethod,
'ReportType': ReportType,
'DateRangeStart': DateRangeStart,
'DateRangeEnd': DateRangeEnd
}
request_description = '&'.join(['%s=%s' % (k, quote(payload[k], safe='-_.~')) for k in sorted(payload)])
sig = calc_signature(method, domain, URI, request_description, SECRET_KEY)
url = '%s%s?%s&Signature=%s' % \
(proto+domain, URI, request_description, quote(sig))
headers = {
'Host': domain,
'Content-Type': 'text/xml',
'x-amazon-user-agent': 'python-requests/1.2.0 (Language=Python)'
}
r = request(method, url, headers=headers)
return r.text
report_request = Report_Request()
def ReportRequestDF():
xml_text = report_request
xmlstring = re.sub(' xmlns="[^"]+"', '', xml_text, count=1)
root = ET.fromstring(xmlstring)
report_info_nodes = root.find('RequestReportResult').findall('ReportRequestInfo')
get_range = lambda col: range(len(col))
l = [{r[i].tag:r[i].text for i in get_range(r)} for r in report_info_nodes]
df = pd.DataFrame.from_dict(l)
return df
df_request = ReportRequestDF()
ReportRequest_ID = df_request['ReportRequestId'][0]
df_request['RequestTime'] = datetime.now()
df_request = df_request[['SubmittedDate','ReportRequestId', 'ReportType','ReportProcessingStatus', 'StartDate','EndDate','RequestTime']]
print("ReportRequestId: {}".format(ReportRequest_ID))