|
@@ -5,6 +5,8 @@ from sync_amz_data.settings import AWS_LWA_CLIENT
|
|
import pandas as pd
|
|
import pandas as pd
|
|
import json
|
|
import json
|
|
from sync_amz_data.tasks.datainsert.wg import LADS
|
|
from sync_amz_data.tasks.datainsert.wg import LADS
|
|
|
|
+from sync_amz_data.public.amz_ad_client import SBClient
|
|
|
|
+from typing import Literal
|
|
|
|
|
|
|
|
|
|
class RateLimitError(Exception):
|
|
class RateLimitError(Exception):
|
|
@@ -12,7 +14,7 @@ class RateLimitError(Exception):
|
|
self.retry_after = retry_after
|
|
self.retry_after = retry_after
|
|
|
|
|
|
|
|
|
|
-def request(url_path: str, method: str = "GET", head: dict = None, params: dict = None, body: dict = None, AD = LADS):
|
|
|
|
|
|
+def request(url_path: str, method: str = "GET", head: dict = None, params: dict = None, body: dict = None, AD=LADS):
|
|
ADS = AD
|
|
ADS = AD
|
|
resp = requests.session().request(
|
|
resp = requests.session().request(
|
|
method=method,
|
|
method=method,
|
|
@@ -32,6 +34,7 @@ class SbTargets:
|
|
def __init__(self, profile_id):
|
|
def __init__(self, profile_id):
|
|
self.profile_id = profile_id
|
|
self.profile_id = profile_id
|
|
self.re_url_path = "api/ad_manage/profiles/"
|
|
self.re_url_path = "api/ad_manage/profiles/"
|
|
|
|
+ self.gid_url_path = "api/ad_manage/getsbadgroupId/"
|
|
self.upcreate_url_path = "api/ad_manage/sbtargets/updata/"
|
|
self.upcreate_url_path = "api/ad_manage/sbtargets/updata/"
|
|
self.heads = {'X-Token': "da4ab6bc5cbf1dfa"}
|
|
self.heads = {'X-Token': "da4ab6bc5cbf1dfa"}
|
|
self.refresh_token = self.get_refresh_token()
|
|
self.refresh_token = self.get_refresh_token()
|
|
@@ -56,6 +59,30 @@ class SbTargets:
|
|
out = None
|
|
out = None
|
|
return out
|
|
return out
|
|
|
|
|
|
|
|
+ def id_type_trans(self, df):
|
|
|
|
+ id_columns = [i for i in df.columns if 'id' in i.lower() and 'bid' not in i.lower()]
|
|
|
|
+ df[id_columns] = df[id_columns].fillna(-1).applymap(lambda x: round(int(x), 0)).astype("string")
|
|
|
|
+ df[id_columns] = df[id_columns].applymap(lambda x: '' if x == '-1' else x)
|
|
|
|
+ return df
|
|
|
|
+
|
|
|
|
+ @classmethod
|
|
|
|
+ def get_keyOvalue(cls, expressions, result: Literal['value', 'type']):
|
|
|
|
+ if expressions not in [None, pd.NA, pd.NaT]:
|
|
|
|
+ if len(expressions) > 1:
|
|
|
|
+ return [i.get(result) for i in expressions]
|
|
|
|
+ if len(expressions) == 1:
|
|
|
|
+ sub_ = expressions[0].get(result)
|
|
|
|
+ if sub_ is None:
|
|
|
|
+ return None
|
|
|
|
+ elif type(sub_) == str:
|
|
|
|
+ return sub_
|
|
|
|
+ elif type(sub_) == list:
|
|
|
|
+ return [i.get(result) for i in sub_]
|
|
|
|
+ else:
|
|
|
|
+ return expressions
|
|
|
|
+ else:
|
|
|
|
+ return '-'
|
|
|
|
+
|
|
def get_sbtargets_data(self):
|
|
def get_sbtargets_data(self):
|
|
tem = SB_ETL(**self.AWS_CREDENTIALS)
|
|
tem = SB_ETL(**self.AWS_CREDENTIALS)
|
|
df = tem.targets_ETL()
|
|
df = tem.targets_ETL()
|
|
@@ -71,8 +98,51 @@ class SbTargets:
|
|
df['profile'] = self.profile_id
|
|
df['profile'] = self.profile_id
|
|
return df
|
|
return df
|
|
|
|
|
|
|
|
+ def get_adgroup_data(self):
|
|
|
|
+ heads = self.heads
|
|
|
|
+ url_path = self.gid_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'))
|
|
|
|
+ df = pd.json_normalize(data)
|
|
|
|
+ out_list_id = list(df.adGroupId.values)
|
|
|
|
+ return out_list_id
|
|
|
|
+
|
|
|
|
+ def get_sbtargets_data_new(self):
|
|
|
|
+ tem = SBClient(**self.AWS_CREDENTIALS)
|
|
|
|
+ adgroupids = self.get_adgroup_data()
|
|
|
|
+ _ = tem.get_targets_groupid(adgroupIds=adgroupids)
|
|
|
|
+ df = _.get('targets')
|
|
|
|
+ df_targets = pd.json_normalize(df)
|
|
|
|
+ if len(df_targets) > 0:
|
|
|
|
+ df_targets = self.id_type_trans(df_targets)
|
|
|
|
+ df_targets['expressions_type'] = df_targets['expressions'].map(
|
|
|
|
+ lambda x: self.get_keyOvalue(x, 'type'))
|
|
|
|
+ df_targets['expressions_value'] = df_targets['expressions'].map(
|
|
|
|
+ lambda x: self.get_keyOvalue(x, 'value'))
|
|
|
|
+ df_targets['resolvedExpressions_type'] = df_targets['resolvedExpressions'].map(
|
|
|
|
+ lambda x: self.get_keyOvalue(x, 'type'))
|
|
|
|
+ df_targets['resolvedExpressions_value'] = df_targets['resolvedExpressions'].map(
|
|
|
|
+ lambda x: self.get_keyOvalue(x, 'value'))
|
|
|
|
+ df_targets.rename(columns={'adGroupId': 'adGroup',
|
|
|
|
+ 'campaignId': 'campaign',
|
|
|
|
+ 'expressions_type': 'expression_type',
|
|
|
|
+ 'expressions_value': 'expression_value',
|
|
|
|
+ 'resolvedExpressions_type': 'resolvedExpression_type',
|
|
|
|
+ 'resolvedExpressions_value': 'resolvedExpression_value'}, inplace=True)
|
|
|
|
+ df_targets.drop(columns=['expressions', 'resolvedExpressions'], inplace=True)
|
|
|
|
+ df_targets['profile'] = self.profile_id
|
|
|
|
+ return df_targets
|
|
|
|
+
|
|
def updata_create(self):
|
|
def updata_create(self):
|
|
- df_data = self.get_sbtargets_data()
|
|
|
|
|
|
+ df_data = self.get_sbtargets_data_new()
|
|
_ = df_data.to_json(orient='records', date_format='iso')
|
|
_ = df_data.to_json(orient='records', date_format='iso')
|
|
body = json.loads(_)
|
|
body = json.loads(_)
|
|
heads = self.heads
|
|
heads = self.heads
|
|
@@ -81,9 +151,8 @@ class SbTargets:
|
|
return tem
|
|
return tem
|
|
|
|
|
|
|
|
|
|
-
|
|
|
|
if __name__ == '__main__':
|
|
if __name__ == '__main__':
|
|
a = SbTargets(profile_id="3006125408623189")
|
|
a = SbTargets(profile_id="3006125408623189")
|
|
- # out = a.get_sbtargets_data()
|
|
|
|
|
|
+ # out = a.get_sbtargets_data_new()
|
|
out = a.updata_create()
|
|
out = a.updata_create()
|
|
print(out)
|
|
print(out)
|