Browse Source

add report api

huangyifan 1 year ago
parent
commit
5082d83f61
2 changed files with 445 additions and 67 deletions
  1. 360 33
      sync_amz_data/DataTransform/Data_ETL.py
  2. 85 34
      sync_amz_data/public/amz_ad_client.py

+ 360 - 33
sync_amz_data/DataTransform/Data_ETL.py

@@ -159,10 +159,10 @@ class SB_ETL(SBClient,Common_ETLMethod):
         ] #'startDate', 'endDate',
         params['groupby'] = ['purchasedAsin']
         params['timeUnit'] = 'DAILY'
-        list_campaigns_report = self.get_v3_report(timeUnit=params['timeUnit'],groupby=params['groupby'],columns=params['columns'],startDate=params['startDate'],endDate=params['endDate'],reportType=params['reportType'])
-        # print(list_campaigns_report)
-        df_campaign_report = pd.json_normalize(list_campaigns_report)
-        return df_campaign_report
+        list_report = self.get_v3_report(timeUnit=params['timeUnit'],groupby=params['groupby'],columns=params['columns'],startDate=params['startDate'],endDate=params['endDate'],reportType=params['reportType'])
+        # print(list_report)
+        df_report = pd.json_normalize(list_report)
+        return df_report
 
     def reportV2_campaignsRecord_ETL(self,**params):
         today = datetime.today()
@@ -179,10 +179,11 @@ class SB_ETL(SBClient,Common_ETLMethod):
                 'campaignBudgetType', 'campaignId', 'campaignName', 'campaignRuleBasedBudget', 'campaignStatus', 'clicks', 'cost',
                 'dpv14d', 'impressions', 'unitsSold14d', 'attributedBrandedSearches14d', 'topOfSearchImpressionShare'
             ]
-        list_campaigns_report = self.get_v2_report(record_type=params['record_type'],report_date=params["date"],metrics=params['metrics'])
-        # print(list_campaigns_report)
-        df_campaign_report = pd.json_normalize(list_campaigns_report)
-        return df_campaign_report
+        list_report = self.get_v2_report(record_type=params['record_type'],report_date=params["date"],metrics=params['metrics'])
+        # print(list_report)
+        df_report = pd.json_normalize(list_report)
+        return df_report
+
     def reportV2_placementRecord_ETL(self,**params):
         today = datetime.today()
         if params.get("date")==None:
@@ -201,10 +202,10 @@ class SB_ETL(SBClient,Common_ETLMethod):
                     'clicks', 'cost', 'dpv14d', 'impressions', 'unitsSold14d', 'attributedBrandedSearches14d'
                 ] #'placement'
         # print(date)
-        list_campaigns_report = self.get_v2_report(record_type=params['record_type'],report_date=params["date"],metrics=params['metrics'],segment='placement')
-        # print(list_campaigns_report)
-        df_campaign_report = pd.json_normalize(list_campaigns_report)
-        return df_campaign_report
+        list_report = self.get_v2_report(record_type=params['record_type'],report_date=params["date"],metrics=params['metrics'],segment='placement')
+        # print(list_report)
+        df_report = pd.json_normalize(list_report)
+        return df_report
 
     def reportV2_adGroupsRecord_ETL(self,**params):
         today = datetime.today()
@@ -220,10 +221,10 @@ class SB_ETL(SBClient,Common_ETLMethod):
                 'clicks', 'cost', 'dpv14d', 'impressions', 'unitsSold14d', 'attributedBrandedSearches14d'
                 ] #
         # print(date)
-        list_campaigns_report = self.get_v2_report(record_type=params['record_type'],report_date=params["date"],metrics=params['metrics'])
-        # print(list_campaigns_report)
-        df_campaign_report = pd.json_normalize(list_campaigns_report)
-        return df_campaign_report
+        list_report = self.get_v2_report(record_type=params['record_type'],report_date=params["date"],metrics=params['metrics'])
+        # print(list_report)
+        df_report = pd.json_normalize(list_report)
+        return df_report
 
     def reportV2_targetsRecord_ETL(self,**params):
         today = datetime.today()
@@ -239,10 +240,10 @@ class SB_ETL(SBClient,Common_ETLMethod):
                 'attributedBrandedSearches14d', 'topOfSearchImpressionShare'
                 ] #
         # print(date)
-        list_campaigns_report = self.get_v2_report(record_type=params['record_type'],report_date=params["date"],metrics=params['metrics'])
-        # print(list_campaigns_report)
-        df_campaign_report = pd.json_normalize(list_campaigns_report)
-        return df_campaign_report
+        list_report = self.get_v2_report(record_type=params['record_type'],report_date=params["date"],metrics=params['metrics'])
+        # print(list_report)
+        df_report = pd.json_normalize(list_report)
+        return df_report
 
     def reportV2_keywordsRecord_ETL(self,**params):
         today = datetime.today()
@@ -259,10 +260,10 @@ class SB_ETL(SBClient,Common_ETLMethod):
                 'unitsSold14d', 'attributedBrandedSearches14d', 'topOfSearchImpressionShare'
                 ] #
         # print(date)
-        list_campaigns_report = self.get_v2_report(record_type=params['record_type'],report_date=params["date"],metrics=params['metrics'])
+        list_report = self.get_v2_report(record_type=params['record_type'],report_date=params["date"],metrics=params['metrics'])
         # print(list_campaigns_report)
-        df_campaign_report = pd.json_normalize(list_campaigns_report)
-        return df_campaign_report
+        df_report = pd.json_normalize(list_report)
+        return df_report
 
     def reportV2_searchtermsRecord_ETL(self,**params):
         today = datetime.today()
@@ -277,10 +278,10 @@ class SB_ETL(SBClient,Common_ETLMethod):
                 'searchTermImpressionShare'
                 ] #
         # print(date)
-        list_campaigns_report = self.get_v2_report(record_type=params['record_type'],report_date=params["date"],metrics=params['metrics'],segment='query')
-        # print(list_campaigns_report)
-        df_campaign_report = pd.json_normalize(list_campaigns_report)
-        return df_campaign_report
+        list_report = self.get_v2_report(record_type=params['record_type'],report_date=params["date"],metrics=params['metrics'],segment='query')
+        # print(list_report)
+        df_report = pd.json_normalize(list_report)
+        return df_report
 
     def reportV2_adsRecord_ETL(self,**params):
         today = datetime.today()
@@ -296,10 +297,10 @@ class SB_ETL(SBClient,Common_ETLMethod):
                 'clicks', 'cost', 'dpv14d', 'impressions', 'unitsSold14d', 'vctr', 'attributedBrandedSearches14d'
                 ] #
         # print(date)
-        list_campaigns_report = self.get_v2_report(record_type=params['record_type'],report_date=params["date"],metrics=params['metrics'])
-        # print(list_campaigns_report)
-        df_campaign_report = pd.json_normalize(list_campaigns_report)
-        return df_campaign_report
+        list_report = self.get_v2_report(record_type=params['record_type'],report_date=params["date"],metrics=params['metrics'])
+        # print(list_report)
+        df_report = pd.json_normalize(list_report)
+        return df_report
 
 class SD_ETL(SDClient,Common_ETLMethod):
     def campaigns_ETL(self):
@@ -333,6 +334,332 @@ class SD_ETL(SDClient,Common_ETLMethod):
         df_budget = self.TZ_Deal(df_budget,["usageUpdatedTimestamp"])
         return self.columnsName_modify(df_budget)
 
+    campaigns_metrics = [
+                'attributedConversions14d', 'attributedConversions14dSameSKU', 'attributedConversions1d', 'attributedConversions1dSameSKU', 'attributedConversions30d',
+                'attributedConversions30dSameSKU', 'attributedConversions7d', 'attributedConversions7dSameSKU', 'attributedDetailPageView14d', 'attributedOrdersNewToBrand14d',
+                'attributedSales14d', 'attributedSales14dSameSKU', 'attributedSales1d', 'attributedSales1dSameSKU', 'attributedSales30d', 'attributedSales30dSameSKU',
+                'attributedSales7d', 'attributedSales7dSameSKU', 'attributedSalesNewToBrand14d', 'attributedUnitsOrdered14d', 'attributedUnitsOrdered1d', 'attributedUnitsOrdered30d',
+                'attributedUnitsOrdered7d', 'attributedUnitsOrderedNewToBrand14d', 'campaignBudget', 'campaignId', 'campaignName', 'campaignStatus', 'clicks', 'cost', 'costType',
+                'currency', 'impressions', 'viewAttributedConversions14d', 'viewAttributedDetailPageView14d', 'viewAttributedSales14d', 'viewAttributedUnitsOrdered14d',
+                'viewImpressions', 'viewAttributedOrdersNewToBrand14d', 'viewAttributedSalesNewToBrand14d', 'viewAttributedUnitsOrderedNewToBrand14d', 'attributedBrandedSearches14d',
+                'viewAttributedBrandedSearches14d', 'videoCompleteViews', 'videoFirstQuartileViews', 'videoMidpointViews', 'videoThirdQuartileViews', 'videoUnmutes', 'vtr', 'vctr',
+                'avgImpressionsFrequency', 'cumulativeReach'
+            ]
+    def reportV2_campaignsRecord_t2_ETL(self,**params):
+        today = datetime.today()
+        if params.get("date")==None:
+            params["date"] = (datetime(today.year,today.month,today.day,tzinfo=timezone.utc)-timedelta(days=1)).strftime("%Y%m%d")
+        params['record_type']='campaigns'
+        if params.get('metrics')==None:
+            params['metrics'] = self.campaigns_metrics
+        list_report = self.get_v2_report(record_type=params['record_type'],report_date=params["date"],metrics=params['metrics'],tactic="T00020")
+        # print(list_report)
+        df_report = pd.json_normalize(list_report)
+        return df_report
+
+    def reportV2_campaignsRecord_t3_ETL(self,**params):
+        today = datetime.today()
+        if params.get("date")==None:
+            params["date"] = (datetime(today.year,today.month,today.day,tzinfo=timezone.utc)-timedelta(days=1)).strftime("%Y%m%d")
+        params['record_type']='campaigns'
+        if params.get('metrics')==None:
+            params['metrics'] = self.campaigns_metrics
+        list_report = self.get_v2_report(record_type=params['record_type'],report_date=params["date"],metrics=params['metrics'],tactic="T00030")
+        # print(list_report)
+        df_report = pd.json_normalize(list_report)
+        return df_report
+
+    adGroups_metrics = [
+        'adGroupId', 'adGroupName', 'attributedConversions14d', 'attributedConversions14dSameSKU', 'attributedConversions1d', 'attributedConversions1dSameSKU',
+        'attributedConversions30d', 'attributedConversions30dSameSKU', 'attributedConversions7d', 'attributedConversions7dSameSKU', 'attributedDetailPageView14d',
+        'attributedOrdersNewToBrand14d', 'attributedSales14d', 'attributedSales14dSameSKU', 'attributedSales1d', 'attributedSales1dSameSKU', 'attributedSales30d',
+        'attributedSales30dSameSKU', 'attributedSales7d', 'attributedSales7dSameSKU', 'attributedUnitsOrdered14d', 'attributedUnitsOrdered1d', 'attributedUnitsOrdered30d',
+        'attributedUnitsOrdered7d', 'attributedUnitsOrderedNewToBrand14d', 'bidOptimization', 'campaignId', 'campaignName', 'clicks', 'cost', 'currency', 'impressions',
+        'viewAttributedConversions14d', 'viewAttributedDetailPageView14d', 'viewAttributedSales14d', 'viewAttributedUnitsOrdered14d', 'viewImpressions',
+        'viewAttributedOrdersNewToBrand14d', 'viewAttributedSalesNewToBrand14d', 'viewAttributedUnitsOrderedNewToBrand14d', 'attributedBrandedSearches14d',
+        'viewAttributedBrandedSearches14d', 'videoCompleteViews', 'videoFirstQuartileViews', 'videoMidpointViews', 'videoThirdQuartileViews', 'videoUnmutes', 'vtr',
+        'vctr', 'avgImpressionsFrequency', 'cumulativeReach']
+    def reportV2_adGroupsRecord_t2_ETL(self,**params):
+        today = datetime.today()
+        if params.get("date")==None:
+            params["date"] = (datetime(today.year,today.month,today.day,tzinfo=timezone.utc)-timedelta(days=1)).strftime("%Y%m%d")
+        params['record_type']='adGroups'
+        if params.get('metrics')==None:
+            params['metrics'] = self.adGroups_metrics
+        list_report = self.get_v2_report(record_type=params['record_type'],report_date=params["date"],metrics=params['metrics'],tactic="T00020")
+        # print(list_report)
+        df_report = pd.json_normalize(list_report)
+        return df_report
+
+    def reportV2_adGroupsRecord_t3_ETL(self,**params):
+        today = datetime.today()
+        if params.get("date")==None:
+            params["date"] = (datetime(today.year,today.month,today.day,tzinfo=timezone.utc)-timedelta(days=1)).strftime("%Y%m%d")
+        params['record_type']='adGroups'
+        if params.get('metrics')==None:
+            params['metrics'] = self.adGroups_metrics
+        list_report = self.get_v2_report(record_type=params['record_type'],report_date=params["date"],metrics=params['metrics'],tactic="T00030")
+        # print(list_report)
+        df_report = pd.json_normalize(list_report)
+        return df_report
+
+    productAds_metrics = [
+        'adGroupId', 'adGroupName', 'adId', 'asin', 'attributedConversions14d', 'attributedConversions14dSameSKU',
+        'attributedConversions1d', 'attributedConversions1dSameSKU', 'attributedConversions30d',
+        'attributedConversions30dSameSKU', 'attributedConversions7d', 'attributedConversions7dSameSKU',
+        'attributedDetailPageView14d', 'attributedOrdersNewToBrand14d', 'attributedSales14d', 'attributedSales14dSameSKU',
+        'attributedSales1d', 'attributedSales1dSameSKU', 'attributedSales30d', 'attributedSales30dSameSKU', 'attributedSales7d',
+        'attributedSales7dSameSKU', 'attributedSalesNewToBrand14d', 'attributedUnitsOrdered14d', 'attributedUnitsOrdered1d',
+        'attributedUnitsOrdered30d', 'attributedUnitsOrdered7d', 'attributedUnitsOrderedNewToBrand14d', 'campaignId',
+        'campaignName', 'clicks', 'cost', 'currency', 'impressions', 'sku', 'viewAttributedConversions14d', 'viewImpressions',
+        'viewAttributedDetailPageView14d', 'viewAttributedSales14d', 'viewAttributedUnitsOrdered14d', 'viewAttributedOrdersNewToBrand14d',
+        'viewAttributedSalesNewToBrand14d', 'viewAttributedUnitsOrderedNewToBrand14d', 'attributedBrandedSearches14d', 'viewAttributedBrandedSearches14d',
+       'videoCompleteViews', 'videoFirstQuartileViews', 'videoMidpointViews', 'videoThirdQuartileViews', 'videoUnmutes', 'vtr', 'vctr',
+        'avgImpressionsFrequency', 'cumulativeReach'
+    ]
+
+    def reportV2_productAds_t2_ETL(self,**params):
+        today = datetime.today()
+        if params.get("date")==None:
+            params["date"] = (datetime(today.year,today.month,today.day,tzinfo=timezone.utc)-timedelta(days=1)).strftime("%Y%m%d")
+        params['record_type']='productAds'
+        if params.get('metrics')==None:
+            params['metrics'] = self.productAds_metrics
+        list_report = self.get_v2_report(record_type=params['record_type'],report_date=params["date"],metrics=params['metrics'],tactic="T00020")
+        # print(list_report)
+        df_report = pd.json_normalize(list_report)
+        return df_report
+
+    def reportV2_productAds_t3_ETL(self,**params):
+        today = datetime.today()
+        if params.get("date")==None:
+            params["date"] = (datetime(today.year,today.month,today.day,tzinfo=timezone.utc)-timedelta(days=1)).strftime("%Y%m%d")
+        params['record_type']='productAds'
+        if params.get('metrics')==None:
+            params['metrics'] = self.productAds_metrics
+        list_report = self.get_v2_report(record_type=params['record_type'],report_date=params["date"],metrics=params['metrics'],tactic="T00030")
+        # print(list_report)
+        df_report = pd.json_normalize(list_report)
+        return df_report
+
+    targets_metrics = [
+        'adGroupId', 'adGroupName', 'attributedConversions14d', 'attributedConversions14dSameSKU', 'attributedConversions1d',
+        'attributedConversions1dSameSKU', 'attributedConversions30d', 'attributedConversions30dSameSKU',
+        'attributedConversions7d', 'attributedConversions7dSameSKU', 'attributedDetailPageView14d',
+        'attributedOrdersNewToBrand14d', 'attributedSales14d', 'attributedSales14dSameSKU', 'attributedSales1d',
+        'attributedSales1dSameSKU', 'attributedSales30d', 'attributedSales30dSameSKU', 'attributedSales7d',
+        'attributedSales7dSameSKU', 'attributedSalesNewToBrand14d', 'attributedUnitsOrdered14d', 'attributedUnitsOrdered1d',
+        'attributedUnitsOrdered30d', 'attributedUnitsOrdered7d', 'attributedUnitsOrderedNewToBrand14d', 'campaignId',
+        'campaignName', 'clicks', 'cost', 'currency', 'impressions', 'targetId', 'targetingExpression', 'targetingText', 'targetingType',
+        'viewImpressions', 'viewAttributedConversions14d', 'viewAttributedDetailPageView14d', 'viewAttributedSales14d',
+        'viewAttributedUnitsOrdered14d', 'viewAttributedOrdersNewToBrand14d', 'viewAttributedSalesNewToBrand14d',
+        'viewAttributedUnitsOrderedNewToBrand14d', 'attributedBrandedSearches14d', 'viewAttributedBrandedSearches14d',
+        'videoCompleteViews', 'videoFirstQuartileViews', 'videoMidpointViews', 'videoThirdQuartileViews', 'videoUnmutes', 'vtr',
+        'vctr'
+    ]
+
+    def reportV2_targets_t2_ETL(self, **params):
+        today = datetime.today()
+        if params.get("date") == None:
+            params["date"] = (
+                        datetime(today.year, today.month, today.day, tzinfo=timezone.utc) - timedelta(days=1)).strftime(
+                "%Y%m%d")
+        params['record_type'] = 'targets'
+        if params.get('metrics') == None:
+            params['metrics'] = self.targets_metrics
+        list_report = self.get_v2_report(record_type=params['record_type'], report_date=params["date"],
+                                         metrics=params['metrics'], tactic="T00020")
+        # print(list_report)
+        df_report = pd.json_normalize(list_report)
+        return df_report
+
+    def reportV2_targets_t3_ETL(self, **params):
+        today = datetime.today()
+        if params.get("date") == None:
+            params["date"] = (
+                        datetime(today.year, today.month, today.day, tzinfo=timezone.utc) - timedelta(days=1)).strftime(
+                "%Y%m%d")
+        params['record_type'] = 'targets'
+        if params.get('metrics') == None:
+            params['metrics'] = self.targets_metrics
+        list_report = self.get_v2_report(record_type=params['record_type'], report_date=params["date"],
+                                         metrics=params['metrics'], tactic="T00030")
+        # print(list_report)
+        df_report = pd.json_normalize(list_report)
+        return df_report
+
+    asins_metrics = [
+        'adGroupId', 'adGroupName', 'asin', 'attributedSales14dOtherSKU', 'attributedSales1dOtherSKU', 'attributedSales30dOtherSKU',
+        'attributedSales7dOtherSKU', 'attributedUnitsOrdered14dOtherSKU', 'attributedUnitsOrdered1dOtherSKU',
+        'attributedUnitsOrdered30dOtherSKU', 'attributedUnitsOrdered7dOtherSKU', 'campaignId', 'campaignName', 'currency',
+        'otherAsin', 'sku', 'viewAttributedUnitsOrdered1dOtherSKU', 'viewAttributedUnitsOrdered7dOtherSKU',
+        'viewAttributedUnitsOrdered14dOtherSKU', 'viewAttributedUnitsOrdered30dOtherSKU', 'viewAttributedSales1dOtherSKU',
+        'viewAttributedSales7dOtherSKU', 'viewAttributedSales14dOtherSKU', 'viewAttributedSales30dOtherSKU',
+        'viewAttributedConversions1dOtherSKU', 'viewAttributedConversions7dOtherSKU', 'viewAttributedConversions14dOtherSKU',
+        'viewAttributedConversions30dOtherSKU', 'attributedConversions1dOtherSKU', 'attributedConversions7dOtherSKU',
+        'attributedConversions14dOtherSKU', 'attributedConversions30dOtherSKU'
+    ]
+    def reportV2_asins_t2_ETL(self, **params):
+        today = datetime.today()
+        if params.get("date") == None:
+            params["date"] = (
+                        datetime(today.year, today.month, today.day, tzinfo=timezone.utc) - timedelta(days=1)).strftime(
+                "%Y%m%d")
+        params['record_type'] = 'asins'
+        if params.get('metrics') == None:
+            params['metrics'] = self.asins_metrics
+        list_report = self.get_v2_report(record_type=params['record_type'], report_date=params["date"],
+                                         metrics=params['metrics'], tactic="T00020")
+        # print(list_report)
+        df_report = pd.json_normalize(list_report)
+        return df_report
+
+    def reportV2_asins_t3_ETL(self, **params):
+        today = datetime.today()
+        if params.get("date") == None:
+            params["date"] = (
+                        datetime(today.year, today.month, today.day, tzinfo=timezone.utc) - timedelta(days=1)).strftime(
+                "%Y%m%d")
+        params['record_type'] = 'asins'
+        if params.get('metrics') == None:
+            params['metrics'] = self.asins_metrics
+        list_report = self.get_v2_report(record_type=params['record_type'], report_date=params["date"],
+                                         metrics=params['metrics'], tactic="T00030")
+        # print(list_report)
+        df_report = pd.json_normalize(list_report)
+        return df_report
+
+    campaigns_MT_metrics = [
+        'attributedConversions14d', 'attributedConversions14dSameSKU', 'attributedConversions1d',
+        'attributedConversions1dSameSKU', 'attributedConversions30d', 'attributedConversions30dSameSKU',
+        'attributedConversions7d', 'attributedConversions7dSameSKU', 'attributedDetailPageView14d',
+        'attributedOrdersNewToBrand14d', 'attributedSales14d', 'attributedSales14dSameSKU', 'attributedSales1d',
+        'attributedSales1dSameSKU', 'attributedSales30d', 'attributedSales30dSameSKU', 'attributedSales7d',
+        'attributedSales7dSameSKU', 'attributedSalesNewToBrand14d', 'attributedUnitsOrdered14d', 'attributedUnitsOrdered1d',
+        'attributedUnitsOrdered30d', 'attributedUnitsOrdered7d', 'attributedUnitsOrderedNewToBrand14d', 'campaignBudget',
+        'campaignId', 'campaignName', 'campaignStatus', 'clicks', 'cost', 'costType', 'currency', 'impressions',
+        'viewAttributedConversions14d', 'viewAttributedDetailPageView14d', 'viewAttributedSales14d',
+        'viewAttributedUnitsOrdered14d', 'viewImpressions', 'viewAttributedOrdersNewToBrand14d',
+        'viewAttributedSalesNewToBrand14d', 'viewAttributedUnitsOrderedNewToBrand14d', 'attributedBrandedSearches14d',
+        'viewAttributedBrandedSearches14d',
+    ] #'matchedTarget'
+
+    def reportV2_campaign_matchedTarget_t2_ETL(self, **params):
+        today = datetime.today()
+        if params.get("date") == None:
+            params["date"] = (
+                        datetime(today.year, today.month, today.day, tzinfo=timezone.utc) - timedelta(days=1)).strftime(
+                "%Y%m%d")
+        params['record_type'] = 'campaigns'
+        if params.get('metrics') == None:
+            params['metrics'] = self.campaigns_MT_metrics
+        list_report = self.get_v2_report(record_type=params['record_type'], report_date=params["date"],
+                                         metrics=params['metrics'], tactic="T00020",segment='matchedTarget')
+        # print(list_report)
+        df_report = pd.json_normalize(list_report)
+        return df_report
+
+    def reportV2_campaign_matchedTarget_t3_ETL(self, **params):
+        today = datetime.today()
+        if params.get("date") == None:
+            params["date"] = (
+                        datetime(today.year, today.month, today.day, tzinfo=timezone.utc) - timedelta(days=1)).strftime(
+                "%Y%m%d")
+        params['record_type'] = 'campaigns'
+        if params.get('metrics') == None:
+            params['metrics'] = self.campaigns_MT_metrics
+        list_report = self.get_v2_report(record_type=params['record_type'], report_date=params["date"],
+                                         metrics=params['metrics'], tactic="T00030",segment='matchedTarget')
+        # print(list_report)
+        df_report = pd.json_normalize(list_report)
+        return df_report
+
+    adGroups_MT_metrics = [
+        'adGroupId', 'adGroupName', 'attributedConversions14d', 'attributedConversions14dSameSKU', 'attributedConversions1d',
+        'attributedConversions1dSameSKU', 'attributedConversions30d', 'attributedConversions30dSameSKU',
+        'attributedConversions7d', 'attributedConversions7dSameSKU', 'attributedDetailPageView14d',
+        'attributedOrdersNewToBrand14d', 'attributedSales14d', 'attributedSales14dSameSKU', 'attributedSales1d',
+        'attributedSales1dSameSKU', 'attributedSales30d', 'attributedSales30dSameSKU', 'attributedSales7dSameSKU',
+        'attributedUnitsOrdered14d', 'attributedUnitsOrdered1d', 'attributedUnitsOrdered30d', 'attributedUnitsOrdered7d',
+        'attributedUnitsOrderedNewToBrand14d', 'bidOptimization', 'campaignId', 'campaignName', 'clicks', 'cost', 'currency',
+        'impressions', 'viewAttributedConversions14d', 'viewAttributedDetailPageView14d', 'viewAttributedSales14d',
+        'viewAttributedUnitsOrdered14d', 'viewImpressions', 'viewAttributedOrdersNewToBrand14d',
+        'viewAttributedSalesNewToBrand14d', 'viewAttributedUnitsOrderedNewToBrand14d', 'attributedBrandedSearches14d',
+        'viewAttributedBrandedSearches14d'
+    ]#, 'matchedTarget'
+    def reportV2_adGroups_matchedTarget_t2_ETL(self, **params):
+        today = datetime.today()
+        if params.get("date") == None:
+            params["date"] = (
+                        datetime(today.year, today.month, today.day, tzinfo=timezone.utc) - timedelta(days=1)).strftime(
+                "%Y%m%d")
+        params['record_type'] = 'adGroups'
+        if params.get('metrics') == None:
+            params['metrics'] = self.adGroups_MT_metrics
+        list_report = self.get_v2_report(record_type=params['record_type'], report_date=params["date"],
+                                         metrics=params['metrics'], tactic="T00020",segment='matchedTarget')
+        # print(list_report)
+        df_report = pd.json_normalize(list_report)
+        return df_report
+
+    def reportV2_adGroups_matchedTarget_t3_ETL(self, **params):
+        today = datetime.today()
+        if params.get("date") == None:
+            params["date"] = (
+                        datetime(today.year, today.month, today.day, tzinfo=timezone.utc) - timedelta(days=1)).strftime(
+                "%Y%m%d")
+        params['record_type'] = 'adGroups'
+        if params.get('metrics') == None:
+            params['metrics'] = self.adGroups_MT_metrics
+        list_report = self.get_v2_report(record_type=params['record_type'], report_date=params["date"],
+                                         metrics=params['metrics'], tactic="T00030",segment='matchedTarget')
+        # print(list_report)
+        df_report = pd.json_normalize(list_report)
+        return df_report
+
+    targets_MT_metrics=[
+        'adGroupId', 'adGroupName', 'attributedConversions14d', 'attributedConversions14dSameSKU', 'attributedConversions1d',
+        'attributedConversions1dSameSKU', 'attributedConversions30d', 'attributedConversions30dSameSKU',
+        'attributedConversions7d', 'attributedConversions7dSameSKU', 'attributedDetailPageView14d',
+        'attributedOrdersNewToBrand14d', 'attributedSales14d', 'attributedSales14dSameSKU', 'attributedSales1d',
+        'attributedSales1dSameSKU', 'attributedSales30d', 'attributedSales30dSameSKU', 'attributedSales7d',
+        'attributedSales7dSameSKU', 'attributedSalesNewToBrand14d', 'attributedUnitsOrdered14d', 'attributedUnitsOrdered1d',
+        'attributedUnitsOrdered30d', 'attributedUnitsOrdered7d', 'attributedUnitsOrderedNewToBrand14d', 'campaignId',
+        'campaignName', 'clicks', 'cost', 'currency', 'impressions', 'targetId', 'targetingExpression', 'targetingText', 'targetingType',
+        'viewAttributedConversions14d', 'viewAttributedDetailPageView14d', 'viewAttributedSales14d',
+        'viewAttributedUnitsOrdered14d', 'viewAttributedOrdersNewToBrand14d', 'viewAttributedSalesNewToBrand14d',
+        'viewAttributedUnitsOrderedNewToBrand14d', 'attributedBrandedSearches14d', 'viewAttributedBrandedSearches14d'
+    ]
+
+    def reportV2_targets_matchedTarget_t2_ETL(self, **params):
+        today = datetime.today()
+        if params.get("date") == None:
+            params["date"] = (
+                        datetime(today.year, today.month, today.day, tzinfo=timezone.utc) - timedelta(days=1)).strftime(
+                "%Y%m%d")
+        params['record_type'] = 'targets'
+        if params.get('metrics') == None:
+            params['metrics'] = self.targets_MT_metrics
+        list_report = self.get_v2_report(record_type=params['record_type'], report_date=params["date"],
+                                         metrics=params['metrics'], tactic="T00020",segment='matchedTarget')
+        # print(list_report)
+        df_report = pd.json_normalize(list_report)
+        return df_report
+
+    def reportV2_targets_matchedTarget_t3_ETL(self, **params):
+        today = datetime.today()
+        if params.get("date") == None:
+            params["date"] = (
+                        datetime(today.year, today.month, today.day, tzinfo=timezone.utc) - timedelta(days=1)).strftime(
+                "%Y%m%d")
+        params['record_type'] = 'targets'
+        if params.get('metrics') == None:
+            params['metrics'] = self.targets_MT_metrics
+        list_report = self.get_v2_report(record_type=params['record_type'], report_date=params["date"],
+                                         metrics=params['metrics'], tactic="T00030",segment='matchedTarget')
+        # print(list_report)
+        df_report = pd.json_normalize(list_report)
+        return df_report
 
 
 if __name__ == '__main__':
@@ -342,6 +669,6 @@ if __name__ == '__main__':
         'lwa_client_secret': 'cbf0514186db4df91e04a8905f0a91b605eae4201254ced879d8bb90df4b474d',
         'profile_id': "3006125408623189"
     }
-    ac_etl = SB_ETL(**AWS_CREDENTIALS)
+    ac_etl = SD_ETL(**AWS_CREDENTIALS)
     # print(ac_etl.budget_ETL(campaign_ids=["126327624499318"]))
-    print(ac_etl.reportV2_adsRecord_ETL(**{}))
+    print(ac_etl.reportV2_targets_matchedTarget_t2_ETL(**{}))

+ 85 - 34
sync_amz_data/public/amz_ad_client.py

@@ -416,8 +416,13 @@ class SBClient(BaseClient):
                       download=True):
         """
         Now about reportType is only sbPurchasedProduct available.
-        groupby: 聚合条件
-        columns: 需要获取的字段[campaign,purchasedAsin,targeting,searchTerm]
+        @param groupby: 聚合条件
+        @param columns: 需要获取的字段[campaign,purchasedAsin,targeting,searchTerm]
+        @param startDate: 请求开始的日期
+        @param endDate: 请求结束的日期
+        @param reportType: 广告类型
+        @param timeUnit: 时间指标-[DAILY, SUMMARY]
+        @param download: 下载报告
         """
         url_path = "/reporting/reports"
         headers = {
@@ -454,7 +459,7 @@ class SBClient(BaseClient):
         logger.info(f"报告处理完成:{ret}")
         if download:
             pid = self.profile_id
-            reportrel= self.download_v3_report(ret['url'],f"s3://reportforspsbsd/zosi/us/sb/{startDate}_{endDate}_{reportType}_{str(pid)}.json.gz")
+            reportrel= self.download_v3_report(ret['url'],f"s3://reportforspsbsd/zosi/us/sb/{startDate}_{endDate}_{reportType}_{str(groupby)}_{str(pid)}.json.gz")
             return reportrel
         else:
             return ret
@@ -525,7 +530,7 @@ class SBClient(BaseClient):
         logger.info(f"报告处理完成:{ret}")
         if download:
             pid = self.profile_id
-            reportrel= self.download_v2_report(report_id, f"s3://reportforspsbsd/zosi/us/sb/{str(report_date)}_{record_type}_{str(pid)}.gz")
+            reportrel= self.download_v2_report(report_id, f"s3://reportforspsbsd/zosi/us/sb/{str(report_date)}_{record_type}_{creative_type}_{segment}_{str(pid)}.gz")
             return reportrel
         else:
             return ret
@@ -630,6 +635,79 @@ class SDClient(BaseClient):
 
         return self._request(url_path, method="POST", headers=headers,body=body,params={"locale":locale})
 
+    def get_v2_report(
+            self,
+            record_type: Literal['campaigns', 'adGroups', 'productAds', 'targets', 'asins'],
+            report_date: str,
+            metrics: List[str],
+            segment: Literal['matchedTarget'] = None,
+            tactic: Literal['T00020', 'T00030'] = None,
+            download: bool = True
+    ):
+        """
+        @param download: 是否下载文件
+        @param record_type:
+        @param report_date: 格式为YYYYMMDD,以请求的卖家市场所对应的时区为准,超过60天的报告不可用
+        @param metrics:
+        @param segment:
+        @param tactic:
+            T00020: contextual targeting
+            T00030: audience targeting
+        @return:
+        """
+        url = f"/sd/{record_type}/report"
+        body = {
+            "reportDate": report_date,
+            "metrics": ",".join(metrics),
+            "tactic": tactic,
+            "segment": segment
+        }
+        ret = self._request(url, method="POST", body=body)
+        report_id = ret["reportId"]
+        status = ret["status"]
+        print(ret)
+        if status == "FAILURE":
+            raise Exception(ret)
+        logger.info(f"创建报告成功:{ret}")
+        while status == "IN_PROGRESS":
+            logger.debug(f"报告{report_id}正在处理中...")
+            time.sleep(3)
+            ret = self._request(f"/v2/reports/{report_id}")
+            print(ret)
+            status = ret["status"]
+            if status == "FAILURE":
+                raise Exception(ret)
+        logger.info(f"报告处理完成:{ret}")
+        if download:
+            pid = self.profile_id
+            reportrel= self.download_v2_report(report_id, f"s3://reportforspsbsd/zosi/us/sd/{str(report_date)}_{record_type}_{tactic}_{segment}_{str(pid)}.gz")
+            return reportrel
+        else:
+            return ret
+
+    def download_v2_report(self, report_id: str, file_path: str, decompress: bool = True) -> str:
+        url = urljoin(URL_AD_API, f"/v2/reports/{report_id}/download")
+        resp = requests.get(url, headers=self.auth_headers, stream=True, allow_redirects=True)
+        logger.info(f"开始下载报告:{report_id}")
+        kwargs = {'region_name': 'us-east-1', 'endpoint_url': "https://s3.amazonaws.com",
+                  'aws_access_key_id': 'AKIARBAGHTGORIFN44VQ',
+                  'aws_secret_access_key': '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'}
+        s3_ = S3FileSystem(client_kwargs=kwargs)
+        # print()
+        with s3_.open(file_path, 'wb') as f:
+            for data in resp.iter_content(chunk_size=10 * 1024):
+                f.write(data)
+
+        logger.info(f"报告{report_id}下载完成:{file_path}")
+        if not decompress:
+            return file_path
+        with s3_.open(file_path, 'rb') as f:  # 读取s3数据
+            data = gzip.GzipFile(fileobj=f, mode='rb')
+            de_file = json.load(data)
+        logger.info(f"解压完成:{de_file}")
+        # print(de_file)
+        return de_file
+
 class Account(BaseClient):
     def get_portfolios(self):
         url_path = "/v2/portfolios/extended"
@@ -655,7 +733,7 @@ if __name__ == '__main__':
     # keyword=["8mp security camera system","8mp security camera system"],
     # matchType=["broad","exact"]))
 
-    sd = SBClient(**AWS_CREDENTIALS)
+    sd = SDClient(**AWS_CREDENTIALS)
 
     # print(sb.get_keyword_bidrecommendation(**{'campaignId': 27333596383941, 'keywords': [
     #     {"matchType": 'broad', "keywordText": "4k security camera system"}]}))
@@ -663,32 +741,5 @@ if __name__ == '__main__':
     # print(a,len(a))
 
     # sb = SBClient(**AWS_CREDENTIALS)
-    metrics = [
-        'applicableBudgetRuleId',
-        'applicableBudgetRuleName',
-        'attributedConversions14d',
-        'attributedConversions14dSameSKU',
-        'attributedDetailPageViewsClicks14d',
-        'attributedOrderRateNewToBrand14d',
-        'attributedOrdersNewToBrand14d',
-        'attributedOrdersNewToBrandPercentage14d',
-        'attributedSales14d',
-        'attributedSales14dSameSKU',
-        'attributedSalesNewToBrand14d',
-        'attributedSalesNewToBrandPercentage14d',
-        'attributedUnitsOrderedNewToBrand14d',
-        'attributedUnitsOrderedNewToBrandPercentage14d',
-        'campaignBudget',
-        'campaignBudgetType',
-        'campaignId',
-        'campaignName',
-        'campaignRuleBasedBudget',
-        'campaignStatus',
-        'clicks',
-        'cost',
-        'dpv14d',
-        'impressions',
-        'unitsSold14d',
-        'attributedBrandedSearches14d',
-        'topOfSearchImpressionShare']
-    print(sd.get_v3_report(groupby=['searchTerm'],columns=['impressions'],startDate="2023-10-21",endDate="2023-10-21",reportType="sbSearchTerm"))
+
+    print(sd.get_v2_report(record_type="campaigns",report_date="20231020",tactic="T00030",metrics=['impressions']))