浏览代码

Merge branch 'wengao' of ASJ_ADS/sync_amz_data into master

wengao 1 年之前
父节点
当前提交
3c3bc61e9b

+ 4 - 0
sync_amz_data/public/amz_ad_client.py

@@ -567,6 +567,10 @@ class SDClient(BaseClient):
         url_path = "/sd/campaigns"
         return self._request(url_path, params=params)
 
+    def get_campaigns_extended(self, **params) -> List[dict]:
+        url_path = "/sd/campaigns/extended"
+        return self._request(url_path, params=params)
+
     def get_adGroups(self,**params):
         url_path = '/sd/adGroups'
         return self._request(url_path, params=params)

+ 118 - 0
sync_amz_data/tasks/datainsert/mysql_datainsert_sbcampaign.py

@@ -0,0 +1,118 @@
+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
+
+
+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()
+
+
+class SpCampaign:
+    def __init__(self, profile_id, portfolioId: list = None):
+        self.profile_id = profile_id
+        self.portfolioId = portfolioId
+        self.re_url_path = "api/ad_manage/profiles/"
+        self.upcreate_url_path = "api/sbcampaigns/list/"
+        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_sbcampaign_data(self):
+        tem = SBClient(**self.AWS_CREDENTIALS)
+        if self.portfolioId is None:
+            list_campaigns = tem.iter_campaigns(**{"includeExtendedDataFields": True})
+        else:
+            list_campaigns = tem.iter_campaigns(**{"includeExtendedDataFields": True,
+                                                   "portfolioIdFilter": {"include": self.portfolioId}
+                                                   })
+        df_campaigns = pd.json_normalize(list(list_campaigns))
+        return df_campaigns
+
+    def dataconvert(self):
+        df = self.get_sbcampaign_data()
+        df['profile_id'] = self.profile_id
+        df['extendedData.creationDate'] = pd.to_datetime(df['extendedData.creationDate'], unit='ms').dt.strftime(
+            '%Y-%m-%d %H:%M:%S')
+        df['extendedData.lastUpdateDate'] = pd.to_datetime(df['extendedData.lastUpdateDate'], unit='ms').dt.strftime(
+            '%Y-%m-%d %H:%M:%S')
+        col = ['budgetType', 'ruleBasedBudget.isProcessing', 'ruleBasedBudget.applicableRuleName',
+               'ruleBasedBudget.value', 'ruleBasedBudget.applicableRuleId', 'brandEntityId',
+               'isMultiAdGroupsEnabled', 'goal', 'bidding.bidOptimization', 'bidding.bidAdjustmentsByShopperSegment',
+               'bidding.bidAdjustmentsByPlacement', 'bidding.bidOptimizationStrategy', 'endDate',
+               'campaignId', 'productLocation', 'portfolioId', 'costType', 'smartDefault', 'name', 'state',
+               'startDate', 'budget', 'extendedData.servingStatus', 'extendedData.lastUpdateDate',
+               'extendedData.creationDate', 'extendedData.servingStatusDetails']
+        old = pd.DataFrame(data=[], columns=col)
+        tem = pd.concat([old, df]).reset_index()
+        tem.drop(columns='index', inplace=True)
+        tem.columns = [i.replace(".", "_") for i in tem.columns]
+        tem.rename(columns={
+            'name': 'campaignName',
+            'portfolioId': 'portfolio',
+            'ruleBasedBudget_isProcessing': 'rbb_isProcessing',
+            'ruleBasedBudget_applicableRuleName': 'rbb_appRuleName',
+            'ruleBasedBudget_value': 'rbb_value',
+            'ruleBasedBudget_applicableRuleId': 'rbb_appRuleId',
+            'bidding_bidOptimization': 'bidOptimization',
+            'bidding_bidAdjustmentsByShopperSegment': 'bidShopperSegment',
+            'bidding_bidAdjustmentsByPlacement': 'bidPlacement',
+            'bidding_bidOptimizationStrategy': 'bidOptimizationStrategy',
+            'extendedData_lastUpdateDate': 'lastUpdateDate',
+            'extendedData_servingStatus': 'servingStatus',
+            'extendedData_servingStatusDetails': 'servingStatusDetails',
+            'extendedData_creationDate': 'creationDate'}, inplace=True)
+        json_data = json.loads(tem.to_json(orient='records', force_ascii=False))
+        return json_data
+
+    def updata_create(self):
+        body = self.dataconvert()
+        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 = SpCampaign(profile_id="3006125408623189")
+    out = a.updata_create()
+    # out = a.dataconvert()
+    print(out)

+ 104 - 0
sync_amz_data/tasks/datainsert/mysql_datainsert_sdcampaign.py

@@ -0,0 +1,104 @@
+import requests
+from urllib.parse import urljoin
+from sync_amz_data.public.amz_ad_client import SDClient
+from sync_amz_data.settings import AWS_LWA_CLIENT
+import pandas as pd
+import json
+
+
+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()
+
+class SpCampaign:
+    def __init__(self, profile_id, portfolioId=None):
+        self.profile_id = profile_id
+        self.portfolioId = portfolioId
+        self.re_url_path = "api/ad_manage/profiles/"
+        self.upcreate_url_path = "api/sdcampaigns/list/"
+        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_sdcampaign_data(self):
+        tem = SDClient(**self.AWS_CREDENTIALS)
+        list_campaigns = tem.get_campaigns_extended()
+        df_campaigns = pd.json_normalize(list_campaigns)
+        return df_campaigns
+
+    def dataconvert(self):
+        df = self.get_sdcampaign_data()
+        df['profile_id'] = self.profile_id
+        df['creationDate'] = pd.to_datetime(df['creationDate'], unit='ms').dt.strftime('%Y-%m-%d %H:%M:%S')
+        df['lastUpdatedDate'] = pd.to_datetime(df['lastUpdatedDate'], unit='ms').dt.strftime('%Y-%m-%d %H:%M:%S')
+        df['portfolioId'] = df['portfolioId'].apply(lambda x: str(int(x)) if not pd.isna(x) else x)
+        df['startDate'] = pd.to_datetime(df['startDate'], format='%Y%m%d').dt.strftime('%Y-%m-%d')
+        if 'endDate' in df.columns:
+            df['endDate'] = pd.to_datetime(df['endDate'], format='%Y%m%d').dt.strftime('%Y-%m-%d')
+        col = ['campaignId', 'tactic', 'name', 'startDate', 'budget', 'budgetType',
+               'endDate', 'state', 'portfolioId', 'deliveryProfile', 'costType',
+               'creationDate', 'lastUpdatedDate', 'profile_id', 'servingStatus',
+               'ruleBasedBudget.isProcessing', 'ruleBasedBudget.applicableRuleName',
+               'ruleBasedBudget.value', 'ruleBasedBudget.applicableRuleId']
+        old = pd.DataFrame(data=[], columns=col)
+        tem = pd.concat([old, df]).reset_index()
+        tem.drop(columns='index', inplace=True)
+        tem.columns = [i.replace(".", "_") for i in tem.columns]
+        tem.rename(columns={
+            'name': 'campaignName',
+            'portfolioId': 'portfolio',
+            'ruleBasedBudget_isProcessing': 'rbb_isProcessing',
+            'ruleBasedBudget_applicableRuleName': 'rbb_appRuleName',
+            'ruleBasedBudget_value': 'rbb_value',
+            'ruleBasedBudget_applicableRuleId': 'rbb_appRuleId'}, inplace=True)
+        json_data = json.loads(tem.to_json(orient='records', force_ascii=False))
+        return json_data
+
+    def updata_create(self):
+        body = self.dataconvert()
+        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 = SpCampaign(profile_id="3006125408623189")
+    out = a.updata_create()
+    # out = a.dataconvert()
+    print(out)

+ 100 - 0
sync_amz_data/tasks/datainsert/mysql_datainsert_spads.py

@@ -0,0 +1,100 @@
+import requests
+from urllib.parse import urljoin
+from sync_amz_data.public.amz_ad_client import SPClient
+from sync_amz_data.settings import AWS_LWA_CLIENT
+import pandas as pd
+import json
+
+
+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()
+
+
+class SpCampaign:
+    def __init__(self, profile_id, campaignId: list = None):
+        self.profile_id = profile_id
+        self.portfolioId = campaignId
+        self.re_url_path = "api/ad_manage/profiles/"
+        self.upcreate_url_path = "api/spads/list/"
+        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_spads_data(self):
+        tem = SPClient(**self.AWS_CREDENTIALS)
+        list_ads = tem.iter_ads(**{"includeExtendedDataFields": True})
+        df_ads = pd.json_normalize(list(list_ads))
+        return df_ads
+
+    def dataconvert(self):
+        df = self.get_spads_data()
+        df['extendedData.creationDateTime'] = pd.to_datetime(df['extendedData.creationDateTime']).dt.strftime(
+            '%Y-%m-%d %H:%M:%S')
+        df['extendedData.lastUpdateDateTime'] = pd.to_datetime(df['extendedData.lastUpdateDateTime']).dt.strftime(
+            '%Y-%m-%d %H:%M:%S')
+        col = ['adId', 'campaignId', 'customText', 'asin', 'state', 'sku', 'adGroupId', 'extendedData.creationDateTime',
+               'extendedData.lastUpdateDateTime', 'extendedData.servingStatus', 'extendedData.servingStatusDetails']
+        old = pd.DataFrame(data=[], columns=col)
+        tem = pd.concat([old, df]).reset_index()
+        tem.drop(columns='index', inplace=True)
+        tem.columns = [i.replace(".", "_") for i in tem.columns]
+        tem.rename(columns={
+            'adGroupId': 'adGroup',
+            'campaignId': 'campaign',
+            'extendedData_creationDateTime': 'creationDateTime',
+            'extendedData_lastUpdateDateTime': 'lastUpdateDateTime',
+            'extendedData_servingStatus': 'servingStatus',
+            'extendedData_servingStatusDetails': 'servingStatusDetails'
+        }, inplace=True)
+        json_data = json.loads(tem.to_json(orient='records', force_ascii=False))
+        return json_data
+
+    def updata_create(self):
+        body = self.dataconvert()
+        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 = SpCampaign(profile_id="3006125408623189")
+    out = a.updata_create()
+    # out = a.dataconvert()
+    print(out)

+ 14 - 6
sync_amz_data/tasks/datainsert/mysql_datainsert_spcampaign.py

@@ -26,8 +26,9 @@ def request(url_path: str, method: str = "GET", head: dict = None, params: dict
         raise Exception(resp.text)
     return resp.json()
 
+
 class SpCampaign:
-    def __init__(self, profile_id, portfolioId=None):
+    def __init__(self, profile_id, portfolioId: list = None):
         self.profile_id = profile_id
         self.portfolioId = portfolioId
         self.re_url_path = "api/ad_manage/profiles/"
@@ -57,15 +58,22 @@ class SpCampaign:
 
     def get_spcampaign_data(self):
         tem = SPClient(**self.AWS_CREDENTIALS)
-        list_campaigns = tem.iter_campaigns(**{"includeExtendedDataFields": True})
-        df_campaigns = pd.json_normalize(list_campaigns)
+        if self.portfolioId is None:
+            list_campaigns = tem.iter_campaigns(**{"includeExtendedDataFields": True})
+        else:
+            list_campaigns = tem.iter_campaigns(**{"includeExtendedDataFields": True,
+                                                   "portfolioIdFilter": {"include": self.portfolioId}
+                                                   })
+        df_campaigns = pd.json_normalize(list(list_campaigns))
         return df_campaigns
 
     def dataconvert(self):
         df = self.get_spcampaign_data()
         df['profile_id'] = self.profile_id
-        df['extendedData.creationDateTime'] = pd.to_datetime(df['extendedData.creationDateTime']).dt.strftime('%Y-%m-%d %H:%M:%S')
-        df['extendedData.lastUpdateDateTime'] = pd.to_datetime(df['extendedData.lastUpdateDateTime']).dt.strftime('%Y-%m-%d %H:%M:%S')
+        df['extendedData.creationDateTime'] = pd.to_datetime(df['extendedData.creationDateTime']).dt.strftime(
+            '%Y-%m-%d %H:%M:%S')
+        df['extendedData.lastUpdateDateTime'] = pd.to_datetime(df['extendedData.lastUpdateDateTime']).dt.strftime(
+            '%Y-%m-%d %H:%M:%S')
         col = ['campaignId', 'endDate', 'name', 'startDate', 'state', 'targetingType',
                'budget.budget', 'budget.budgetType', 'budget.effectiveBudget',
                'dynamicBidding.placementBidding', 'extendedData.lastUpdateDateTime',
@@ -78,7 +86,7 @@ class SpCampaign:
         tem.columns = [i.replace(".", "_") for i in tem.columns]
         tem.rename(columns={
             'name': 'campaignName',
-            # 'portfolioId': 'portfolioId_id',
+            'portfolioId': 'portfolio',
             'dynamicBidding_placementBidding': 'dynBidPlacement',
             'dynamicBidding_strategy': 'dynBidStrategy',
             'budget_budgetType': 'budgetType',

+ 103 - 0
sync_amz_data/tasks/datainsert/mysql_datainsert_spgroup.py

@@ -0,0 +1,103 @@
+import requests
+from urllib.parse import urljoin
+from sync_amz_data.public.amz_ad_client import SPClient
+from sync_amz_data.settings import AWS_LWA_CLIENT
+import pandas as pd
+import json
+
+
+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()
+
+
+class SpCampaign:
+    def __init__(self, profile_id, campaignId: list = None):
+        self.profile_id = profile_id
+        self.portfolioId = campaignId
+        self.re_url_path = "api/ad_manage/profiles/"
+        self.upcreate_url_path = "api/spgroups/list/"
+        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_spgroup_data(self):
+        tem = SPClient(**self.AWS_CREDENTIALS)
+        list_group = tem.iter_adGroups(**{"includeExtendedDataFields": True})
+        df_group = pd.json_normalize(list(list_group))
+        return df_group
+    #----------------------------
+
+    def dataconvert(self):
+        df = self.get_spgroup_data()
+        df['extendedData.creationDateTime'] = pd.to_datetime(df['extendedData.creationDateTime']).dt.strftime(
+            '%Y-%m-%d %H:%M:%S')
+        df['extendedData.lastUpdateDateTime'] = pd.to_datetime(df['extendedData.lastUpdateDateTime']).dt.strftime(
+            '%Y-%m-%d %H:%M:%S')
+        col = ['adGroupId', 'campaignId', 'defaultBid', 'name', 'state', 'extendedData.creationDateTime',
+               'extendedData.lastUpdateDateTime', 'extendedData.servingStatus', 'extendedData.servingStatusDetails']
+        old = pd.DataFrame(data=[], columns=col)
+        tem = pd.concat([old, df]).reset_index()
+        tem.drop(columns='index', inplace=True)
+        tem.columns = [i.replace(".", "_") for i in tem.columns]
+        tem.rename(columns={
+            'name': 'adGroupName',
+            'campaignId': 'campaign',
+            'extendedData_creationDateTime': 'creationDateTime',
+            'extendedData_lastUpdateDateTime': 'lastUpdateDateTime',
+            'extendedData_servingStatus': 'servingStatus',
+            'extendedData_servingStatusDetails': 'servingStatusDetails'
+        }, inplace=True)
+        json_data = json.loads(tem.to_json(orient='records', force_ascii=False))
+        return json_data
+
+    def updata_create(self):
+        body = self.dataconvert()
+        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 = SpCampaign(profile_id="3006125408623189")
+    out = a.updata_create()
+    # out = a.dataconvert()
+    print(out)
+
+

+ 101 - 0
sync_amz_data/tasks/datainsert/mysql_datainsert_spkeyword.py

@@ -0,0 +1,101 @@
+import requests
+from urllib.parse import urljoin
+from sync_amz_data.public.amz_ad_client import SPClient
+from sync_amz_data.settings import AWS_LWA_CLIENT
+import pandas as pd
+import json
+
+
+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()
+
+
+class SpCampaign:
+    def __init__(self, profile_id, campaignId: list = None):
+        self.profile_id = profile_id
+        self.portfolioId = campaignId
+        self.re_url_path = "api/ad_manage/profiles/"
+        self.upcreate_url_path = "api/keywords/list/"
+        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_spkeywords_data(self):
+        tem = SPClient(**self.AWS_CREDENTIALS)
+        list_spkeywords = tem.iter_keywords(**{"includeExtendedDataFields": True})
+        df_spkeywords = pd.json_normalize(list(list_spkeywords))
+        return df_spkeywords
+
+    def dataconvert(self):
+        df = self.get_spkeywords_data()
+        df['extendedData.creationDateTime'] = pd.to_datetime(df['extendedData.creationDateTime']).dt.strftime(
+            '%Y-%m-%d %H:%M:%S')
+        df['extendedData.lastUpdateDateTime'] = pd.to_datetime(df['extendedData.lastUpdateDateTime']).dt.strftime(
+            '%Y-%m-%d %H:%M:%S')
+        col = ['keywordId', 'nativeLanguageKeyword', 'nativeLanguageLocale', 'campaignId', 'matchType', 'state', 'bid',
+               'adGroupId', 'keywordText', 'extendedData.creationDateTime',
+               'extendedData.lastUpdateDateTime', 'extendedData.servingStatus', 'extendedData.servingStatusDetails']
+        old = pd.DataFrame(data=[], columns=col)
+        tem = pd.concat([old, df]).reset_index()
+        tem.drop(columns='index', inplace=True)
+        tem.columns = [i.replace(".", "_") for i in tem.columns]
+        tem.rename(columns={
+            'adGroupId': 'adGroup',
+            'campaignId': 'campaign',
+            'extendedData_creationDateTime': 'creationDateTime',
+            'extendedData_lastUpdateDateTime': 'lastUpdateDateTime',
+            'extendedData_servingStatus': 'servingStatus',
+            'extendedData_servingStatusDetails': 'servingStatusDetails'
+        }, inplace=True)
+        json_data = json.loads(tem.to_json(orient='records', force_ascii=False))
+        return json_data
+
+    def updata_create(self):
+        body = self.dataconvert()
+        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 = SpCampaign(profile_id="3006125408623189")
+    out = a.updata_create()
+    # out = a.dataconvert()
+    print(out)