ai_time_task_creative_handler.py 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. import datetime
  2. import traceback
  3. from logging.handlers import TimedRotatingFileHandler
  4. from utils.BaseClass import *
  5. from utils.CommonFunction import *
  6. from utils.ConstantConfig import *
  7. from utils.LogConfig import *
  8. from ai_strategy_request_func import ai_strategy_request_parse
  9. log_handler = TimedRotatingFileHandler("logs/ai_auto_create/ai_auto_create.log",
  10. when="midnight", backupCount=100)
  11. log_handler.setFormatter(log_formatter)
  12. logger = logging.getLogger('ai_time_task_creative_logger')
  13. logger.addHandler(log_handler)
  14. logger.setLevel(logging.DEBUG)
  15. print('id of ai_time_task_creative_logger %s' % id(logger))
  16. logger.info("ai_time_task_creative_server started!")
  17. class AiHistoricalMissingMaterial(tornado.web.RequestHandler):
  18. """
  19. 补充历史遗漏素材(关联创意个数为0个素材) -- 测试通过 在AD后台创建成功,检查AD信息和数据库表 没有问题
  20. """
  21. def post(self):
  22. data = self.request.body
  23. data = str(data, 'utf8')
  24. data = json.loads(data, encoding='utf8')
  25. logger.info("*************************************** NEW REQUEST ***************************************")
  26. logger.info("raw data from request is %s" % data)
  27. account_id = data.get('account_id')
  28. campaign_id = data.get('campaign_id')
  29. try:
  30. video_info = get_missing_video_info(account_id,
  31. missing_video_cnt,
  32. get_missing_video_url,
  33. missing_video_start_time,
  34. missing_video_end_time)
  35. if video_info is None:
  36. logger.info("没有获取到视频,不发送ai策略请求!")
  37. self.write(json.dumps({"message": "没有获取到视频,不发送ai策略请求!"}))
  38. self.flush()
  39. else:
  40. campaign_name, group_name = get_campaign_and_group_name_rule(account_id)
  41. if (campaign_name is None) or (group_name is None):
  42. logger.info("没有获取到广告计划命名规则 或 广告组命名规则,不发送ai策略请求!")
  43. self.write(json.dumps({"message": "没有获取到广告计划命名规则 或 广告组命名规则,不发送ai策略请求!"}))
  44. self.flush()
  45. else:
  46. request_data = get_request_data(account_id, campaign_id, video_info, campaign_name, group_name,
  47. "补充遗漏素材", "补充遗漏素材")
  48. request = ai_strategy_request_parse(request_data)
  49. logger.info("ai策略的返回信息:%s" % request)
  50. self.write(json.dumps(request))
  51. self.flush()
  52. except Exception:
  53. logger.error(traceback.format_exc())
  54. self.write(json.dumps(traceback.format_exc()))
  55. self.flush()
  56. class AiAutoCreative(tornado.web.RequestHandler):
  57. """
  58. 每5分钟,检查一次是否有上新素材,有的话,就自动创建 -- 需要上定时任务测试
  59. """
  60. def post(self):
  61. data = self.request.body
  62. data = str(data, 'utf8')
  63. data = json.loads(data, encoding='utf8')
  64. logger.info("*************************************** NEW REQUEST ***************************************")
  65. logger.info("raw data from request is %s" % data)
  66. account_id = data.get('account_id')
  67. campaign_id = data.get('campaign_id')
  68. try:
  69. start_time = (datetime.date.today()).strftime('%Y-%m-%d %H:%M:%S')
  70. end_time = (datetime.datetime.now()).strftime('%Y-%m-%d %H:%M:%S')
  71. # 1-1 获取当天计划中包含“自动上新”计划的,计划id
  72. sql = """
  73. select campaign_id, campaign_name from ctop_kuaishou_campaign
  74. where account_id = %s
  75. and put_create_time >= '%s'
  76. and put_create_time <= '%s'
  77. """ % (account_id, start_time, end_time)
  78. df = pd.read_sql(sql, engine)
  79. for row in df.itertuples():
  80. if '素材自动上新' in getattr(row, 'campaign_name'):
  81. campaign_id = getattr(row, 'campaign_id')
  82. break
  83. video_info = get_new_video_info(account_id, get_new_video_url)
  84. if video_info is None:
  85. logger.info("没有获取到视频,不发送ai策略请求!")
  86. self.write(json.dumps({"message": "没有获取到视频,不发送ai策略请求!"}))
  87. self.flush()
  88. else:
  89. campaign_name, group_name = get_campaign_and_group_name_rule(account_id)
  90. if (campaign_name is None) or (group_name is None):
  91. logger.info("没有获取到广告计划命名规则 或 广告组命名规则,不发送ai策略请求!")
  92. self.write(json.dumps({"message": "没有获取到广告计划命名规则 或 广告组命名规则,不发送ai策略请求!"}))
  93. self.flush()
  94. else:
  95. request_data = get_request_data(account_id, campaign_id, video_info, campaign_name, group_name,
  96. "自动上新", "素材自动上新")
  97. request = ai_strategy_request_parse(request_data)
  98. logger.info("ai策略的返回信息:%s" % request)
  99. self.write(json.dumps(request))
  100. self.flush()
  101. except Exception:
  102. logger.error(traceback.format_exc())
  103. self.write(json.dumps(traceback.format_exc()))
  104. self.flush()
  105. class AiHighQualityMaterial(tornado.web.RequestHandler):
  106. """
  107. 补充历史高质量素材 -- 测试通过 在AD后台创建成功,检查AD信息和数据库表 没有问题
  108. """
  109. def post(self):
  110. data = self.request.body
  111. data = str(data, 'utf8')
  112. data = json.loads(data, encoding='utf8')
  113. logger.info("*************************************** NEW REQUEST ***************************************")
  114. logger.info("raw data from request is %s" % data)
  115. account_id = data.get('account_id')
  116. campaign_id = data.get('campaign_id')
  117. try:
  118. video_info = get_top_video_info(account_id, high_quality_video_cnt,
  119. (datetime.datetime.now() + datetime.timedelta(days=-high_quality_video_days)).strftime("%Y-%m-%d"),
  120. str(datetime.date.today()), get_high_quality_video_url)
  121. if video_info is None:
  122. logger.info("没有获取到视频,不发送ai策略请求!")
  123. self.write(json.dumps({"message": "没有获取到视频,不发送ai策略请求!"}))
  124. self.flush()
  125. else:
  126. campaign_name, group_name = get_campaign_and_group_name_rule(account_id)
  127. if (campaign_name is None) or (group_name is None):
  128. logger.info("没有获取到广告计划命名规则 或 广告组命名规则,不发送ai策略请求!")
  129. self.write(json.dumps({"message": "没有获取到广告计划命名规则 或 广告组命名规则,不发送ai策略请求!"}))
  130. self.flush()
  131. else:
  132. request_data = get_request_data(account_id, campaign_id, video_info, campaign_name, group_name,
  133. "高质量素材", "高质量素材")
  134. request = ai_strategy_request_parse(request_data)
  135. logger.info("ai策略的返回信息:%s" % request)
  136. self.write(json.dumps(request))
  137. self.flush()
  138. except Exception:
  139. logger.error(traceback.format_exc())
  140. self.write(json.dumps(traceback.format_exc()))
  141. self.flush()
  142. class AiCheckAndUpTOFullCreative(tornado.web.RequestHandler):
  143. """
  144. 每天22:00 调用该任务,检查当天创意是否创建达到上限,否则使用历史高质量素材填满 -- 测试通过 在AD后台创建成功,检查AD信息和数据库表 没有问题
  145. """
  146. def post(self):
  147. data = self.request.body
  148. data = str(data, 'utf8')
  149. data = json.loads(data, encoding='utf8')
  150. logger.info("*************************************** NEW REQUEST ***************************************")
  151. logger.info("raw data from request is %s" % data)
  152. account_id = data.get('account_id')
  153. campaign_id = data.get('campaign_id')
  154. try:
  155. start_time = (datetime.date.today()).strftime('%Y-%m-%d %H:%M:%S')
  156. end_time = (datetime.datetime.now()).strftime('%Y-%m-%d %H:%M:%S')
  157. # 1-1 获取当天计划中包含“高质量素材”计划的,计划id
  158. sql = """
  159. select campaign_id, campaign_name from ctop_kuaishou_campaign
  160. where account_id = %s
  161. and put_create_time >= '%s'
  162. and put_create_time <= '%s'
  163. """ % (account_id, start_time, end_time)
  164. df = pd.read_sql(sql, engine)
  165. for row in df.itertuples():
  166. if '高质量素材' in getattr(row, 'campaign_name'):
  167. campaign_id = getattr(row, 'campaign_id')
  168. break
  169. # 2-1 从客户策略表中获取该账户下 每个素材搭配的封面个数, 来计算需要补充的素材个数
  170. sql = """
  171. select image_cnt from ctop_ai_kuaishou_advertiser_strategy
  172. where account_id = %s
  173. and status = 1
  174. limit 1
  175. """ % account_id
  176. df = pd.read_sql(sql, engine)
  177. image_cnt = df['image_cnt'].values[0]
  178. # 3-1 从 ctop_kuaishou_creative 获取当天该账户到此刻 已经创建的创意个数
  179. video_cnt = 0
  180. sql = """
  181. select count(1) creative_cnt from ctop_kuaishou_creative
  182. where account_id = %s
  183. and creative_id is not NULL
  184. and creative_create_time <= '%s'
  185. and creative_create_time >= '%s'
  186. """ % (account_id, end_time, start_time)
  187. df = pd.read_sql(sql, engine)
  188. creative_cnt = int(df['creative_cnt'].values[0])
  189. if creative_cnt >= 2000:
  190. video_cnt = 0
  191. else:
  192. video_cnt = (2000 - creative_cnt) // image_cnt
  193. # 4-1 获取视频信息
  194. if video_cnt == 0:
  195. logger.info("创意已经建满,不需要补充素材!")
  196. self.write(json.dumps("message: 创意已经建满,不需要补充素材!"))
  197. self.flush()
  198. else:
  199. logger.info("需要补充的视频数量:%s" % video_cnt)
  200. now = datetime.datetime.now()
  201. video_info = get_top_video_info(account_id,
  202. video_cnt,
  203. (now + datetime.timedelta(days=-2*high_quality_video_days)).strftime("%Y-%m-%d"),
  204. (now + datetime.timedelta(days=-high_quality_video_days)).strftime("%Y-%m-%d"),
  205. get_high_quality_video_url)
  206. if video_info is None:
  207. logger.info("没有获取到视频,不发送ai策略请求!")
  208. self.write(json.dumps({"message": "没有获取到视频,不发送ai策略请求!"}))
  209. self.flush()
  210. else:
  211. campaign_name, group_name = get_campaign_and_group_name_rule(account_id)
  212. if (campaign_name is None) or (group_name is None):
  213. logger.info("没有获取到广告计划命名规则 或 广告组命名规则,不发送ai策略请求!")
  214. self.write(json.dumps({"message": "没有获取到广告计划命名规则 或 广告组命名规则,不发送ai策略请求!"}))
  215. self.flush()
  216. else:
  217. request_data = get_request_data(account_id, campaign_id, video_info, campaign_name, group_name,
  218. "高质量素材", "高质量素材")
  219. request = ai_strategy_request_parse(request_data)
  220. logger.info("ai策略的返回信息:%s" % request)
  221. self.write(json.dumps(request))
  222. self.flush()
  223. except Exception:
  224. logger.error(traceback.format_exc())
  225. self.write(json.dumps(traceback.format_exc()))
  226. self.flush()
  227. def get_request_data(account_id, campaign_id, video_info, campaign_name, group_name,ai_strategy_remark, name_replace):
  228. res = {
  229. "video": video_info,
  230. "operation_type": 1,
  231. "account_id": account_id,
  232. "ai_strategy_remark": ai_strategy_remark,
  233. "campaign_info":
  234. {"campaign_id": campaign_id,
  235. "campaign_name": campaign_name.replace('自定义', name_replace) + str(datetime.datetime.now())},
  236. 'group_info':
  237. {'group_name': group_name.replace('自定义', name_replace) + str(datetime.datetime.now()),
  238. 'begin_time': str(datetime.date.today())},
  239. 'creative_info': {'is_sticky': 0}
  240. }
  241. return res