如何从亚马逊 MWS API 获取 MTR_B2C 报告

时间:2021-06-10 11:16:53

标签: python-3.x api amazon-mws

我目前有一个亚马逊 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))

0 个答案:

没有答案