Răsfoiți Sursa

Merge branch 'wengao' of ASJ_ADS/sync_amz_data into master

wengao 1 an în urmă
părinte
comite
16327fb809

+ 23 - 0
sync_amz_data/public/amz_ad_client.py

@@ -677,6 +677,17 @@ class SBClient(BaseClient):
         }
         return self._request(url_path, method="POST", body=body, headers=headers)
 
+    def get_target_bidrecommendation(self, campaignId: str, targets: list,):
+        url_path = "/sb/recommendations/bids"
+        headers = {
+            "Content-Type": "application/json"
+        }
+        body = {
+            "campaignId": campaignId,
+            "targets": targets
+        }
+        return self._request(url_path, method="POST", body=body, headers=headers)
+
     def iter_keyword_bidrecommendation(self,campaignId: str, keywords: list):
         for i in range(0, len(keywords), 100):
             try:
@@ -686,6 +697,18 @@ class SBClient(BaseClient):
                 # print("空值")
                 return iter([])
 
+    def iter_target_bidrecommendation(self,campaignId: str, targets: list):
+        for i in range(0, len(targets), 100):
+            try:
+                info = self.get_target_bidrecommendation(campaignId, targets[i:i+100])
+                out = info['targetsBidsRecommendationSuccessResults']
+                for i in out:
+                    i['campaignId'] = campaignId
+                yield from out
+            except:
+                # print("空值")
+                return iter([])
+
 
     def get_v3_report(self,
                       groupby:list,

+ 0 - 0
sync_amz_data/tasks/datainsert/SB/mysql_datainsert_sb_keywordsbid_recommendations.py → sync_amz_data/tasks/datainsert/SB/mysql_datainsert_sb_keywordsbid_recommendations_v3.py


+ 0 - 0
sync_amz_data/tasks/datainsert/SB/mysql_datainsert_sbtarget.py → sync_amz_data/tasks/datainsert/SB/mysql_datainsert_sbtarget_v3.py


+ 144 - 0
sync_amz_data/tasks/datainsert/SB/mysql_datainsert_sbtargetbid_recommendations_v3.py

@@ -0,0 +1,144 @@
+import requests
+from urllib.parse import urljoin
+from sync_amz_data.public.amz_ad_client import SBClient
+from sync_amz_data.settings import AWS_LWA_CLIENT
+import pandas as pd
+import json
+
+# pd.set_option('display.max_columns', None)
+# # 显示所有行
+# pd.set_option('display.max_rows', None)
+
+class RateLimitError(Exception):
+    def __init__(self, retry_after: str = None):
+        self.retry_after = retry_after
+
+
+def request(url_path: str, method: str = "GET", head: dict = None, params: dict = None, body: dict = None):
+    ADS = "http://192.168.1.23:8001/"
+    resp = requests.session().request(
+        method=method,
+        url=urljoin(ADS, url_path),
+        headers=head,
+        params=params,
+        json=body,
+    )
+    if resp.status_code == 429:
+        raise RateLimitError(resp.headers.get("Retry-After"))
+    if resp.status_code >= 400:
+        raise Exception(resp.text)
+    return resp.json()
+
+
+def convert_row(row):
+    type_list = row['type']
+    value_list = row['value']
+    expressions = []
+    if isinstance(row['value'], list):
+        for i in range(len(value_list)):
+            for v, t in zip(value_list[i:i+1], type_list[i:i+1]):
+                v = v.replace("'", "")
+                v = v.replace(" ", "")
+                t = t.replace("'", "")
+                t = t.replace(" ", "")
+                temp_dict = {"type": str(t), "value": str(v)}
+                expressions.append(temp_dict)
+    else:
+        expressions = [{"type": type_list, "value": value_list}]
+    return expressions
+
+def convert_list(val):
+    if '[' in val:
+        return val.split('[')[1].split(']')[0].split(',')
+    else:
+        return val
+
+
+class SbtargetsBidRecommendations:
+    def __init__(self, profile_id):
+        self.profile_id = profile_id
+        self.re_url_path = "api/ad_manage/profiles/"
+        self.sbk_url_path = "api/ad_manage/sbkbrtargets/"
+        self.upcreate_url_path = "api/ad_manage/sbtargetsbidrecommendation/updata/"
+        self.heads = {'X-Token': "da4ab6bc5cbf1dfa"}
+        self.refresh_token = self.get_refresh_token()
+        self.lwa_client_id = AWS_LWA_CLIENT['lwa_client_id']
+        self.lwa_client_secret = AWS_LWA_CLIENT['lwa_client_secret']
+        self.AWS_CREDENTIALS = {
+            'lwa_client_id': self.lwa_client_id,
+            'lwa_client_secret': self.lwa_client_secret,
+            'refresh_token': self.refresh_token,
+            'profile_id': self.profile_id
+        }
+
+    def get_refresh_token(self):
+        params = {'profile_id': self.profile_id}
+        heads = self.heads
+        url_path = self.re_url_path
+        tem = request(url_path=url_path, head=heads, params=params)
+        if tem.get('data') is not None:
+            _ = tem.get('data')
+            out = _[0].get('refresh_token')
+        else:
+            out = None
+        return out
+
+    def get_arg(self):
+        heads = self.heads
+        url_path = self.sbk_url_path
+        data = []
+        page = 1
+        params = {'profile_id': self.profile_id, 'limit': 999, 'page': page}
+        tem = request(url_path=url_path, head=heads, params=params)
+        data.extend(tem.get('data'))
+        while tem.get('is_next') is True:
+            page += 1
+            params = {'profile_id': self.profile_id, 'limit': 999, 'page': page}
+            tem = request(url_path=url_path, head=heads, params=params)
+            data.extend(tem.get('data'))
+        _ = pd.json_normalize(data)
+        df = _.copy()
+        df.rename(columns={'expression_value': 'value', 'expression_type': 'type'}, inplace=True)
+        # df['targets'] = df[['type', 'value', 'targetId']].apply(lambda x: x.to_dict(), axis=1)
+        df['value'] = df['value'].apply(convert_list)
+        df['type'] = df['type'].apply(convert_list)
+        df['targets'] = df.apply(convert_row, axis=1)
+        df_grouped = df.groupby('campaignId').agg({'targets': list}).reset_index()
+        return df, df_grouped
+
+    def get_sbtargetsbidrecommendation_data(self):
+        tem = SBClient(**self.AWS_CREDENTIALS)
+        df_old, df_arg = self.get_arg()
+        data_json = df_arg.to_json(orient='records')
+        list_arg = json.loads(data_json)
+        out_data = []
+        for i in list_arg:
+            res = tem.iter_target_bidrecommendation(**i)
+            out_data.extend(list(res))
+        temtest = pd.json_normalize(out_data)
+        temtest['targets'] = temtest['targets'].astype(str).str.lower()
+        df_old['targets'] = df_old['targets'].astype(str).str.lower()
+        _ = pd.merge(left=df_old, right=temtest, on=['targets', 'campaignId'], how='left')
+        outall = _[['targetId', 'recommendedBid.rangeStart', 'recommendedBid.rangeEnd',
+                    'recommendedBid.recommended']].copy()
+        outall = outall.dropna(subset=['recommendedBid.rangeEnd'])
+        outall.rename(columns={'recommendedBid.recommended': 'suggestedBid',
+                               'recommendedBid.rangeStart': 'suggestedBid_lower',
+                               'recommendedBid.rangeEnd': 'suggestedBid_upper',
+                               'targetId': 'target'
+                               }, inplace=True)
+        json_data = json.loads(outall.to_json(orient='records', force_ascii=False))
+        return json_data
+
+    def updata_create(self):
+        body = self.get_sbtargetsbidrecommendation_data()
+        heads = self.heads
+        url_path = self.upcreate_url_path
+        tem = request(url_path=url_path, head=heads, body=body, method="POST")
+        return tem
+
+
+if __name__ == '__main__':
+    a = SbtargetsBidRecommendations(profile_id="3006125408623189")
+    out = a.updata_create()
+    print(out)

+ 7 - 2
sync_amz_data/tasks/datainsert/alldata_insert.py

@@ -14,8 +14,9 @@ from SB.mysql_datainsert_sbcampaign import SbCampaign
 from SB.mysql_datainsert_sbgroup import SbGroup
 from SB.mysql_datainsert_sbkeyword_v3 import SbKeyword
 from SB.mysql_datainsert_sbads import SbAds
-from SB.mysql_datainsert_sb_keywordsbid_recommendations import SbkeywordsBidRecommendations
-from SB.mysql_datainsert_sbtarget import SbTargets
+from SB.mysql_datainsert_sb_keywordsbid_recommendations_v3 import SbkeywordsBidRecommendations
+from SB.mysql_datainsert_sbtarget_v3 import SbTargets
+from SB.mysql_datainsert_sbtargetbid_recommendations_v3 import SbtargetsBidRecommendations
 
 pf = Portfolios("3006125408623189")
 pfo = pf.updata_create()
@@ -86,4 +87,8 @@ sbt = SbTargets(profile_id="3006125408623189")
 sbto = sbt.updata_create()
 print("SbTargets", sbto)
 
+sbtbr = SbtargetsBidRecommendations(profile_id="3006125408623189")
+sbtbro = sbtbr.updata_create()
+print("SbtargetsBidRecommendations", sbtbro)
+