|
@@ -460,34 +460,30 @@ class AiHighQualityMaterial(tornado.web.RequestHandler):
|
|
self.flush()
|
|
self.flush()
|
|
|
|
|
|
|
|
|
|
-class AiCheckAndUpTOFullCreative(tornado.web.RequestHandler):
|
|
|
|
|
|
+class AiUpCreativeByHour(tornado.web.RequestHandler):
|
|
"""
|
|
"""
|
|
- 每天22:00 调用该任务,检查当天创意是否创建达到上限,否则使用历史高质量素材填满
|
|
|
|
|
|
+ 1点到20点,每小时执行一次,检查当前时点创意个数是否达到hour*100
|
|
|
|
+ 没有达到则按照当前时点值,补充不同类型的视频
|
|
"""
|
|
"""
|
|
|
|
|
|
def post(self):
|
|
def post(self):
|
|
data = self.request.body
|
|
data = self.request.body
|
|
data = str(data, 'utf8')
|
|
data = str(data, 'utf8')
|
|
data = json.loads(data, encoding='utf8')
|
|
data = json.loads(data, encoding='utf8')
|
|
- logger.info("*************************************** NEW REQUEST ***************************************")
|
|
|
|
account_id = data.get('account_id')
|
|
account_id = data.get('account_id')
|
|
campaign_id = data.get('campaign_id')
|
|
campaign_id = data.get('campaign_id')
|
|
|
|
|
|
logger.info("账户信息=%s, 当前进程=%s, 当前进程的主进程=%s, raw data from request is %s" %
|
|
logger.info("账户信息=%s, 当前进程=%s, 当前进程的主进程=%s, raw data from request is %s" %
|
|
(account_id, os.getpid(), os.getppid(), data))
|
|
(account_id, os.getpid(), os.getppid(), data))
|
|
-
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-
|
|
|
|
try:
|
|
try:
|
|
- # 1-1 从客户策略表中获取该账户下 每个素材搭配的封面个数, 来计算需要补充的素材个数
|
|
|
|
|
|
+ # 1 从客户策略表中获取该账户下 每个素材搭配的封面个数, 来计算需要补充的素材个数
|
|
sql = """select image_cnt from ctop_ai_kuaishou_advertiser_strategy
|
|
sql = """select image_cnt from ctop_ai_kuaishou_advertiser_strategy
|
|
where account_id = %s
|
|
where account_id = %s
|
|
limit 1""" % account_id
|
|
limit 1""" % account_id
|
|
df = pd.read_sql(sql, engine)
|
|
df = pd.read_sql(sql, engine)
|
|
image_cnt = int(df['image_cnt'].values[0])
|
|
image_cnt = int(df['image_cnt'].values[0])
|
|
|
|
|
|
- # 1-2、获取从0点到now()为止,该账户下已有的创意个数 M
|
|
|
|
|
|
+ # 2、获取从0点到now()为止,该账户下已有的创意个数 M
|
|
sql = """select count(1) creative_cnt from ctop_kuaishou_creative
|
|
sql = """select count(1) creative_cnt from ctop_kuaishou_creative
|
|
where account_id = %s
|
|
where account_id = %s
|
|
and creative_id is not NULL
|
|
and creative_id is not NULL
|
|
@@ -501,235 +497,53 @@ class AiCheckAndUpTOFullCreative(tornado.web.RequestHandler):
|
|
now_hour = datetime.datetime.now().hour
|
|
now_hour = datetime.datetime.now().hour
|
|
now = datetime.datetime.now()
|
|
now = datetime.datetime.now()
|
|
should_creative_cnt = now_hour * 100
|
|
should_creative_cnt = now_hour * 100
|
|
|
|
+ # 3、计算需要补充的创意个数和视频个数,并按当前小时值,补充不同类似的视频
|
|
if exist_creative_cnt < should_creative_cnt:
|
|
if exist_creative_cnt < should_creative_cnt:
|
|
need_video_cnt = (should_creative_cnt - exist_creative_cnt) // image_cnt
|
|
need_video_cnt = (should_creative_cnt - exist_creative_cnt) // image_cnt
|
|
logger.info("account_id = %s, 按小时需要补充的视频数量 = %s" % (account_id, need_video_cnt))
|
|
logger.info("account_id = %s, 按小时需要补充的视频数量 = %s" % (account_id, need_video_cnt))
|
|
if now_hour % 5 == 0:
|
|
if now_hour % 5 == 0:
|
|
|
|
+ # campaign_group_name_place 用于广告计划和广告组名称的标识
|
|
|
|
+ campaign_group_name_place = "高质量素材"
|
|
video_list = get_top_video_info(account_id=account_id,
|
|
video_list = get_top_video_info(account_id=account_id,
|
|
url=get_high_quality_video_url,
|
|
url=get_high_quality_video_url,
|
|
- start_time=(now + datetime.timedelta(days=-2 * high_quality_video_days)).
|
|
|
|
|
|
+ start_time=(now + datetime.timedelta(days=-high_quality_video_days)).
|
|
strftime("%Y-%m-%d %H:%M:%S"),
|
|
strftime("%Y-%m-%d %H:%M:%S"),
|
|
- end_time=(now + datetime.timedelta(days=-high_quality_video_days)).
|
|
|
|
|
|
+ end_time=(now + datetime.timedelta(days=-1)).
|
|
strftime("%Y-%m-%d %H:%M:%S"),
|
|
strftime("%Y-%m-%d %H:%M:%S"),
|
|
cnt=need_video_cnt,
|
|
cnt=need_video_cnt,
|
|
app_version=None)
|
|
app_version=None)
|
|
- else:
|
|
|
|
|
|
+ elif (now_hour % 5 == 1) or (now_hour % 5 == 2):
|
|
|
|
+ campaign_group_name_place = "历史素材打捞"
|
|
video_list = get_history_video_info(account_id=account_id,
|
|
video_list = get_history_video_info(account_id=account_id,
|
|
url=get_history_video_url,
|
|
url=get_history_video_url,
|
|
start_time=history_video_start_time,
|
|
start_time=history_video_start_time,
|
|
end_time=history_video_end_time,
|
|
end_time=history_video_end_time,
|
|
video_cnt=need_video_cnt,
|
|
video_cnt=need_video_cnt,
|
|
related_creative_max_cnt=related_creative_max_cnt)
|
|
related_creative_max_cnt=related_creative_max_cnt)
|
|
- # 根据获取到的视频进行创建
|
|
|
|
- sql = """select account_id, single_appid, app_id_array, general_track from ctop_ai_kuaishou_advertiser_strategy
|
|
|
|
- where account_id=%s order by create_time desc limit 1""" % account_id
|
|
|
|
- df = pd.read_sql(sql, engine)
|
|
|
|
- if df['general_track'].values[0] == 0:
|
|
|
|
- app_id_array = eval(df['app_id_array'].values[0])
|
|
|
|
- app_list = get_app_list(account_id=account_id, url=get_app_list_url)
|
|
|
|
- # app_dict key = ("appVersion": "ksjyrlyn-人类一脑涂地大败") , value = 完整的app_id信息
|
|
|
|
- app_dict = {}
|
|
|
|
- for app_info in app_list['data']:
|
|
|
|
- if app_info['appId'] in app_id_array:
|
|
|
|
- app_dict[app_info['appVersion']] = app_info
|
|
|
|
- # 单独处理返回的时候中,有通用视频,需要单独处理
|
|
|
|
- # "photo_name": "all",
|
|
|
|
- # "photo_name": "ksjytdrca-糖豆人冲啊",
|
|
|
|
- if video_list['code'] == 0:
|
|
|
|
- video_df = pd.DataFrame(video_list['data'])
|
|
|
|
- # 1-特定视频的创建
|
|
|
|
- special_video_df = video_df[video_df.photo_name != 'all']
|
|
|
|
- for photo_name in special_video_df['photo_name'].unique():
|
|
|
|
- if photo_name in app_dict.keys():
|
|
|
|
- campaign_id = None
|
|
|
|
- app_id = app_dict[photo_name].get('appId', 'error')
|
|
|
|
- app_version = app_dict[photo_name].get('appVersion', 'error')
|
|
|
|
- track_url = app_dict[photo_name].get('trackUrl', 'error')
|
|
|
|
- sql = """ select campaign_id, campaign_name from ctop_kuaishou_campaign where account_id = %s """ % account_id
|
|
|
|
- campaign_df = pd.read_sql(sql, engine)
|
|
|
|
- for row in campaign_df.itertuples():
|
|
|
|
- if (app_version + '--优选广告位-' + '高质量素材') == getattr(row, 'campaign_name'):
|
|
|
|
- campaign_id = getattr(row, 'campaign_id')
|
|
|
|
- break
|
|
|
|
- app_id_video_df = special_video_df[special_video_df.photo_name == photo_name]
|
|
|
|
- app_id_video_list = []
|
|
|
|
- for k, v in app_id_video_df.T.to_dict().items():
|
|
|
|
- app_id_video_list.append(v)
|
|
|
|
- request_data = get_request_data(account_id=account_id,
|
|
|
|
- campaign_id=campaign_id,
|
|
|
|
- video_info=app_id_video_list,
|
|
|
|
- campaign_name=app_version + '--优选广告位-' + '高质量素材',
|
|
|
|
- group_name=app_version + '-优选广告位-不限-自定义-' + '高质量素材',
|
|
|
|
- ai_strategy_remark="按小时补满创意",
|
|
|
|
- unit_type=4,
|
|
|
|
- app_id=app_id,
|
|
|
|
- click_track_url=track_url)
|
|
|
|
- request = ai_strategy_request_parse(request_data)
|
|
|
|
- logger.info("account_id=%s, app_id=%s, 用高质量素材补满创意-特定视频,ai策略的返回信息:%s" %
|
|
|
|
- (account_id, app_id, request))
|
|
|
|
-
|
|
|
|
- # 2-通用视频的创建,random.shuffle 选择 app_id
|
|
|
|
- general_video_df = video_df[video_df.photo_name == 'all']
|
|
|
|
- if not general_video_df.empty:
|
|
|
|
- general_video_cnt = len(general_video_df)
|
|
|
|
- app_version_list = list(app_dict)
|
|
|
|
- random.shuffle(app_version_list)
|
|
|
|
- video_cnt = 0
|
|
|
|
- for app_version in app_version_list[:general_video_cnt]:
|
|
|
|
- campaign_id = None
|
|
|
|
- app_id = app_dict[app_version].get('appId', 'error')
|
|
|
|
- track_url = app_dict[app_version].get('trackUrl', 'error')
|
|
|
|
- sql = """ select campaign_id, campaign_name from ctop_kuaishou_campaign where account_id = %s """ % account_id
|
|
|
|
- campaign_df = pd.read_sql(sql, engine)
|
|
|
|
- for row in campaign_df.itertuples():
|
|
|
|
- if (app_version + '--优选广告位-' + '高质量素材') == getattr(row, 'campaign_name'):
|
|
|
|
- campaign_id = getattr(row, 'campaign_id')
|
|
|
|
- break
|
|
|
|
- single_video = [general_video_df.iloc[video_cnt, :].T.to_dict()]
|
|
|
|
- request_data = get_request_data(account_id=account_id,
|
|
|
|
- campaign_id=campaign_id,
|
|
|
|
- video_info=single_video,
|
|
|
|
- campaign_name=app_version + '--优选广告位-' + '高质量素材',
|
|
|
|
- group_name=app_version + '-优选广告位-不限-自定义-' + '高质量素材',
|
|
|
|
- ai_strategy_remark="用高质量素材补满创意",
|
|
|
|
- unit_type=4,
|
|
|
|
- app_id=app_id,
|
|
|
|
- click_track_url=track_url)
|
|
|
|
- request = ai_strategy_request_parse(request_data)
|
|
|
|
- video_cnt += 1
|
|
|
|
- logger.info("account_id=%s, app_id=%s, 用高质量素材补满创意-通用视频,ai策略的返回信息:%s" % (account_id, app_id, request))
|
|
|
|
- else:
|
|
|
|
- logger.info("account_id=%s, 用高质量素材补满创意: 返回的视频中没有通用视频" % account_id)
|
|
|
|
- self.write(json.dumps({"message": "account_id=%s, 用高质量素材补满创意请求已走完!" % account_id}))
|
|
|
|
- self.flush()
|
|
|
|
- else:
|
|
|
|
- logger.info("account_id=%s, 按小时补满创意: 没有成功获取到视频!" % account_id)
|
|
|
|
- self.write(json.dumps({"message": "account_id=%s, 按小时补满创意: 没有成功获取到视频!" % account_id}))
|
|
|
|
- self.flush()
|
|
|
|
else:
|
|
else:
|
|
- # 1-1 获取当天计划中包含“高质量素材”计划的,计划id
|
|
|
|
- sql = """
|
|
|
|
- select campaign_id, campaign_name from ctop_kuaishou_campaign
|
|
|
|
- where account_id = %s
|
|
|
|
- and put_create_time >= '%s'
|
|
|
|
- and put_create_time <= '%s'
|
|
|
|
- """ % (account_id, start_time, end_time)
|
|
|
|
|
|
+ campaign_group_name_place = "遗漏素材"
|
|
|
|
+ video_list = get_missing_video_info(account_id=account_id,
|
|
|
|
+ cnt=need_video_cnt,
|
|
|
|
+ url=get_missing_video_url,
|
|
|
|
+ start_time=missing_video_start_time,
|
|
|
|
+ end_time=missing_video_end_time)
|
|
|
|
+
|
|
|
|
+ if video_list['code'] == 0:
|
|
|
|
+ # 根据获取到的视频进行创建
|
|
|
|
+ sql = """select account_id, single_appid, app_id_array, general_track from ctop_ai_kuaishou_advertiser_strategy
|
|
|
|
+ where account_id=%s order by create_time desc limit 1""" % account_id
|
|
df = pd.read_sql(sql, engine)
|
|
df = pd.read_sql(sql, engine)
|
|
- for row in df.itertuples():
|
|
|
|
- if '高质量素材' in getattr(row, 'campaign_name'):
|
|
|
|
- campaign_id = getattr(row, 'campaign_id')
|
|
|
|
- break
|
|
|
|
-
|
|
|
|
- video_info = get_top_video_info(account_id=account_id,
|
|
|
|
- cnt=video_cnt,
|
|
|
|
- start_time=(now + datetime.timedelta(days=-2 * high_quality_video_days)).
|
|
|
|
- strftime("%Y-%m-%d %H:%M:%S"),
|
|
|
|
- end_time=(now + datetime.timedelta(days=-high_quality_video_days)).
|
|
|
|
- strftime("%Y-%m-%d %H:%M:%S"),
|
|
|
|
- url=get_high_quality_video_url)
|
|
|
|
- if video_info['code'] != 0:
|
|
|
|
- logger.info("account_id = %s, 历史高质量素材填满, 没有获取到视频,不发送ai策略请求!" % account_id)
|
|
|
|
- self.write(json.dumps({"account_id": account_id,
|
|
|
|
- "message": "历史高质量素材填满, 没有获取到视频,不发送ai策略请求!"}))
|
|
|
|
- self.flush()
|
|
|
|
- else:
|
|
|
|
- campaign_name, group_name = get_campaign_and_group_name_rule(account_id)
|
|
|
|
- if (campaign_name is None) or (group_name is None):
|
|
|
|
- logger.info("account_id = %s, 没有获取到广告计划命名规则 或 广告组命名规则,不发送ai策略请求!" % account_id)
|
|
|
|
- self.write(json.dumps({"account_id": account_id,
|
|
|
|
- "message": "没有获取到广告计划命名规则 或 广告组命名规则,不发送ai策略请求!"}))
|
|
|
|
- self.flush()
|
|
|
|
- else:
|
|
|
|
- request_data = get_request_data(account_id=account_id,
|
|
|
|
- campaign_id=campaign_id,
|
|
|
|
- video_info=video_info['data'],
|
|
|
|
- campaign_name=campaign_name,
|
|
|
|
- group_name=group_name,
|
|
|
|
- ai_strategy_remark="用高质量素材补满创意",
|
|
|
|
- name_replace="高质量素材")
|
|
|
|
- request = ai_strategy_request_parse(request_data)
|
|
|
|
- logger.info("account_id = %s, 用高质量素材补满创意,ai策略的返回信息:%s" % (account_id, request))
|
|
|
|
- self.write(json.dumps(request))
|
|
|
|
- self.flush()
|
|
|
|
-
|
|
|
|
- else:
|
|
|
|
- logger.info("account_id = %s, 创意已经建满,不需要补充素材!" % account_id)
|
|
|
|
- self.write(json.dumps({"account_id": account_id, "message": "创意已经建满,不需要补充素材!"}))
|
|
|
|
- self.flush()
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-
|
|
|
|
- # 2、如果创意个数M 小于 hour()*100, 则使用 (hour()*100 - M)// image_cnt 个视频
|
|
|
|
-
|
|
|
|
- # 2、datetime.datetime.now().hour % 5, 如果不等于0, 则使用创意关联数少的视频,否则使用历史跑量视频
|
|
|
|
-
|
|
|
|
-
|
|
|
|
- start_time = (datetime.date.today()).strftime('%Y-%m-%d %H:%M:%S')
|
|
|
|
- end_time = (datetime.datetime.now()).strftime('%Y-%m-%d %H:%M:%S')
|
|
|
|
- now = datetime.datetime.now()
|
|
|
|
-
|
|
|
|
- # 1-1 从客户策略表中获取该账户下 每个素材搭配的封面个数, 来计算需要补充的素材个数
|
|
|
|
- sql = """
|
|
|
|
- select image_cnt from ctop_ai_kuaishou_advertiser_strategy
|
|
|
|
- where account_id = %s
|
|
|
|
- limit 1
|
|
|
|
- """ % account_id
|
|
|
|
- df = pd.read_sql(sql, engine)
|
|
|
|
- image_cnt = int(df['image_cnt'].values[0])
|
|
|
|
-
|
|
|
|
- # 2-1 从 ctop_kuaishou_creative 获取当天该账户到此刻 已经创建的创意个数
|
|
|
|
- video_cnt = 0
|
|
|
|
- sql = """
|
|
|
|
- select count(1) creative_cnt from ctop_kuaishou_creative
|
|
|
|
- where account_id = %s
|
|
|
|
- and creative_id is not NULL
|
|
|
|
- and creative_create_time <= '%s'
|
|
|
|
- and creative_create_time >= '%s'
|
|
|
|
- """ % (account_id, end_time, start_time)
|
|
|
|
- df = pd.read_sql(sql, engine)
|
|
|
|
- creative_cnt = int(df['creative_cnt'].values[0])
|
|
|
|
- if creative_cnt >= 2000:
|
|
|
|
- video_cnt = 0
|
|
|
|
- else:
|
|
|
|
- video_cnt = (2000 - creative_cnt) // image_cnt
|
|
|
|
-
|
|
|
|
- # 3-1 获取视频信息
|
|
|
|
- if video_cnt == 0:
|
|
|
|
- logger.info("account_id = %s, 创意已经建满,不需要补充素材!" % account_id)
|
|
|
|
- self.write(json.dumps({"account_id": account_id, "message": "创意已经建满,不需要补充素材!"}))
|
|
|
|
- self.flush()
|
|
|
|
- else:
|
|
|
|
- logger.info("account_id = %s, 需要补充的视频数量 = %s" % (account_id, video_cnt))
|
|
|
|
-
|
|
|
|
- sql = """select account_id, single_appid, app_id_array, general_track from ctop_ai_kuaishou_advertiser_strategy
|
|
|
|
- where account_id=%s order by create_time desc limit 1
|
|
|
|
- """ % account_id
|
|
|
|
- df = pd.read_sql(sql, engine)
|
|
|
|
- if df['general_track'].values[0] == 0:
|
|
|
|
- app_id_array = eval(df['app_id_array'].values[0])
|
|
|
|
- app_list = get_app_list(account_id=account_id, url=get_app_list_url)
|
|
|
|
- # app_dict key = ("appVersion": "ksjyrlyn-人类一脑涂地大败") , value = 完整的app_id信息
|
|
|
|
- app_dict = {}
|
|
|
|
- for app_info in app_list['data']:
|
|
|
|
- if app_info['appId'] in app_id_array:
|
|
|
|
- app_dict[app_info['appVersion']] = app_info
|
|
|
|
- video_list = get_top_video_info(account_id=account_id,
|
|
|
|
- url=get_high_quality_video_url,
|
|
|
|
- start_time=(now + datetime.timedelta(days=-2 * high_quality_video_days)).
|
|
|
|
- strftime("%Y-%m-%d %H:%M:%S"),
|
|
|
|
- end_time=(now + datetime.timedelta(days=-high_quality_video_days)).
|
|
|
|
- strftime("%Y-%m-%d %H:%M:%S"),
|
|
|
|
- cnt=video_cnt,
|
|
|
|
- app_version=None)
|
|
|
|
-
|
|
|
|
- # 单独处理返回的时候中,有通用视频,需要单独处理
|
|
|
|
- # "photo_name": "all",
|
|
|
|
- # "photo_name": "ksjytdrca-糖豆人冲啊",
|
|
|
|
- if video_list['code'] == 0:
|
|
|
|
|
|
+ if df['general_track'].values[0] == 0:
|
|
|
|
+ app_id_array = eval(df['app_id_array'].values[0])
|
|
|
|
+ app_list = get_app_list(account_id=account_id, url=get_app_list_url)
|
|
|
|
+ # app_dict key = ("appVersion": "ksjyrlyn-人类一脑涂地大败") , value = 完整的app_id信息
|
|
|
|
+ app_dict = {}
|
|
|
|
+ for app_info in app_list['data']:
|
|
|
|
+ if app_info['appId'] in app_id_array:
|
|
|
|
+ app_dict[app_info['appVersion']] = app_info
|
|
|
|
+ # 单独处理返回的时候中,有通用视频,需要单独处理
|
|
|
|
+ # "photo_name": "all",
|
|
|
|
+ # "photo_name": "ksjytdrca-糖豆人冲啊",
|
|
video_df = pd.DataFrame(video_list['data'])
|
|
video_df = pd.DataFrame(video_list['data'])
|
|
# 1-特定视频的创建
|
|
# 1-特定视频的创建
|
|
special_video_df = video_df[video_df.photo_name != 'all']
|
|
special_video_df = video_df[video_df.photo_name != 'all']
|
|
@@ -742,7 +556,7 @@ class AiCheckAndUpTOFullCreative(tornado.web.RequestHandler):
|
|
sql = """ select campaign_id, campaign_name from ctop_kuaishou_campaign where account_id = %s """ % account_id
|
|
sql = """ select campaign_id, campaign_name from ctop_kuaishou_campaign where account_id = %s """ % account_id
|
|
campaign_df = pd.read_sql(sql, engine)
|
|
campaign_df = pd.read_sql(sql, engine)
|
|
for row in campaign_df.itertuples():
|
|
for row in campaign_df.itertuples():
|
|
- if (app_version + '--优选广告位-' + '高质量素材') == getattr(row, 'campaign_name'):
|
|
|
|
|
|
+ if (app_version + '--优选广告位-' + campaign_group_name_place) == getattr(row, 'campaign_name'):
|
|
campaign_id = getattr(row, 'campaign_id')
|
|
campaign_id = getattr(row, 'campaign_id')
|
|
break
|
|
break
|
|
app_id_video_df = special_video_df[special_video_df.photo_name == photo_name]
|
|
app_id_video_df = special_video_df[special_video_df.photo_name == photo_name]
|
|
@@ -752,77 +566,70 @@ class AiCheckAndUpTOFullCreative(tornado.web.RequestHandler):
|
|
request_data = get_request_data(account_id=account_id,
|
|
request_data = get_request_data(account_id=account_id,
|
|
campaign_id=campaign_id,
|
|
campaign_id=campaign_id,
|
|
video_info=app_id_video_list,
|
|
video_info=app_id_video_list,
|
|
- campaign_name=app_version + '--优选广告位-' + '高质量素材',
|
|
|
|
- group_name=app_version + '-优选广告位-不限-自定义-' + '高质量素材',
|
|
|
|
- ai_strategy_remark="用高质量素材补满创意",
|
|
|
|
|
|
+ campaign_name=app_version+'--优选广告位-'+campaign_group_name_place,
|
|
|
|
+ group_name=app_version+'-优选广告位-不限-自定义-'+campaign_group_name_place,
|
|
|
|
+ ai_strategy_remark="按小时补充创意-"+campaign_group_name_place,
|
|
unit_type=4,
|
|
unit_type=4,
|
|
app_id=app_id,
|
|
app_id=app_id,
|
|
click_track_url=track_url)
|
|
click_track_url=track_url)
|
|
request = ai_strategy_request_parse(request_data)
|
|
request = ai_strategy_request_parse(request_data)
|
|
- logger.info("account_id=%s, app_id=%s, 用高质量素材补满创意-特定视频,ai策略的返回信息:%s" %
|
|
|
|
- (account_id, app_id, request))
|
|
|
|
|
|
+ logger.info("account_id=%s, app_id=%s, %s补充创意-特定视频,ai策略的返回信息:%s" %
|
|
|
|
+ (account_id, app_id, campaign_group_name_place, request))
|
|
|
|
|
|
# 2-通用视频的创建,random.shuffle 选择 app_id
|
|
# 2-通用视频的创建,random.shuffle 选择 app_id
|
|
general_video_df = video_df[video_df.photo_name == 'all']
|
|
general_video_df = video_df[video_df.photo_name == 'all']
|
|
if not general_video_df.empty:
|
|
if not general_video_df.empty:
|
|
|
|
+ # 每 batch_num 一组 随机选择一个app_id 进行创建
|
|
|
|
+ batch_num = 10
|
|
general_video_cnt = len(general_video_df)
|
|
general_video_cnt = len(general_video_df)
|
|
app_version_list = list(app_dict)
|
|
app_version_list = list(app_dict)
|
|
random.shuffle(app_version_list)
|
|
random.shuffle(app_version_list)
|
|
|
|
+ need_app_id_cnt = general_video_cnt // batch_num + 1
|
|
video_cnt = 0
|
|
video_cnt = 0
|
|
- for app_version in app_version_list[:general_video_cnt]:
|
|
|
|
|
|
+ for app_version in app_version_list[:need_app_id_cnt]:
|
|
campaign_id = None
|
|
campaign_id = None
|
|
app_id = app_dict[app_version].get('appId', 'error')
|
|
app_id = app_dict[app_version].get('appId', 'error')
|
|
track_url = app_dict[app_version].get('trackUrl', 'error')
|
|
track_url = app_dict[app_version].get('trackUrl', 'error')
|
|
sql = """ select campaign_id, campaign_name from ctop_kuaishou_campaign where account_id = %s """ % account_id
|
|
sql = """ select campaign_id, campaign_name from ctop_kuaishou_campaign where account_id = %s """ % account_id
|
|
campaign_df = pd.read_sql(sql, engine)
|
|
campaign_df = pd.read_sql(sql, engine)
|
|
for row in campaign_df.itertuples():
|
|
for row in campaign_df.itertuples():
|
|
- if (app_version + '--优选广告位-' + '高质量素材') == getattr(row, 'campaign_name'):
|
|
|
|
|
|
+ if (app_version + '--优选广告位-' + campaign_group_name_place) == getattr(row, 'campaign_name'):
|
|
campaign_id = getattr(row, 'campaign_id')
|
|
campaign_id = getattr(row, 'campaign_id')
|
|
break
|
|
break
|
|
- single_video = [general_video_df.iloc[video_cnt, :].T.to_dict()]
|
|
|
|
|
|
+
|
|
|
|
+ batch_general_video_list = []
|
|
|
|
+ for k, v in general_video_df.iloc[video_cnt: video_cnt+batch_num, :].T.to_dict().items():
|
|
|
|
+ batch_general_video_list.append(v)
|
|
request_data = get_request_data(account_id=account_id,
|
|
request_data = get_request_data(account_id=account_id,
|
|
campaign_id=campaign_id,
|
|
campaign_id=campaign_id,
|
|
- video_info=single_video,
|
|
|
|
- campaign_name=app_version + '--优选广告位-' + '高质量素材',
|
|
|
|
- group_name=app_version + '-优选广告位-不限-自定义-' + '高质量素材',
|
|
|
|
- ai_strategy_remark="用高质量素材补满创意",
|
|
|
|
|
|
+ video_info=batch_general_video_list,
|
|
|
|
+ campaign_name=app_version + '--优选广告位-' + campaign_group_name_place,
|
|
|
|
+ group_name=app_version + '-优选广告位-不限-自定义-' + campaign_group_name_place,
|
|
|
|
+ ai_strategy_remark="按小时补充创意-"+campaign_group_name_place,
|
|
unit_type=4,
|
|
unit_type=4,
|
|
app_id=app_id,
|
|
app_id=app_id,
|
|
click_track_url=track_url)
|
|
click_track_url=track_url)
|
|
request = ai_strategy_request_parse(request_data)
|
|
request = ai_strategy_request_parse(request_data)
|
|
- video_cnt += 1
|
|
|
|
- logger.info("account_id=%s, app_id=%s, 用高质量素材补满创意-通用视频,ai策略的返回信息:%s" % (account_id, app_id, request))
|
|
|
|
|
|
+ video_cnt += batch_num
|
|
|
|
+ logger.info("account_id=%s, app_id=%s, %s补充创意-通用视频,ai策略的返回信息:%s" %
|
|
|
|
+ (account_id, app_id, campaign_group_name_place, request))
|
|
else:
|
|
else:
|
|
- logger.info("account_id=%s, 用高质量素材补满创意: 返回的视频中没有通用视频" % account_id)
|
|
|
|
- self.write(json.dumps({"message": "account_id=%s, 用高质量素材补满创意请求已走完!" % account_id}))
|
|
|
|
- self.flush()
|
|
|
|
- else:
|
|
|
|
- # 1-1 获取当天计划中包含“高质量素材”计划的,计划id
|
|
|
|
- sql = """
|
|
|
|
- select campaign_id, campaign_name from ctop_kuaishou_campaign
|
|
|
|
- where account_id = %s
|
|
|
|
- and put_create_time >= '%s'
|
|
|
|
- and put_create_time <= '%s'
|
|
|
|
- """ % (account_id, start_time, end_time)
|
|
|
|
- df = pd.read_sql(sql, engine)
|
|
|
|
- for row in df.itertuples():
|
|
|
|
- if '高质量素材' in getattr(row, 'campaign_name'):
|
|
|
|
- campaign_id = getattr(row, 'campaign_id')
|
|
|
|
- break
|
|
|
|
-
|
|
|
|
- video_info = get_top_video_info(account_id=account_id,
|
|
|
|
- cnt=video_cnt,
|
|
|
|
- start_time=(now + datetime.timedelta(days=-2 * high_quality_video_days)).
|
|
|
|
- strftime("%Y-%m-%d %H:%M:%S"),
|
|
|
|
- end_time=(now + datetime.timedelta(days=-high_quality_video_days)).
|
|
|
|
- strftime("%Y-%m-%d %H:%M:%S"),
|
|
|
|
- url=get_high_quality_video_url)
|
|
|
|
- if video_info['code'] != 0:
|
|
|
|
- logger.info("account_id = %s, 历史高质量素材填满, 没有获取到视频,不发送ai策略请求!" % account_id)
|
|
|
|
- self.write(json.dumps({"account_id": account_id,
|
|
|
|
- "message": "历史高质量素材填满, 没有获取到视频,不发送ai策略请求!"}))
|
|
|
|
|
|
+ logger.info("account_id=%s, %s补充创意: 返回的视频中没有通用视频" % (account_id, campaign_group_name_place))
|
|
|
|
+ self.write(json.dumps({"message": "account_id=%s, %s补充创意请求已走完!" % (account_id, campaign_group_name_place)}))
|
|
self.flush()
|
|
self.flush()
|
|
else:
|
|
else:
|
|
|
|
+ # 获取当天计划中包含“campaign_group_name_place”计划的,计划id
|
|
|
|
+ sql = """select campaign_id, campaign_name from ctop_kuaishou_campaign
|
|
|
|
+ where account_id = %s
|
|
|
|
+ and put_create_time <= '%s'
|
|
|
|
+ and put_create_time >= '%s' """ % (account_id,
|
|
|
|
+ (datetime.datetime.now()).strftime('%Y-%m-%d %H:%M:%S'),
|
|
|
|
+ (datetime.datetime.now()).strftime('%Y-%m-%d'))
|
|
|
|
+ df = pd.read_sql(sql, engine)
|
|
|
|
+ for row in df.itertuples():
|
|
|
|
+ if campaign_group_name_place in getattr(row, 'campaign_name'):
|
|
|
|
+ campaign_id = getattr(row, 'campaign_id')
|
|
|
|
+ break
|
|
campaign_name, group_name = get_campaign_and_group_name_rule(account_id)
|
|
campaign_name, group_name = get_campaign_and_group_name_rule(account_id)
|
|
if (campaign_name is None) or (group_name is None):
|
|
if (campaign_name is None) or (group_name is None):
|
|
logger.info("account_id = %s, 没有获取到广告计划命名规则 或 广告组命名规则,不发送ai策略请求!" % account_id)
|
|
logger.info("account_id = %s, 没有获取到广告计划命名规则 或 广告组命名规则,不发送ai策略请求!" % account_id)
|
|
@@ -832,15 +639,20 @@ class AiCheckAndUpTOFullCreative(tornado.web.RequestHandler):
|
|
else:
|
|
else:
|
|
request_data = get_request_data(account_id=account_id,
|
|
request_data = get_request_data(account_id=account_id,
|
|
campaign_id=campaign_id,
|
|
campaign_id=campaign_id,
|
|
- video_info=video_info['data'],
|
|
|
|
|
|
+ video_info=video_list['data'],
|
|
campaign_name=campaign_name,
|
|
campaign_name=campaign_name,
|
|
group_name=group_name,
|
|
group_name=group_name,
|
|
- ai_strategy_remark="用高质量素材补满创意",
|
|
|
|
- name_replace="高质量素材")
|
|
|
|
|
|
+ ai_strategy_remark="按小时补充创意-"+campaign_group_name_place,
|
|
|
|
+ name_replace=campaign_group_name_place)
|
|
request = ai_strategy_request_parse(request_data)
|
|
request = ai_strategy_request_parse(request_data)
|
|
- logger.info("account_id = %s, 用高质量素材补满创意,ai策略的返回信息:%s" % (account_id, request))
|
|
|
|
|
|
+ logger.info("account_id = %s, %s补充创意,ai策略的返回信息:%s" % (account_id, campaign_group_name_place, request))
|
|
self.write(json.dumps(request))
|
|
self.write(json.dumps(request))
|
|
self.flush()
|
|
self.flush()
|
|
|
|
+
|
|
|
|
+ else:
|
|
|
|
+ logger.info("account_id=%s, 按小时补充创意: 没有成功获取到视频!" % account_id)
|
|
|
|
+ self.write(json.dumps({"message": "account_id=%s, 按小时补充创意: 没有成功获取到视频!" % account_id}))
|
|
|
|
+ self.flush()
|
|
except Exception:
|
|
except Exception:
|
|
logger.error("account_id = %s, traceback is %s" % (account_id, traceback.format_exc()))
|
|
logger.error("account_id = %s, traceback is %s" % (account_id, traceback.format_exc()))
|
|
self.write(json.dumps({"account_id": account_id, "message": traceback.format_exc(), "code": -1}))
|
|
self.write(json.dumps({"account_id": account_id, "message": traceback.format_exc(), "code": -1}))
|