|
@@ -32,34 +32,41 @@ class AiStrategyRequestParse(tornado.web.RequestHandler):
|
|
# 1、新增广告组操作
|
|
# 1、新增广告组操作
|
|
try:
|
|
try:
|
|
if data["operation_type"] == 1:
|
|
if data["operation_type"] == 1:
|
|
- inst = ParseAddCampaignOrAddGroupRequest(data)
|
|
|
|
|
|
+ inst = ParseAddCampaignOrAddGroupRequest(data,self.logger)
|
|
inst.get_advertiser_strategy_info()
|
|
inst.get_advertiser_strategy_info()
|
|
inst.write_intelligence_strategy_table()
|
|
inst.write_intelligence_strategy_table()
|
|
if inst.campaign_id == "" or inst.campaign_id is None:
|
|
if inst.campaign_id == "" or inst.campaign_id is None:
|
|
if inst.add_campaign() == -1:
|
|
if inst.add_campaign() == -1:
|
|
- self.write(json.dumps({"message": "广告计划创建失败"}))
|
|
|
|
- self.flush()
|
|
|
|
- return
|
|
|
|
|
|
+ raise Exception('广告计划创建失败')
|
|
|
|
|
|
inst.get_group_dict()
|
|
inst.get_group_dict()
|
|
create_group_and_creative_res = inst.res_data
|
|
create_group_and_creative_res = inst.res_data
|
|
- print("create_group_and_creative_res: ", create_group_and_creative_res)
|
|
|
|
- request = requests.post(create_group_and_creative_url, create_group_and_creative_res)
|
|
|
|
|
|
+ inst.update_intelligence_strategy_table()
|
|
|
|
+ self.logger.info("create group and creative request info: %s" % create_group_and_creative_res)
|
|
|
|
+
|
|
|
|
+ request = requests.post(create_group_and_creative_url,
|
|
|
|
+ headers=headers,
|
|
|
|
+ data=json.JSONEncoder().encode(create_group_and_creative_res)
|
|
|
|
+ )
|
|
create_group_and_creative_response_data = simplejson.loads(request.text)
|
|
create_group_and_creative_response_data = simplejson.loads(request.text)
|
|
|
|
+ self.logger.info("请求返回:%s" % create_group_and_creative_response_data)
|
|
|
|
+ self.write(json.dumps({'account_id': inst.account_id, 'ai_strategy_id': inst.ai_strategy_uuid,
|
|
|
|
+ 'message': create_group_and_creative_response_data}))
|
|
|
|
+ self.flush()
|
|
|
|
+ else:
|
|
|
|
+ self.write(json.dumps({"message": "operation_type 不支持"}))
|
|
|
|
+ self.flush()
|
|
except Exception:
|
|
except Exception:
|
|
self.logger.error(traceback.format_exc())
|
|
self.logger.error(traceback.format_exc())
|
|
-
|
|
|
|
- # 返回接口结果
|
|
|
|
- self.write(json.dumps({'account_id': inst.account_id,'ai_strategy_id': inst.ai_strategy_uuid,
|
|
|
|
- 'message': create_group_and_creative_response_data}))
|
|
|
|
- self.flush()
|
|
|
|
-
|
|
|
|
|
|
+ self.write(json.dumps(traceback.format_exc()))
|
|
|
|
+ self.flush()
|
|
|
|
|
|
# 该类解析的是 手动请求的新增广告计划或者新增广告组的数据
|
|
# 该类解析的是 手动请求的新增广告计划或者新增广告组的数据
|
|
class ParseAddCampaignOrAddGroupRequest(object):
|
|
class ParseAddCampaignOrAddGroupRequest(object):
|
|
- def __init__(self, request_data):
|
|
|
|
|
|
+ def __init__(self, request_data, logger):
|
|
self.ai_strategy_uuid = str(uuid.uuid4())
|
|
self.ai_strategy_uuid = str(uuid.uuid4())
|
|
self.request_data = request_data
|
|
self.request_data = request_data
|
|
|
|
+ self.logger = logger
|
|
self.video = self.request_data['video']
|
|
self.video = self.request_data['video']
|
|
self.account_id = self.request_data['account_id']
|
|
self.account_id = self.request_data['account_id']
|
|
self.campaign_info = self.request_data['campaign_info']
|
|
self.campaign_info = self.request_data['campaign_info']
|
|
@@ -100,7 +107,7 @@ class ParseAddCampaignOrAddGroupRequest(object):
|
|
'ai_strategy_uuid': self.ai_strategy_uuid,
|
|
'ai_strategy_uuid': self.ai_strategy_uuid,
|
|
'advertiser_strategy_id': self.advertiser_strategy_id,
|
|
'advertiser_strategy_id': self.advertiser_strategy_id,
|
|
'account_id': self.account_id,
|
|
'account_id': self.account_id,
|
|
- 'ai_strategy_request_content': str(self.request_data),
|
|
|
|
|
|
+ 'ai_strategy_receive_content': str(self.request_data),
|
|
'ai_strategy_remark': self.request_data['ai_strategy_remark'],
|
|
'ai_strategy_remark': self.request_data['ai_strategy_remark'],
|
|
'create_time': datetime.datetime.now()
|
|
'create_time': datetime.datetime.now()
|
|
}
|
|
}
|
|
@@ -108,6 +115,24 @@ class ParseAddCampaignOrAddGroupRequest(object):
|
|
df = pd.DataFrame.from_dict(intelligence_strategy_dict, orient='index').T
|
|
df = pd.DataFrame.from_dict(intelligence_strategy_dict, orient='index').T
|
|
df.to_sql(name="ctop_ai_kuaishou_intelligence_strategy", con=engine, if_exists='append', index=False)
|
|
df.to_sql(name="ctop_ai_kuaishou_intelligence_strategy", con=engine, if_exists='append', index=False)
|
|
|
|
|
|
|
|
+ def update_intelligence_strategy_table(self):
|
|
|
|
+ """
|
|
|
|
+ 拼装之后的json, 更新到 ai_strategy_request_content
|
|
|
|
+ :return:
|
|
|
|
+ """
|
|
|
|
+ db_con = pymysql.connect(host=host,
|
|
|
|
+ port=port,
|
|
|
|
+ user=user,
|
|
|
|
+ password=passwd,
|
|
|
|
+ database=db,
|
|
|
|
+ charset=charset)
|
|
|
|
+ cursor = db_con.cursor()
|
|
|
|
+ cursor.execute("""UPDATE ctop_ai_kuaishou_intelligence_strategy
|
|
|
|
+ SET ai_strategy_request_content= %s
|
|
|
|
+ WHERE ai_strategy_uuid = %s""", (str(self.res_data), self.ai_strategy_uuid))
|
|
|
|
+ db_con.commit()
|
|
|
|
+ db_con.close()
|
|
|
|
+
|
|
# 如果手动请求的数据结构中,"campaign" 中的 campaign_id 为空则调用该新增计划方法
|
|
# 如果手动请求的数据结构中,"campaign" 中的 campaign_id 为空则调用该新增计划方法
|
|
def add_campaign(self):
|
|
def add_campaign(self):
|
|
"""
|
|
"""
|
|
@@ -121,23 +146,25 @@ class ParseAddCampaignOrAddGroupRequest(object):
|
|
self.campaign_info['campaign_type']))
|
|
self.campaign_info['campaign_type']))
|
|
return -1
|
|
return -1
|
|
|
|
|
|
- # TODO 待联调测试
|
|
|
|
- # create_campaign_req_data = {
|
|
|
|
- # 'account_id': self.account_id,
|
|
|
|
- # 'campaign_name': self.campaign_info['campaign_name'],
|
|
|
|
- # 'type': self.campaign_info['campaign_type']
|
|
|
|
- # }
|
|
|
|
- # request = requests.post(create_campaign_url, create_campaign_req_data)
|
|
|
|
- # res_data = simplejson.loads(request.text)
|
|
|
|
-
|
|
|
|
- res_data = {
|
|
|
|
- "code": 0,
|
|
|
|
- "data": {
|
|
|
|
- "account_id": 23212,
|
|
|
|
- "campaign_id": 30956133,
|
|
|
|
- "campaign_create_time": "2021-01-13 13:50:16"
|
|
|
|
- },
|
|
|
|
- "message": "SUCCESS"}
|
|
|
|
|
|
+ create_campaign_req_data = {
|
|
|
|
+ 'account_id': self.account_id,
|
|
|
|
+ 'campaign_name': self.campaign_info['campaign_name'],
|
|
|
|
+ 'type': self.campaign_info['campaign_type']
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ request = requests.post(url=create_campaign_url,
|
|
|
|
+ headers=headers,
|
|
|
|
+ data=json.JSONEncoder().encode(create_campaign_req_data))
|
|
|
|
+ res_data = simplejson.loads(request.text)
|
|
|
|
+
|
|
|
|
+ # res_data = {
|
|
|
|
+ # "code": 0,
|
|
|
|
+ # "data": {
|
|
|
|
+ # "account_id": 23212,
|
|
|
|
+ # "campaign_id": 30956133,
|
|
|
|
+ # "campaign_create_time": "2021-01-13 13:50:16"
|
|
|
|
+ # },
|
|
|
|
+ # "message": "SUCCESS"}
|
|
if res_data['code'] == 0:
|
|
if res_data['code'] == 0:
|
|
self.campaign_id = res_data['data']['campaign_id']
|
|
self.campaign_id = res_data['data']['campaign_id']
|
|
campaign_info_to_db = {
|
|
campaign_info_to_db = {
|
|
@@ -189,68 +216,25 @@ class ParseAddCampaignOrAddGroupRequest(object):
|
|
# (self.group_info.get(col) > self.advertiser_strategy[col]):
|
|
# (self.group_info.get(col) > self.advertiser_strategy[col]):
|
|
# return -1
|
|
# return -1
|
|
|
|
|
|
- basic_group_info = {'template_id': self.advertiser_strategy['template_id'],
|
|
|
|
- 'bid_type': self.advertiser_strategy['bid_type'],
|
|
|
|
- 'use_app_market': self.advertiser_strategy['use_app_market'],
|
|
|
|
- 'app_store': self.advertiser_strategy['app_store'],
|
|
|
|
- 'bid': self.advertiser_strategy['bid'],
|
|
|
|
- 'cpa_bid': self.advertiser_strategy['cpa_bid'],
|
|
|
|
- 'smart_bid': self.advertiser_strategy['smart_bid'],
|
|
|
|
- 'ocpx_action_type': self.advertiser_strategy['ocpx_action_type'],
|
|
|
|
- 'deep_conversion_type': self.advertiser_strategy['deep_conversion_type'],
|
|
|
|
- 'roi_ratio': self.advertiser_strategy['roi_ratio'],
|
|
|
|
- 'scene_id': self.advertiser_strategy['scene_id'],
|
|
|
|
- 'unit_type': self.advertiser_strategy['unit_type'],
|
|
|
|
- 'begin_time': self.advertiser_strategy['begin_time'],
|
|
|
|
- 'end_time': self.advertiser_strategy['end_time'],
|
|
|
|
- 'schedule_time': self.advertiser_strategy['schedule_time'],
|
|
|
|
- 'convert_id': self.advertiser_strategy['convert_id'],
|
|
|
|
- 'url_type': self.advertiser_strategy['url_type'],
|
|
|
|
- 'web_uri_type': self.advertiser_strategy['web_uri_type'],
|
|
|
|
- 'url': self.advertiser_strategy['url'],
|
|
|
|
- 'schema_uri': self.advertiser_strategy['schema_uri'],
|
|
|
|
- 'app_id': self.advertiser_strategy['app_id'],
|
|
|
|
- 'show_mode': self.advertiser_strategy['show_mode'],
|
|
|
|
- 'speed': self.advertiser_strategy['speed'],
|
|
|
|
- 'site_type': self.advertiser_strategy['site_type'],
|
|
|
|
- 'gift_data': self.advertiser_strategy['gift_data'],
|
|
|
|
- 'video_landing_page': self.advertiser_strategy['video_landing_page'],
|
|
|
|
- 'auto_target': self.advertiser_strategy['auto_target'],
|
|
|
|
- 'auto_create_photo': self.advertiser_strategy['auto_create_photo'],
|
|
|
|
- 'region': self.advertiser_strategy['region'],
|
|
|
|
- 'district_ids': self.advertiser_strategy['district_ids'],
|
|
|
|
- 'user_type': self.advertiser_strategy['user_type'],
|
|
|
|
- 'age_min': self.advertiser_strategy['age_min'],
|
|
|
|
- 'age_max': self.advertiser_strategy['age_max'],
|
|
|
|
- 'ages_range': self.advertiser_strategy['ages_range'],
|
|
|
|
- 'gender': self.advertiser_strategy['gender'],
|
|
|
|
- 'platform_os': self.advertiser_strategy['platform_os'],
|
|
|
|
- 'android_osv': self.advertiser_strategy['android_osv'],
|
|
|
|
- 'ios_osv': self.advertiser_strategy['ios_osv'],
|
|
|
|
- 'network': self.advertiser_strategy['network'],
|
|
|
|
- 'device_brand': self.advertiser_strategy['device_brand'],
|
|
|
|
- 'device_price': self.advertiser_strategy['device_price'],
|
|
|
|
- 'business_interest_type': self.advertiser_strategy['business_interest_type'],
|
|
|
|
- 'business_interest': self.advertiser_strategy['business_interest'],
|
|
|
|
- 'fans_star': self.advertiser_strategy['fans_star'],
|
|
|
|
- 'interest_video': self.advertiser_strategy['interest_video'],
|
|
|
|
- 'app_interest': self.advertiser_strategy['app_interest'],
|
|
|
|
- 'app_ids': self.advertiser_strategy['app_ids'],
|
|
|
|
- 'filter_converted_level': self.advertiser_strategy['filter_converted_level'],
|
|
|
|
- 'population': self.advertiser_strategy['population'],
|
|
|
|
- 'exclude_population': self.advertiser_strategy['exclude_population'],
|
|
|
|
- 'paid_audience': self.advertiser_strategy['paid_audience'],
|
|
|
|
- 'is_open': self.advertiser_strategy['is_open'],
|
|
|
|
- 'no_age_break': self.advertiser_strategy['no_age_break'],
|
|
|
|
- 'no_gender_break': self.advertiser_strategy['no_gender_break'],
|
|
|
|
- 'no_area_break': self.advertiser_strategy['no_area_break'],
|
|
|
|
- 'behavior_interest': self.advertiser_strategy['behavior_interest']}
|
|
|
|
|
|
+ drop_cols = ['id', 'account_id', 'status', 'campaign_type',
|
|
|
|
+ 'site_id', 'click_track_url', 'impression_url', 'ad_photo_played_t3s_url',
|
|
|
|
+ 'actionbar_click_url',
|
|
|
|
+ 'create_time', 'effective_time', 'expiry_time']
|
|
|
|
+ cols_to_list = ['app_store', 'scene_id', 'region', 'district_ids', 'ages_range', 'device_brand',
|
|
|
|
+ 'device_price', 'business_interest', 'fans_star', 'interest_video', 'app_interest',
|
|
|
|
+ 'app_ids', 'population', 'exclude_population', 'paid_audience', 'behavior_interest']
|
|
|
|
+
|
|
|
|
+ basic_group_info = self.advertiser_strategy.copy()
|
|
|
|
+ for col in drop_cols:
|
|
|
|
+ del basic_group_info[col]
|
|
|
|
+
|
|
|
|
|
|
# 3、从请求的信息中更新计划层级信息
|
|
# 3、从请求的信息中更新计划层级信息
|
|
if len(self.group_info) > 0:
|
|
if len(self.group_info) > 0:
|
|
for key, value in self.group_info.items():
|
|
for key, value in self.group_info.items():
|
|
basic_group_info.update({key: value})
|
|
basic_group_info.update({key: value})
|
|
|
|
|
|
|
|
+
|
|
self.res_data['group_list'] = []
|
|
self.res_data['group_list'] = []
|
|
group_cnt = 1
|
|
group_cnt = 1
|
|
for video in self.video:
|
|
for video in self.video:
|
|
@@ -272,6 +256,10 @@ class ParseAddCampaignOrAddGroupRequest(object):
|
|
if_exists='append',
|
|
if_exists='append',
|
|
index=False)
|
|
index=False)
|
|
|
|
|
|
|
|
+ # 发送的请求,这几个字段需要转为 [] 数组
|
|
|
|
+ for col in cols_to_list:
|
|
|
|
+ single_group_info[col] = eval(single_group_info[col]) if single_group_info[col] is not None else None
|
|
|
|
+
|
|
single_group_info['creative_list'] = []
|
|
single_group_info['creative_list'] = []
|
|
group_cnt += 1
|
|
group_cnt += 1
|
|
|
|
|
|
@@ -308,6 +296,13 @@ class ParseAddCampaignOrAddGroupRequest(object):
|
|
single_creative_info_to_db['campaign_id'] = self.campaign_id
|
|
single_creative_info_to_db['campaign_id'] = self.campaign_id
|
|
single_creative_info_to_db['create_time'] = datetime.datetime.now()
|
|
single_creative_info_to_db['create_time'] = datetime.datetime.now()
|
|
single_creative_info_to_db['operation_type'] = self.operation_type
|
|
single_creative_info_to_db['operation_type'] = self.operation_type
|
|
|
|
+
|
|
|
|
+ cols_to_str = ['creative_tag']
|
|
|
|
+ for col in cols_to_str:
|
|
|
|
+ single_creative_info_to_db[col] = str(single_creative_info_to_db[col]) \
|
|
|
|
+ if single_creative_info_to_db[col] is not None else None
|
|
|
|
+
|
|
|
|
+
|
|
df = pd.DataFrame.from_dict(single_creative_info_to_db, orient='index').T
|
|
df = pd.DataFrame.from_dict(single_creative_info_to_db, orient='index').T
|
|
engine = create_engine(db_con_str, connect_args={'charset': 'utf8'})
|
|
engine = create_engine(db_con_str, connect_args={'charset': 'utf8'})
|
|
df.to_sql(name="ctop_ai_kuaishou_creative_level_operation_record",
|
|
df.to_sql(name="ctop_ai_kuaishou_creative_level_operation_record",
|