|  | @@ -0,0 +1,109 @@
 | 
	
		
			
				|  |  | +import requests
 | 
	
		
			
				|  |  | +from urllib.parse import urljoin
 | 
	
		
			
				|  |  | +from sync_amz_data.public.amz_ad_client import BaseClient
 | 
	
		
			
				|  |  | +from sync_amz_data.settings import AWS_LWA_CLIENT
 | 
	
		
			
				|  |  | +import pandas as pd
 | 
	
		
			
				|  |  | +import json
 | 
	
		
			
				|  |  | +from sync_amz_data.tasks.datainsert.wg import LADS
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +class Client(BaseClient):
 | 
	
		
			
				|  |  | +    def assets_search(self, **body):
 | 
	
		
			
				|  |  | +        url_path = "/assets/search"
 | 
	
		
			
				|  |  | +        headers = {
 | 
	
		
			
				|  |  | +            "Accept": "application/vnd.creativeassetsgetresponse.v3+json",
 | 
	
		
			
				|  |  | +            "Content-Type": "application/vnd.creativeassetsgetresponse.v3+json"
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        return self._request(url_path, method="POST", headers=headers, body=body)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +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, AD = LADS):
 | 
	
		
			
				|  |  | +    ADS = AD
 | 
	
		
			
				|  |  | +    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 Assets:
 | 
	
		
			
				|  |  | +    def __init__(self, profile_id):
 | 
	
		
			
				|  |  | +        self.profile_id = profile_id
 | 
	
		
			
				|  |  | +        self.re_url_path = "api/ad_manage/profiles/"
 | 
	
		
			
				|  |  | +        self.upcreate_url_path = "api/ad_manage/sb/assets/p/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_assets_data(self):
 | 
	
		
			
				|  |  | +        tem = Client(**self.AWS_CREDENTIALS)
 | 
	
		
			
				|  |  | +        tokentext = ""
 | 
	
		
			
				|  |  | +        assetList = []
 | 
	
		
			
				|  |  | +        while tokentext != None:
 | 
	
		
			
				|  |  | +            body = {
 | 
	
		
			
				|  |  | +                    "pageCriteria": {
 | 
	
		
			
				|  |  | +                        "identifier": {
 | 
	
		
			
				|  |  | +                            "token": tokentext
 | 
	
		
			
				|  |  | +                            },
 | 
	
		
			
				|  |  | +                        "size": 500
 | 
	
		
			
				|  |  | +                        }
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +            list_assets = tem.assets_search(**body)
 | 
	
		
			
				|  |  | +            tokentext = list_assets.get('token', None)
 | 
	
		
			
				|  |  | +            assetList.extend(list_assets.get('assetList', []))
 | 
	
		
			
				|  |  | +        df_assets = pd.DataFrame(assetList)
 | 
	
		
			
				|  |  | +        df_assets['profile_id'] = self.profile_id
 | 
	
		
			
				|  |  | +        return df_assets
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def dataconvert(self):
 | 
	
		
			
				|  |  | +        df = self.get_assets_data()
 | 
	
		
			
				|  |  | +        df['creationTime'] = pd.to_datetime(df['creationTime'], unit='ms').dt.strftime('%Y-%m-%d')
 | 
	
		
			
				|  |  | +        df['lastUpdatedTime'] = pd.to_datetime(df['lastUpdatedTime'], unit='ms').dt.strftime('%Y-%m-%d')
 | 
	
		
			
				|  |  | +        df['assetSubTypeList'] = df['assetSubTypeList'].astype(str)
 | 
	
		
			
				|  |  | +        json_data = json.loads(df.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 = Assets(profile_id="3006125408623189")
 | 
	
		
			
				|  |  | +    # out = a.dataconvert()
 | 
	
		
			
				|  |  | +    out = a.updata_create()
 | 
	
		
			
				|  |  | +    print(out)
 |