liyuyi@c-top.com.cn 4 роки тому
батько
коміт
08a4970a44

+ 70 - 36
ai_target_combine_handler.py

@@ -12,6 +12,17 @@ import requests
 from utils.commonFunc import get_db_engine, is_contains_gender, is_contains_age, is_contains_region
 from utils.BaseClass import NpEncoder
 from config.url import create_campaign_url, create_group_and_creative_url, headers
+import logging
+from concurrent_log import ConcurrentTimedRotatingFileHandler
+
+log_formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s', '%Y/%m/%d %I:%M:%S %p')
+log_handler = ConcurrentTimedRotatingFileHandler("logs/ai_target_combine.log", when="midnight", backupCount=100)
+log_handler.setFormatter(log_formatter)
+logger = logging.getLogger('ai_strategy_request_logger')
+logger.addHandler(log_handler)
+logger.setLevel(logging.DEBUG)
+print('id of ai_target_combine_logger %s' % id(logger))
+
 
 with open('config/config.yaml', mode='r', encoding='utf-8') as f:
     config = yaml.load(f.read(), Loader=yaml.FullLoader)
@@ -25,6 +36,7 @@ class AiTargetCombine(tornado.web.RequestHandler):
         data = json.loads(data, encoding='utf8')
         account_id = data['account_id']
         project_id = data['project_id']
+        logger.info("账户信息=%s, 当前进程=%s, 当前进程的主进程=%s" % (account_id, os.getpid(), os.getppid()))
         try:
             # 1、创建类实例
             ins = GetTargetAndAssemblyParameters(account_id, project_id)
@@ -55,10 +67,12 @@ class AiTargetCombine(tornado.web.RequestHandler):
             # 6、接口的返回信息更新到数据库表
             # ins.update_intelligence_strategy_table(message=response_data)
             ins.update_intelligence_strategy_table(message="异步执行")
+
+            logger.info("account_id = %s, 策略uuid = %s 的请求返回信息:%s" % (ins.account_id, ins.ai_strategy_uuid, "异步执行"))
             self.write(json.dumps({"account_id": account_id, "message": "异步执行", "code": 1}))
             self.flush()
         except:
-            # 这个是打印到控制台吗?
+            logger.error("account_id = %s, traceback is %s" % (ins.account_id, traceback.format_exc()))
             self.write(json.dumps({"account_id": account_id, "message": traceback.format_exc(), "code": -1}))
             self.flush()
 
@@ -123,6 +137,7 @@ class GetTargetAndAssemblyParameters(object):
             "message": "SUCCESS"}
         """
         # 1、请求创建广告计划的接口
+        self.advertiser_strategy['campaign_name'] = self.advertiser_strategy['campaign_name'].replace('{{自定义}}', '')
         campaign_name = self.advertiser_strategy['campaign_name'] + '_优质定向'
         create_campaign_request_data = {'account_id': self.account_id,
                                         'campaign_name': campaign_name,
@@ -266,7 +281,15 @@ class GetTargetAndAssemblyParameters(object):
             del target_combine['target_combine_id']
             del target_combine['signature']
             group_params.update(target_combine)
+
+            # 写入数据库的字段,list类型需要转化为str
             group_params_to_db.update(target_combine)
+            cols = ['ages_range', 'region']
+            for col in cols:
+                if col in target_combine.keys():
+                    group_params_to_db[col] = str(group_params_to_db[col])
+
+
 
             group_uuid = str(uuid.uuid4())
             group_name = group_params['unit_name']
@@ -321,7 +344,6 @@ class GetTargetAndAssemblyParameters(object):
 
         # 创意层级信息批量写入数据库
         creative_df = pd.DataFrame(batch_creative_params_to_db)
-        creative_df.to_csv('creative_df.csv',index=False)
         creative_df.to_sql(name="ctop_ai_kuaishou_creative_level_operation_record",
                            con=self.engine,
                            if_exists='append',
@@ -329,11 +351,10 @@ class GetTargetAndAssemblyParameters(object):
 
         # 组层级信息批量写入数据库
         group_df = pd.DataFrame(batch_group_params_to_db)
-        group_df.to_csv('group_df.csv', index=False)
-        # group_df.to_sql(name="ctop_ai_kuaishou_unit_level_operation_record",
-        #                 con=self.engine,
-        #                 if_exists='append',
-        #                 index=False)
+        group_df.to_sql(name="ctop_ai_kuaishou_unit_level_operation_record",
+                        con=self.engine,
+                        if_exists='append',
+                        index=False)
 
         self.request_data['account_id'] = self.account_id
         self.request_data['campaign_id'] = self.campaign_id
@@ -345,20 +366,19 @@ class GetTargetAndAssemblyParameters(object):
                         'template_id': self.advertiser_strategy.get('template_id'),
                         'bid_type': self.advertiser_strategy.get('bid_type'),
                         'use_app_market': self.advertiser_strategy.get('use_app_market'),
-                        'app_store': eval(self.advertiser_strategy.get('app_store')) if self.advertiser_strategy.get('app_store') else None,
+                        'app_store': self.advertiser_strategy.get('app_store'),
                         'bid': self.advertiser_strategy.get('bid'),
                         'cpa_bid': self.advertiser_strategy.get('cpa_bid'),
                         'smart_bid': self.advertiser_strategy.get('smart_bid'),
                         'ocpx_action_type': self.advertiser_strategy.get('ocpx_action_type'),
                         'deep_conversion_type': self.advertiser_strategy.get('deep_conversion_type'),
-                        'scene_id': eval(self.advertiser_strategy.get('scene_id')) if self.advertiser_strategy.get('scene_id') else None,
+                        'scene_id':self.advertiser_strategy.get('scene_id'),
                         'unit_type': self.advertiser_strategy.get('unit_type'),
                         'begin_time': self.advertiser_strategy.get('begin_time'),
                         'end_time': self.advertiser_strategy.get('end_time'),
                         'schedule_time': self.advertiser_strategy.get('schedule_time'),
                         'day_budget': self.advertiser_strategy.get('unit_day_budget'),
-                        'day_budget_schedule': eval(self.advertiser_strategy.get('unit_day_budget_schedule'))
-                        if self.advertiser_strategy.get('unit_day_budget_schedule') else None,
+                        'day_budget_schedule': self.advertiser_strategy.get('unit_day_budget_schedule'),
                         'convert_id': self.advertiser_strategy.get('convert_id'),
                         'url_type': self.advertiser_strategy.get('url_type'),
                         'web_uri_type': self.advertiser_strategy.get('web_uri_type'),
@@ -390,36 +410,26 @@ class GetTargetAndAssemblyParameters(object):
                         'user_type': self.advertiser_strategy.get('user_type'),
                         'age_min': self.advertiser_strategy.get('age_min'),
                         'age_max': self.advertiser_strategy.get('age_min'),
-                        'ages_range': eval(self.advertiser_strategy.get('ages_range'))
-                        if self.advertiser_strategy.get('ages_range') else None,
+                        'ages_range': self.advertiser_strategy.get('ages_range'),
                         'gender': self.advertiser_strategy.get('gender'),
                         'platform_os': self.advertiser_strategy.get('platform_os'),
                         'android_osv': self.advertiser_strategy.get('android_osv'),
                         'ios_osv': self.advertiser_strategy.get('ios_osv'),
                         'network': self.advertiser_strategy.get('network'),
-                        'device_brand': eval(self.advertiser_strategy.get('device_brand'))
-                        if self.advertiser_strategy.get('device_brand') else None,
+                        'device_brand': self.advertiser_strategy.get('device_brand'),
                         'device_price': self.advertiser_strategy.get('device_price'),
                         'business_interest_type': self.advertiser_strategy.get('business_interest_type'),
                         'business_interest': eval(self.advertiser_strategy.get('business_interest'))
                         if self.advertiser_strategy.get('business_interest') else None,
-                        'fans_star': eval(self.advertiser_strategy.get('fans_star'))
-                        if self.advertiser_strategy.get('fans_star') else None,
-                        'interest_video': eval(self.advertiser_strategy.get('interest_video'))
-                        if self.advertiser_strategy.get('interest_video') else None,
-                        'app_interest': eval(self.advertiser_strategy.get('app_interest'))
-                        if self.advertiser_strategy.get('app_interest') else None,
-                        # 'app_interest_ids': eval(self.advertiser_strategy.get('app_interest_ids'))
-                        # if self.advertiser_strategy.get('app_interest_ids') else None,
-                        'app_ids': eval(self.advertiser_strategy.get('app_ids'))
-                        if self.advertiser_strategy.get('app_ids') else None,
+                        'fans_star': self.advertiser_strategy.get('fans_star'),
+                        'interest_video': self.advertiser_strategy.get('interest_video'),
+                        'app_interest': self.advertiser_strategy.get('app_interest'),
+                        # 'app_interest_ids': self.advertiser_strategy.get('app_interest_ids'),
+                        'app_ids':self.advertiser_strategy.get('app_ids'),
                         'filter_converted_level': self.advertiser_strategy.get('filter_converted_level'),
-                        'population': eval(self.advertiser_strategy.get('population'))
-                        if self.advertiser_strategy.get('population') else None,
-                        'exclude_population': eval(self.advertiser_strategy.get('exclude_population'))
-                        if self.advertiser_strategy.get('exclude_population') else None,
-                        'paid_audience': eval(self.advertiser_strategy.get('paid_audience'))
-                        if self.advertiser_strategy.get('paid_audience') else None,
+                        'population': self.advertiser_strategy.get('population'),
+                        'exclude_population': self.advertiser_strategy.get('exclude_population'),
+                        'paid_audience': self.advertiser_strategy.get('paid_audience'),
                         'is_open': self.advertiser_strategy.get('is_open'),
                         'no_age_break': self.advertiser_strategy.get('no_age_break'),
                         'no_gender_break': self.advertiser_strategy.get('no_gender_break'),
@@ -427,6 +437,8 @@ class GetTargetAndAssemblyParameters(object):
                         'behavior_interest': self.advertiser_strategy.get('behavior_interest')
                         }
 
+        group_params['unit_name'] = group_params['unit_name'].replace('{{自定义}}', '')
+
         # 2、smart_cover 和 asset_mining 需要将0/1 转化为 False/True
         group_params['smart_cover'] = True if group_params.get('smart_cover', 0) == 1 else False
         group_params['asset_mining'] = True if group_params.get('asset_mining', 0) == 1 else False
@@ -450,7 +462,8 @@ class GetTargetAndAssemblyParameters(object):
                          6: '上下滑大屏广告',
                          7: '信息流广告',
                          10: '联盟场景'}
-        scene_id = '+'.join([scene_id_dict[item] for item in group_params.get('scene_id')])
+
+        scene_id = '+'.join([scene_id_dict[item] for item in eval(group_params.get('scene_id'))])
 
         unit_name = group_params['unit_name'].replace('{{应用标记}}', app_version). \
             replace('{{应用名称}}', app_name). \
@@ -481,6 +494,14 @@ class GetTargetAndAssemblyParameters(object):
         group_params_to_db['status'] = 1
         group_params_to_db['message'] = None
 
+        # 6、用于组装发送请求的部分字段,需要转化为list类型
+        cols_to_list = ['app_store', 'scene_id', 'region','day_budget_schedule', 'ages_range', 'device_brand', 'business_interest',
+                        'fans_star', 'interest_video', 'app_interest', 'app_interest_ids', 'app_ids', 'population','district_ids',
+                        'exclude_population', 'paid_audience']
+        for col in cols_to_list:
+            if col in group_params.keys():
+                group_params[col] = eval(group_params[col]) if group_params[col] else None
+
         return group_params, group_params_to_db
 
     def get_creative_params(self):
@@ -493,19 +514,26 @@ class GetTargetAndAssemblyParameters(object):
                            'sticker_title': self.advertiser_strategy.get('sticker_title'),
                            'overlay_type': self.advertiser_strategy.get('overlay_type'),
                            'expose_tag': self.advertiser_strategy.get('expose_tag'),
-                           'new_expose_tag': eval(self.advertiser_strategy.get('new_expose_tag'))
-                           if self.advertiser_strategy.get('new_expose_tag') else None,
+                           'new_expose_tag':self.advertiser_strategy.get('new_expose_tag'),
                            'site_id': self.advertiser_strategy.get('site_id'),
                            'click_track_url': self.advertiser_strategy.get('click_track_url'),
                            'impression_url': self.advertiser_strategy.get('impression_url'),
                            'ad_photo_played_t3s_url': self.advertiser_strategy.get('ad_photo_played_t3s_url'),
                            'actionbar_click_url': self.advertiser_strategy.get('actionbar_click_url'),
                            'creative_category': self.advertiser_strategy.get('creative_category'),
-                           'creative_tag': eval(self.advertiser_strategy.get('creative_tag'))
-                           if self.advertiser_strategy.get('creative_tag') else None,
+                           'creative_tag': self.advertiser_strategy.get('creative_tag'),
                            # 'live_creative_type': self.advertiser_strategy.get('live_creative_type')
                            }
 
+        # 1、description 可能存在多个值,需要从中随机获取一个
+        if creative_params['description'] is not None:
+            description_lst = eval(creative_params['description'])
+            random.shuffle(description_lst)
+            creative_params['description'] = description_lst[0]
+
+
+
+
         # 2 写入数据库的创意参数
         creative_params_to_db = creative_params.copy()
         creative_params_to_db['ai_strategy_uuid'] = self.ai_strategy_uuid
@@ -515,6 +543,12 @@ class GetTargetAndAssemblyParameters(object):
         creative_params_to_db['status'] = 1
         creative_params_to_db['message'] = None
 
+        # 3、用于组装发送请求的部分字段,需要转化为list类型
+        cols_to_list = ['creative_tag', 'new_expose_tag']
+        for col in cols_to_list:
+            if col in creative_params.keys():
+                creative_params[col] = eval(creative_params[col]) if creative_params[col] else None
+
         return creative_params, creative_params_to_db
 
     def update_intelligence_strategy_table(self, message=None):

+ 1 - 1
ai_target_server.py

@@ -20,6 +20,6 @@ if __name__ == "__main__":
     if platform.system() == 'Windows':
         http_server.start()
     else:
-        http_server.start(num_processes=1)
+        http_server.start(num_processes=3)
     tornado.ioloop.IOLoop.instance().start()
 

+ 22 - 13
time_task/time_task_create_ad_by_target.py

@@ -8,6 +8,17 @@ import traceback
 import yaml
 from utils.commonFunc import get_db_engine
 from config.url import target_combine_url
+import logging
+from concurrent_log import ConcurrentTimedRotatingFileHandler
+
+
+log_formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s', '%m/%d/%Y %I:%M:%S %p')
+log_handler = ConcurrentTimedRotatingFileHandler("../logs/time_task_create_ad_by_target.log", when="midnight", backupCount=100)
+log_handler.setFormatter(log_formatter)
+logger = logging.getLogger('time_task_create_ad_by_target_logger')
+logger.addHandler(log_handler)
+logger.setLevel(logging.DEBUG)
+print('id of time_task_create_ad_by_target_logger %s' % id(logger))
 
 with open('../config/config.yaml', mode='r', encoding='utf-8') as f:
     config = yaml.load(f.read(), Loader=yaml.FullLoader)
@@ -19,17 +30,18 @@ def send_request(args):
     request = None
     try:
         request_data = json.dumps({"account_id": args[0], "project_id": args[1]})
-        print('target_combine_url', target_combine_url)
         request = requests.post(target_combine_url, request_data)
-        return request.text
+        result = json.loads(request.text)
+        logger.info("account_id= %s,  project_id=%s, result=%s" % (args[0], args[1], result))
+        return result
     except Exception:
-        return "account_id = %s, request = %s, traceback = %s " % (args[0], request, traceback.format_exc())
+        logger.error("account_id= %s,  project_id=%s, traceback=%s" % (args[0], args[1], traceback.format_exc()))
+        return "error"
 
 
 # 0、 打印该定时任务被调用的时间
 unique_uuid = str(uuid.uuid4())
-print("***********", "优质定向创建-Start, unique_uuid = ", unique_uuid, datetime.datetime.now(), "**************")
-
+logger.info("***********优质定向创建-Start, unique_uuid = %s ,  time = %s **************" % (unique_uuid, datetime.datetime.now()))
 # 1、获取配置了【优质定向】的 account_id 及其 project_id
 # TODO 读取是否配置优质定向的字段,进行判断
 sql = """
@@ -47,27 +59,24 @@ account_df = pd.read_sql(sql, product_db_engine)
 account_df.drop_duplicates('account_id', keep='first', inplace=True)
 acc_list = [(item['account_id'], item['project_id']) for index, item in account_df.iterrows()]
 
-acc_list = [(9774238, 458)]
+# for test
+acc_list = [(9774238, 458)] * 6
 
 # 2、 5个账户一组进行发送请求
 batch_num = 5
 for i in range(0, len(acc_list), batch_num):
     if i + batch_num < len(acc_list):
-        print(datetime.datetime.now(), tuple(acc_list[i:i+batch_num]))
+        logger.info("time is %s, batch task is %s" % (datetime.datetime.now(), acc_list[i:i+batch_num]))
         with ThreadPoolExecutor(max_workers=batch_num) as pool:
             results = pool.map(send_request, tuple(acc_list[i: i+batch_num]))
-            for r in results:
-                print('res = %s' % r)
     else:
         with ThreadPoolExecutor(max_workers=batch_num) as pool:
-            print(datetime.datetime.now(), acc_list[i: len(acc_list)])
+            logger.info("time is %s, batch task is %s" % (datetime.datetime.now(), acc_list[i: len(acc_list)]))
             results = pool.map(send_request, tuple(acc_list[i: len(acc_list)]))
-            for r in results:
-                print('res = %s' % r)
 
 
 # 3、 打印该定时任务结束的时间
-print("***********", "优质定向创建-End, unique_uuid = ", unique_uuid, datetime.datetime.now(), "**************")
+logger.info("***********优质定向创建-End, unique_uuid = %s , time = %s **************" % (unique_uuid, datetime.datetime.now()))