如何解决如何从亚马逊 MWS API 获取 MTR_B2C 报告
我目前有一个亚马逊 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,SECRET_KEY)
url = '%s%s?%s&Signature=%s' % \
(proto+domain,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))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。