liyuyi@c-top.com.cn 4 năm trước cách đây
mục cha
commit
7e25e85540

+ 37 - 296
ai_callback_add_creative_handler.py

@@ -14,7 +14,6 @@ import datetime
 from sqlalchemy import create_engine
 from sqlalchemy import create_engine
 from db_config import *
 from db_config import *
 import traceback
 import traceback
-import uuid
 
 
 
 
 class AiCallBackAddCreative(tornado.web.RequestHandler):
 class AiCallBackAddCreative(tornado.web.RequestHandler):
@@ -22,314 +21,56 @@ class AiCallBackAddCreative(tornado.web.RequestHandler):
         self.logger = logger
         self.logger = logger
 
 
     def post(self):
     def post(self):
+        res = {'code': 0,
+               'data': None,
+               'message': "SUCCESS"}
+
         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')
         self.logger.info("***************************************  NEW REQUEST ***************************************")
         self.logger.info("***************************************  NEW REQUEST ***************************************")
         self.logger.info("raw data from request is %s" % data)
         self.logger.info("raw data from request is %s" % data)
 
 
-        create_group_and_creative_response_data = None
-        # 1、新增广告组操作
         try:
         try:
-            if data["operation_type"] == 1:
-                inst = ParseAddCampaignOrAddGroupRequest(data)
-                inst.get_advertiser_strategy_info()
-                inst.write_intelligence_strategy_table()
-                if inst.campaign_id == "" or inst.campaign_id is None:
-                    if inst.add_campaign() == -1:
-                        self.write(json.dumps({"message": "广告计划创建失败"}))
-                        self.flush()
-                        return
-
-                inst.get_group_dict()
-                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)
-                create_group_and_creative_response_data = simplejson.loads(request.text)
+            inst = UpdateCreativeLevelRecordTable(data, self.logger)
+            inst.update_table_info()
         except Exception:
         except Exception:
+            res['code'] = -1
+            res['message'] = 'FAIL'
             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.write(json.dumps(res))
         self.flush()
         self.flush()
 
 
 
 
-# 该类解析的是 手动请求的新增广告计划或者新增广告组的数据
-class ParseAddCampaignOrAddGroupRequest(object):
-    def __init__(self, request_data):
-        self.ai_strategy_uuid = str(uuid.uuid4())
-        self.request_data = request_data
-        self.video = self.request_data['video']
-        self.account_id = self.request_data['account_id']
-        self.campaign_info = self.request_data['campaign_info']
-        self.campaign_id = self.request_data['campaign_info'].get('campaign_id', None)
-        self.group_info = self.request_data['group_info']
-        self.creative_info = self.request_data['creative_info']
-        self.operation_type = self.request_data['operation_type']
-
-        self.advertiser_strategy_id = None
-        self.advertiser_strategy = {}
-        self.res_data = {}
-
-    def get_advertiser_strategy_info(self):
-        """
-        获取指定账户下客户的策略信息
-        为后续的写入库表,校验一致性做准备
-        :return:
-        """
-        sql = """
-        select * 
-        from ctop_ai_kuaishou_advertiser_strategy 
-        where account_id = %d 
-        and status = 1
-        limit 1
-        """ % self.account_id
-        advertiser_strategy_df = pd.read_sql(sql, engine)
-
-        self.advertiser_strategy_id = advertiser_strategy_df['id'].values[0]
-        self.advertiser_strategy = advertiser_strategy_df.T.to_dict()[0]
-
-    def write_intelligence_strategy_table(self):
-        """
-        请求信息写入 ctop_ai_kuaishou_intelligence_strategy 表中
-        :return:
-        """
-        intelligence_strategy_dict = \
-            {
-                'ai_strategy_uuid': self.ai_strategy_uuid,
-                'advertiser_strategy_id': self.advertiser_strategy_id,
-                'account_id': self.account_id,
-                'ai_strategy_request_content': str(self.request_data),
-                'ai_strategy_remark': self.request_data['ai_strategy_remark'],
-                'create_time': datetime.datetime.now()
-            }
-
-        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)
-
-    # 如果手动请求的数据结构中,"campaign" 中的 campaign_id 为空则调用该新增计划方法
-    def add_campaign(self):
-        """
-        新增广告计划
-        :return:
-        """
-        # 1、校验请求信息中 有没有 与客户策略信息 中存在冲突的地方 -- 计划层级只判断 campaign_type
-        if self.campaign_info['campaign_type'] != self.advertiser_strategy['campaign_type']:
-            self.logger.info("客户策略的campaign_type: %d 和 AI策略的campaign_type:%d 不一致!" %
-                             (self.advertiser_strategy['campaign_type'],
-                              self.campaign_info['campaign_type']))
-            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"}
-        if res_data['code'] == 0:
-            self.campaign_id = res_data['data']['campaign_id']
-            campaign_info_to_db = {
-                                   'campaign_uuid': str(uuid.uuid4()),
-                                   'account_id': self.account_id,
-                                   'ai_strategy_uuid': self.ai_strategy_uuid,
-                                   'campaign_name': self.campaign_info['campaign_name'],
-                                   'campaign_id': self.campaign_id,
-                                   'campaign_type': self.campaign_info['campaign_type'],
-                                   'operation_type': self.operation_type,
-                                   'campaign_create_time': res_data['data']['campaign_create_time'],
-                                   'create_time': datetime.datetime.now()
-                                   }
-            df = pd.DataFrame.from_dict(campaign_info_to_db, orient='index').T
-            df.to_sql(name="ctop_ai_kuaishou_campaign_level_operation_record", con=engine, if_exists='append', index=False)
-        else:
-            self.logger.info("广告计划创建失败:%s" % res_data['message'])
-            return -1
-
-    def get_group_dict(self):
-        """
-        拼接组和创意层级参数
-        写入数据库
-        返回 table_id
-        :return:
-        """
-        # 1、TODO 校验请求信息中 有没有 与客户策略信息 中存在冲突的地方 -- 暂时不实现
-        # 客户策略 和 请求信息 都有值 才会进行校验比对操作 -- 不得高于,不得不等于,不得超过集合
-        # 因此分为3类 字段
-        # is_equal_cols = ['template_id','bid_type']
-        # is_less_than_cols = []
-        # is_contain_cols = []
-        #
-        # for col in is_equal_cols:
-        #     if (self.advertiser_strategy[col] is not None) and \
-        #             (self.group_info.get(col, None) is not None) and \
-        #             (self.group_info.get(col) != self.advertiser_strategy[col]):
-        #         return -1
-        #
-        # for col in is_less_than_cols:
-        #     if (self.advertiser_strategy[col] is not None) and \
-        #             (self.group_info.get(col, None) is not None) and \
-        #             (self.group_info.get(col) > self.advertiser_strategy[col]):
-        #         return -1
-        #
-        # for col in is_contain_cols:
-        #     if (self.advertiser_strategy[col] is not None) and \
-        #             (self.group_info.get(col, None) is not None) and \
-        #             (self.group_info.get(col) > self.advertiser_strategy[col]):
-        #         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']}
-
-        # 3、从请求的信息中更新计划层级信息
-        if len(self.group_info) > 0:
-            for key, value in self.group_info.items():
-                basic_group_info.update({key: value})
-
-        self.res_data['group_list'] = []
-        group_cnt = 1
-        for video in self.video:
-            single_group_info = {'group_uuid': str(uuid.uuid4())}
-            single_group_info.update(basic_group_info)
-            single_group_info['unit_name'] = self.group_info['unit_name'] + '-' + str(group_cnt)
-
-            # 组信息写入数据表中
-            single_group_info_to_db = single_group_info.copy()
-            single_group_info_to_db['ai_strategy_uuid'] = self.ai_strategy_uuid
-            single_group_info_to_db['account_id'] = self.account_id
-            single_group_info_to_db['campaign_id'] = self.campaign_id
-            single_group_info_to_db['create_time'] = datetime.datetime.now()
-            single_group_info_to_db['operation_type'] = self.operation_type
-            df = pd.DataFrame.from_dict(single_group_info_to_db, orient='index').T
-            engine = create_engine(db_con_str, connect_args={'charset': 'utf8'})
-            df.to_sql(name="ctop_ai_kuaishou_unit_level_operation_record",
-                      con=engine,
-                      if_exists='append',
-                      index=False)
-
-            single_group_info['creative_list'] = []
-            group_cnt += 1
-
-            creative_cnt = 1
-            for image in video['imageList']:
-                single_creative_info = {
-                    'creative_uuid': str(uuid.uuid4()),
-                    'is_sticky': 0,
-                    'creative_name': self.creative_info['creative_name'] + '_' + str(creative_cnt),
-                    'photo_id': video['photo_id'],
-                    'image_md5': image,  # TODO 需要和蒙蒙确认字段名称
-                    'image_tokens': self.creative_info.get('image_tokens'),
-                    'action_bar_text': self.creative_info['action_bar_text'],
-                    'description': self.creative_info['description'],
-                    'short_slogan': self.creative_info.get('short_slogan'),
-                    'sticker_title': self.creative_info.get('sticker_title'),
-                    'overlay_type': self.creative_info.get('overlay_type'),
-                    'expose_tag': self.creative_info.get('expose_tag'),
-                    'new_expose_tag': self.creative_info.get('new_expose_tag'),
-                    'site_id': self.creative_info.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.creative_info.get('creative_category'),
-                    'creative_tag': self.creative_info.get('creative_tag')}
-
-                single_group_info['creative_list'].append(single_creative_info)
-
-                # 创意层级写入数据表中
-                single_creative_info_to_db = single_creative_info.copy()
-                single_creative_info_to_db['ai_strategy_uuid'] = self.ai_strategy_uuid
-                single_creative_info_to_db['account_id'] = self.account_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['operation_type'] = self.operation_type
-                df = pd.DataFrame.from_dict(single_creative_info_to_db, orient='index').T
-                engine = create_engine(db_con_str, connect_args={'charset': 'utf8'})
-                df.to_sql(name="ctop_ai_kuaishou_creative_level_operation_record",
-                          con=engine,
-                          if_exists='append',
-                          index=False)
-
-                creative_cnt += 1
-            # 组和创意信息添加到最终返回数据 group_list 中
-            self.res_data['group_list'].append(single_group_info)
-
-        self.res_data['account_id'] = self.account_id
-        self.res_data['campaign_id'] = self.campaign_id
-
-
-# TODO 修改操作
-class ParseModifyRequest(object):
-    def __init__(self):
-        pass
+class UpdateCreativeLevelRecordTable(object):
+    def __init__(self, request_data,logger):
+        self.data = request_data
+        self.logger = logger
 
 
+    def update_table_info(self):
+        db_con = pymysql.connect(host=host,
+                                 port=port,
+                                 user=user,
+                                 password=passwd,
+                                 database=db,
+                                 charset=charset)
+        cursor = db_con.cursor()
+        for item in self.data['callbackdata']:
+            if item['code'] == 0:
+                creative_uuid = item['creative_uuid']
+                creative_id = item['creative_id']
+                unit_id = item['unit_id']
+                creative_create_time = item['creative_create_time']
+                self.logger.info("on single update callback info: %s" % item)
+
+                cursor.execute("""UPDATE ctop_ai_kuaishou_unit_level_operation_record
+                        SET unit_id= %s, unit_create_time=%s, creative_id=%s
+                        WHERE creative_uuid = %s""", (unit_id, creative_create_time,creative_id, creative_uuid))
+            else:
+                self.logger.error("on single update callback info: %s" % item)
+
+        db_con.commit()
+        db_con.close()
 
 
-# TODO 关停操作
-class ParseShutDownRequest(object):
-    def __init__(self):
-        pass

+ 38 - 7
ai_callback_add_group_handler.py

@@ -14,7 +14,6 @@ import datetime
 from sqlalchemy import create_engine
 from sqlalchemy import create_engine
 from db_config import *
 from db_config import *
 import traceback
 import traceback
-import uuid
 
 
 
 
 class AiCallBackAddGroup(tornado.web.RequestHandler):
 class AiCallBackAddGroup(tornado.web.RequestHandler):
@@ -22,24 +21,56 @@ class AiCallBackAddGroup(tornado.web.RequestHandler):
         self.logger = logger
         self.logger = logger
 
 
     def post(self):
     def post(self):
+        res = {'code': 0,
+               'data': None,
+               'message': "SUCCESS"}
+
         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')
         self.logger.info("***************************************  NEW REQUEST ***************************************")
         self.logger.info("***************************************  NEW REQUEST ***************************************")
         self.logger.info("raw data from request is %s" % data)
         self.logger.info("raw data from request is %s" % data)
 
 
-        # 1、新增广告组操作
         try:
         try:
-            pass
+            inst = UpdateGroupLevelRecordTable(data,self.logger)
+            inst.update_table_info()
         except Exception:
         except Exception:
+            res['code'] = -1
+            res['message'] = 'FAIL'
             self.logger.error(traceback.format_exc())
             self.logger.error(traceback.format_exc())
 
 
         # 返回接口结果
         # 返回接口结果
-        self.write(json.dumps({}))
+        self.write(json.dumps(res))
         self.flush()
         self.flush()
 
 
 
 
-# 该类解析的是 手动请求的新增广告计划或者新增广告组的数据
 class UpdateGroupLevelRecordTable(object):
 class UpdateGroupLevelRecordTable(object):
-    def __init__(self, request_data):
-        pass
+    def __init__(self, request_data,logger):
+        self.data = request_data
+        self.logger = logger
+
+    def update_table_info(self):
+        db_con = pymysql.connect(host=host,
+                                 port=port,
+                                 user=user,
+                                 password=passwd,
+                                 database=db,
+                                 charset=charset)
+        cursor = db_con.cursor()
+        for item in self.data['callbackdata']:
+            if item['code'] == 0:
+
+                group_uuid = item['group_uuid']
+                unit_id = item['unit_id']
+                unit_create_time = item['unit_create_time']
+                self.logger.info("on single update callback info: %s" % item)
+
+                cursor.execute("""UPDATE ctop_ai_kuaishou_unit_level_operation_record
+                        SET unit_id= %s, unit_create_time=%s
+                        WHERE group_uuid = %s""", (unit_id, unit_create_time, group_uuid))
+            else:
+                self.logger.error("on single update callback info: %s" % item)
+
+        db_con.commit()
+        db_con.close()
+

+ 12 - 17
db_config.py

@@ -2,9 +2,21 @@ import pymysql
 from sqlalchemy import create_engine
 from sqlalchemy import create_engine
 
 
 # 线上数据库连接字符串
 # 线上数据库连接字符串
+# host = "139.186.151.174"
+# port = 3306
+# user = "hcst"
+# passwd = "hcst@2020"
+# db = 'jeecg-boot'
+# charset = 'utf8'
 # db_con_str = "mysql+pymysql://%s:%s@%s:%d/%s" % ("readonly", "hcst@2021", "139.186.27.96", 4000, "jeecg-boot")
 # db_con_str = "mysql+pymysql://%s:%s@%s:%d/%s" % ("readonly", "hcst@2021", "139.186.27.96", 4000, "jeecg-boot")
 
 
 # 测试数据库连接字符串
 # 测试数据库连接字符串
+host = "139.186.151.174"
+port = 3306
+user = "hcst"
+passwd = "hcst@2020"
+db = 'jeecg-boot'
+charset = 'utf8'
 db_con_str = "mysql+pymysql://%s:%s@%s:%d/%s" % ("hcst", "hcst@2020", "139.186.151.174", 3306, "jeecg-boot")
 db_con_str = "mysql+pymysql://%s:%s@%s:%d/%s" % ("hcst", "hcst@2020", "139.186.151.174", 3306, "jeecg-boot")
 engine = create_engine(db_con_str, connect_args={'charset': 'utf8'})
 engine = create_engine(db_con_str, connect_args={'charset': 'utf8'})
 
 
@@ -21,20 +33,3 @@ get_history_video_url = "http://192.168.1.8:8080/jeecg-boot/kuaishou/material/ge
 create_group_and_creative_url = ""
 create_group_and_creative_url = ""
 
 
 
 
-
-# import MySQLdb
-# if __name__ == '__main__':
-#     connect = MySQLdb.connect(host="localhost", port=3306,
-#                               user="xxx", passwd="xxx", db='xxx', charset='utf8')
-#
-#     cursor = connect.cursor()
-#
-#     cursor.execute("""
-#        UPDATE tblTableName
-#        SET Year=%s, Month=%s, Day=%s, Hour=%s, Minute=%s
-#        WHERE Server=%s
-#     """, (Year, Month, Day, Hour, Minute, ServerID))
-#
-#     connect.commit()
-#     connect.close()
-

+ 12 - 0
logs/add_group_log/ai_callback_add_creative.log

@@ -0,0 +1,12 @@
+01/14/2021 05:55:56 PM INFO ai callback add creative logger service started at 2021-01-14 17:55:56
+01/14/2021 06:04:52 PM INFO ai callback add creative logger service started at 2021-01-14 18:04:52
+01/14/2021 06:06:06 PM INFO ai callback add creative logger service started at 2021-01-14 18:06:06
+01/14/2021 06:06:44 PM INFO ai callback add creative logger service started at 2021-01-14 18:06:44
+01/14/2021 06:08:20 PM INFO ai callback add creative logger service started at 2021-01-14 18:08:20
+01/14/2021 06:09:15 PM INFO ai callback add creative logger service started at 2021-01-14 18:09:15
+01/14/2021 06:13:03 PM INFO ai callback add creative logger service started at 2021-01-14 18:13:03
+01/14/2021 06:13:50 PM INFO ai callback add creative logger service started at 2021-01-14 18:13:50
+01/14/2021 06:14:47 PM INFO ai callback add creative logger service started at 2021-01-14 18:14:47
+01/14/2021 06:17:37 PM INFO ai callback add creative logger service started at 2021-01-14 18:17:37
+01/14/2021 06:19:16 PM INFO ai callback add creative logger service started at 2021-01-14 18:19:16
+01/14/2021 06:39:23 PM INFO ai callback add creative logger service started at 2021-01-14 18:39:23

+ 126 - 0
logs/add_group_log/ai_callback_add_group.log

@@ -0,0 +1,126 @@
+01/14/2021 05:55:56 PM INFO ai callback add group logger service started at 2021-01-14 17:55:56
+01/14/2021 06:04:52 PM INFO ai callback add group logger service started at 2021-01-14 18:04:52
+01/14/2021 06:06:06 PM INFO ai callback add group logger service started at 2021-01-14 18:06:06
+01/14/2021 06:06:44 PM INFO ai callback add group logger service started at 2021-01-14 18:06:44
+01/14/2021 06:08:20 PM INFO ai callback add group logger service started at 2021-01-14 18:08:20
+01/14/2021 06:09:15 PM INFO ai callback add group logger service started at 2021-01-14 18:09:15
+01/14/2021 06:09:19 PM INFO ***************************************  NEW REQUEST ***************************************
+01/14/2021 06:09:19 PM INFO raw data from request is {'callbackdata': [{'group_uuid': '12-ab', 'unit_id': 5555, 'unit_create_time': '9999-99-99', 'code': 0, 'message': '创建成功'}, {'group_uuid': '', 'code': -1, 'message': '广告组名称重复'}]}
+01/14/2021 06:09:19 PM INFO on single update callback info: {'group_uuid': '12-ab', 'unit_id': 5555, 'unit_create_time': '9999-99-99', 'code': 0, 'message': '创建成功'}
+01/14/2021 06:09:19 PM ERROR Traceback (most recent call last):
+  File "E:\ai_ads\ai_callback_add_group_handler.py", line 32, in post
+    inst.update_table_info()
+  File "E:\ai_ads\ai_callback_add_group_handler.py", line 66, in update_table_info
+    cursor.execute(sql)
+  File "D:\anaconda3\envs\ai_ads\lib\site-packages\pymysql\cursors.py", line 148, in execute
+    result = self._query(query)
+  File "D:\anaconda3\envs\ai_ads\lib\site-packages\pymysql\cursors.py", line 310, in _query
+    conn.query(q)
+  File "D:\anaconda3\envs\ai_ads\lib\site-packages\pymysql\connections.py", line 548, in query
+    self._affected_rows = self._read_query_result(unbuffered=unbuffered)
+  File "D:\anaconda3\envs\ai_ads\lib\site-packages\pymysql\connections.py", line 775, in _read_query_result
+    result.read()
+  File "D:\anaconda3\envs\ai_ads\lib\site-packages\pymysql\connections.py", line 1156, in read
+    first_packet = self.connection._read_packet()
+  File "D:\anaconda3\envs\ai_ads\lib\site-packages\pymysql\connections.py", line 725, in _read_packet
+    packet.raise_for_error()
+  File "D:\anaconda3\envs\ai_ads\lib\site-packages\pymysql\protocol.py", line 221, in raise_for_error
+    err.raise_mysql_exception(self._data)
+  File "D:\anaconda3\envs\ai_ads\lib\site-packages\pymysql\err.py", line 143, in raise_mysql_exception
+    raise errorclass(errno, errval)
+pymysql.err.OperationalError: (1054, "Unknown column 'ab' in 'where clause'")
+
+01/14/2021 06:13:03 PM INFO ai callback add group logger service started at 2021-01-14 18:13:03
+01/14/2021 06:13:07 PM INFO ***************************************  NEW REQUEST ***************************************
+01/14/2021 06:13:07 PM INFO raw data from request is {'callbackdata': [{'group_uuid': '12-ab', 'unit_id': 5555, 'unit_create_time': '9999-99-99', 'code': 0, 'message': '创建成功'}, {'group_uuid': '', 'code': -1, 'message': '广告组名称重复'}]}
+01/14/2021 06:13:07 PM INFO on single update callback info: {'group_uuid': '12-ab', 'unit_id': 5555, 'unit_create_time': '9999-99-99', 'code': 0, 'message': '创建成功'}
+01/14/2021 06:13:07 PM ERROR Traceback (most recent call last):
+  File "E:\ai_ads\ai_callback_add_group_handler.py", line 32, in post
+    inst.update_table_info()
+  File "E:\ai_ads\ai_callback_add_group_handler.py", line 65, in update_table_info
+    WHERE group_uuid = %s""", (unit_id, unit_create_time, group_uuid))
+  File "D:\anaconda3\envs\ai_ads\lib\site-packages\pymysql\cursors.py", line 146, in execute
+    query = self.mogrify(query, args)
+  File "D:\anaconda3\envs\ai_ads\lib\site-packages\pymysql\cursors.py", line 125, in mogrify
+    query = query % self._escape_args(args, conn)
+TypeError: %d format: a number is required, not str
+
+01/14/2021 06:13:50 PM INFO ai callback add group logger service started at 2021-01-14 18:13:50
+01/14/2021 06:13:55 PM INFO ***************************************  NEW REQUEST ***************************************
+01/14/2021 06:13:55 PM INFO raw data from request is {'callbackdata': [{'group_uuid': '12-ab', 'unit_id': 5555, 'unit_create_time': '9999-99-99', 'code': 0, 'message': '创建成功'}, {'group_uuid': '', 'code': -1, 'message': '广告组名称重复'}]}
+01/14/2021 06:13:55 PM INFO on single update callback info: {'group_uuid': '12-ab', 'unit_id': 5555, 'unit_create_time': '9999-99-99', 'code': 0, 'message': '创建成功'}
+01/14/2021 06:13:55 PM ERROR Traceback (most recent call last):
+  File "E:\ai_ads\ai_callback_add_group_handler.py", line 32, in post
+    inst.update_table_info()
+  File "E:\ai_ads\ai_callback_add_group_handler.py", line 68, in update_table_info
+    WHERE group_uuid = %s""", (unit_id, unit_create_time, group_uuid))
+  File "D:\anaconda3\envs\ai_ads\lib\site-packages\pymysql\cursors.py", line 146, in execute
+    query = self.mogrify(query, args)
+  File "D:\anaconda3\envs\ai_ads\lib\site-packages\pymysql\cursors.py", line 125, in mogrify
+    query = query % self._escape_args(args, conn)
+TypeError: %d format: a number is required, not str
+
+01/14/2021 06:14:47 PM INFO ai callback add group logger service started at 2021-01-14 18:14:47
+01/14/2021 06:14:51 PM INFO ***************************************  NEW REQUEST ***************************************
+01/14/2021 06:14:51 PM INFO raw data from request is {'callbackdata': [{'group_uuid': '12-ab', 'unit_id': 5555, 'unit_create_time': '9999-99-99', 'code': 0, 'message': '创建成功'}, {'group_uuid': '', 'code': -1, 'message': '广告组名称重复'}]}
+01/14/2021 06:14:51 PM INFO on single update callback info: {'group_uuid': '12-ab', 'unit_id': 5555, 'unit_create_time': '9999-99-99', 'code': 0, 'message': '创建成功'}
+01/14/2021 06:14:51 PM ERROR Traceback (most recent call last):
+  File "E:\ai_ads\ai_callback_add_group_handler.py", line 32, in post
+    inst.update_table_info()
+  File "E:\ai_ads\ai_callback_add_group_handler.py", line 68, in update_table_info
+    WHERE group_uuid = %s""", (unit_id, unit_create_time, group_uuid))
+  File "D:\anaconda3\envs\ai_ads\lib\site-packages\pymysql\cursors.py", line 146, in execute
+    query = self.mogrify(query, args)
+  File "D:\anaconda3\envs\ai_ads\lib\site-packages\pymysql\cursors.py", line 125, in mogrify
+    query = query % self._escape_args(args, conn)
+TypeError: %d format: a number is required, not str
+
+01/14/2021 06:17:37 PM INFO ai callback add group logger service started at 2021-01-14 18:17:37
+01/14/2021 06:17:41 PM INFO ***************************************  NEW REQUEST ***************************************
+01/14/2021 06:17:41 PM INFO raw data from request is {'callbackdata': [{'group_uuid': '12-ab', 'unit_id': 5555, 'unit_create_time': '9999-99-99', 'code': 0, 'message': '创建成功'}, {'group_uuid': '', 'code': -1, 'message': '广告组名称重复'}]}
+01/14/2021 06:17:41 PM INFO on single update callback info: {'group_uuid': '12-ab', 'unit_id': 5555, 'unit_create_time': '9999-99-99', 'code': 0, 'message': '创建成功'}
+01/14/2021 06:17:41 PM ERROR Traceback (most recent call last):
+  File "E:\ai_ads\ai_callback_add_group_handler.py", line 32, in post
+    inst.update_table_info()
+  File "E:\ai_ads\ai_callback_add_group_handler.py", line 68, in update_table_info
+    WHERE group_uuid = %s""", (unit_id, unit_create_time, group_uuid))
+  File "D:\anaconda3\envs\ai_ads\lib\site-packages\pymysql\cursors.py", line 148, in execute
+    result = self._query(query)
+  File "D:\anaconda3\envs\ai_ads\lib\site-packages\pymysql\cursors.py", line 310, in _query
+    conn.query(q)
+  File "D:\anaconda3\envs\ai_ads\lib\site-packages\pymysql\connections.py", line 548, in query
+    self._affected_rows = self._read_query_result(unbuffered=unbuffered)
+  File "D:\anaconda3\envs\ai_ads\lib\site-packages\pymysql\connections.py", line 775, in _read_query_result
+    result.read()
+  File "D:\anaconda3\envs\ai_ads\lib\site-packages\pymysql\connections.py", line 1156, in read
+    first_packet = self.connection._read_packet()
+  File "D:\anaconda3\envs\ai_ads\lib\site-packages\pymysql\connections.py", line 725, in _read_packet
+    packet.raise_for_error()
+  File "D:\anaconda3\envs\ai_ads\lib\site-packages\pymysql\protocol.py", line 221, in raise_for_error
+    err.raise_mysql_exception(self._data)
+  File "D:\anaconda3\envs\ai_ads\lib\site-packages\pymysql\err.py", line 143, in raise_mysql_exception
+    raise errorclass(errno, errval)
+pymysql.err.OperationalError: (1292, "Incorrect datetime value: '9999-99-99' for column `jeecg-boot`.`ctop_ai_kuaishou_unit_level_operation_record`.`unit_create_time` at row 1")
+
+01/14/2021 06:18:21 PM INFO ***************************************  NEW REQUEST ***************************************
+01/14/2021 06:18:21 PM INFO raw data from request is {'callbackdata': [{'group_uuid': '12-ab', 'unit_id': 5555, 'unit_create_time': '2021-01-14 18:01:04', 'code': 0, 'message': '创建成功'}, {'group_uuid': '', 'code': -1, 'message': '广告组名称重复'}]}
+01/14/2021 06:18:21 PM INFO on single update callback info: {'group_uuid': '12-ab', 'unit_id': 5555, 'unit_create_time': '2021-01-14 18:01:04', 'code': 0, 'message': '创建成功'}
+01/14/2021 06:18:21 PM ERROR on single update callback info: {'group_uuid': '', 'code': -1, 'message': '广告组名称重复'}
+01/14/2021 06:19:16 PM INFO ai callback add group logger service started at 2021-01-14 18:19:16
+01/14/2021 06:19:19 PM INFO ***************************************  NEW REQUEST ***************************************
+01/14/2021 06:19:19 PM INFO raw data from request is {'callbackdata': [{'group_uuid': '12-ab', 'unit_id': 5555, 'unit_create_time': '2021-01-14 18:01:04', 'code': 0, 'message': '创建成功'}, {'group_uuid': '', 'code': -1, 'message': '广告组名称重复'}]}
+01/14/2021 06:19:19 PM INFO on single update callback info: {'group_uuid': '12-ab', 'unit_id': 5555, 'unit_create_time': '2021-01-14 18:01:04', 'code': 0, 'message': '创建成功'}
+01/14/2021 06:19:20 PM ERROR on single update callback info: {'group_uuid': '', 'code': -1, 'message': '广告组名称重复'}
+01/14/2021 06:33:05 PM INFO ***************************************  NEW REQUEST ***************************************
+01/14/2021 06:33:05 PM INFO raw data from request is {'callbackdata': [{'group_uuid': '12-ab', 'unit_id': '7777', 'unit_create_time': '2021-01-14 18:01:04', 'code': 0, 'message': '创建成功'}, {'group_uuid': '', 'code': -1, 'message': '广告组名称重复'}]}
+01/14/2021 06:33:06 PM INFO on single update callback info: {'group_uuid': '12-ab', 'unit_id': '7777', 'unit_create_time': '2021-01-14 18:01:04', 'code': 0, 'message': '创建成功'}
+01/14/2021 06:33:06 PM ERROR on single update callback info: {'group_uuid': '', 'code': -1, 'message': '广告组名称重复'}
+01/14/2021 06:33:44 PM INFO ***************************************  NEW REQUEST ***************************************
+01/14/2021 06:33:44 PM INFO raw data from request is {'callbackdata': [{'group_uuid': '12-ab', 'unit_id': '7777', 'unit_create_time': '2021-01-14 18:01:04', 'code': 0, 'message': '创建成功'}, {'group_uuid': '', 'code': -1, 'message': '广告组名称重复'}]}
+01/14/2021 06:33:44 PM INFO on single update callback info: {'group_uuid': '12-ab', 'unit_id': '7777', 'unit_create_time': '2021-01-14 18:01:04', 'code': 0, 'message': '创建成功'}
+01/14/2021 06:33:44 PM ERROR on single update callback info: {'group_uuid': '', 'code': -1, 'message': '广告组名称重复'}
+01/14/2021 06:39:23 PM INFO ai callback add group logger service started at 2021-01-14 18:39:23
+01/14/2021 06:39:27 PM INFO ***************************************  NEW REQUEST ***************************************
+01/14/2021 06:39:27 PM INFO raw data from request is {'callbackdata': [{'group_uuid': '12-ab', 'unit_id': '7777', 'unit_create_time': '2021-01-14 18:01:04', 'code': 0, 'message': '创建成功'}, {'group_uuid': '', 'code': -1, 'message': '广告组名称重复'}]}
+01/14/2021 06:39:27 PM INFO on single update callback info: {'group_uuid': '12-ab', 'unit_id': '7777', 'unit_create_time': '2021-01-14 18:01:04', 'code': 0, 'message': '创建成功'}
+01/14/2021 06:39:27 PM ERROR on single update callback info: {'group_uuid': '', 'code': -1, 'message': '广告组名称重复'}

+ 66 - 0
logs/add_group_log/ai_strategy_request.log

@@ -1457,3 +1457,69 @@ requests.exceptions.MissingSchema: Invalid URL '': No schema supplied. Perhaps y
     raise MissingSchema(error)
     raise MissingSchema(error)
 requests.exceptions.MissingSchema: Invalid URL '': No schema supplied. Perhaps you meant http://?
 requests.exceptions.MissingSchema: Invalid URL '': No schema supplied. Perhaps you meant http://?
 
 
+01/14/2021 05:55:56 PM INFO ai strategy request service started at 2021-01-14 17:55:56
+01/14/2021 06:02:53 PM INFO ***************************************  NEW REQUEST ***************************************
+01/14/2021 06:02:53 PM INFO raw data from request is {'callbackdata': [{'group_uuid': '12-ab', 'unit_id': 5555, 'unit_create_time': '9999-99-99', 'code': 0, 'message': '创建成功'}, {'group_uuid': '', 'code': -1, 'message': '广告组名称重复'}]}
+01/14/2021 06:02:53 PM ERROR Traceback (most recent call last):
+  File "E:\ai_ads\ai_callback_add_group_handler.py", line 32, in post
+    inst.update_table_info()
+  File "E:\ai_ads\ai_callback_add_group_handler.py", line 47, in update_table_info
+    db_con = pymysql.connect(host, port, user, passwd, db, charset)
+TypeError: __init__() takes 1 positional argument but 7 were given
+
+01/14/2021 06:04:52 PM INFO ai strategy request service started at 2021-01-14 18:04:52
+01/14/2021 06:04:57 PM INFO ***************************************  NEW REQUEST ***************************************
+01/14/2021 06:04:57 PM INFO raw data from request is {'callbackdata': [{'group_uuid': '12-ab', 'unit_id': 5555, 'unit_create_time': '9999-99-99', 'code': 0, 'message': '创建成功'}, {'group_uuid': '', 'code': -1, 'message': '广告组名称重复'}]}
+01/14/2021 06:04:57 PM ERROR Traceback (most recent call last):
+  File "E:\ai_ads\ai_callback_add_group_handler.py", line 32, in post
+    inst.update_table_info()
+  File "E:\ai_ads\ai_callback_add_group_handler.py", line 61, in update_table_info
+    self.logger.info("on single update callback info: %s" % item)
+AttributeError: 'UpdateGroupLevelRecordTable' object has no attribute 'logger'
+
+01/14/2021 06:06:06 PM INFO ai strategy request service started at 2021-01-14 18:06:06
+01/14/2021 06:06:10 PM INFO ***************************************  NEW REQUEST ***************************************
+01/14/2021 06:06:10 PM INFO raw data from request is {'callbackdata': [{'group_uuid': '12-ab', 'unit_id': 5555, 'unit_create_time': '9999-99-99', 'code': 0, 'message': '创建成功'}, {'group_uuid': '', 'code': -1, 'message': '广告组名称重复'}]}
+01/14/2021 06:06:10 PM INFO on single update callback info: {'group_uuid': '12-ab', 'unit_id': 5555, 'unit_create_time': '9999-99-99', 'code': 0, 'message': '创建成功'}
+01/14/2021 06:06:10 PM ERROR Traceback (most recent call last):
+  File "E:\ai_ads\ai_callback_add_group_handler.py", line 32, in post
+    inst.update_table_info()
+  File "E:\ai_ads\ai_callback_add_group_handler.py", line 65, in update_table_info
+    WHERE group_uuid=%d""" % (unit_id, unit_create_time, group_uuid)
+TypeError: %d format: a number is required, not str
+
+01/14/2021 06:06:44 PM INFO ai strategy request service started at 2021-01-14 18:06:44
+01/14/2021 06:06:47 PM INFO ***************************************  NEW REQUEST ***************************************
+01/14/2021 06:06:47 PM INFO raw data from request is {'callbackdata': [{'group_uuid': '12-ab', 'unit_id': 5555, 'unit_create_time': '9999-99-99', 'code': 0, 'message': '创建成功'}, {'group_uuid': '', 'code': -1, 'message': '广告组名称重复'}]}
+01/14/2021 06:06:48 PM INFO on single update callback info: {'group_uuid': '12-ab', 'unit_id': 5555, 'unit_create_time': '9999-99-99', 'code': 0, 'message': '创建成功'}
+01/14/2021 06:06:48 PM ERROR Traceback (most recent call last):
+  File "E:\ai_ads\ai_callback_add_group_handler.py", line 32, in post
+    inst.update_table_info()
+  File "E:\ai_ads\ai_callback_add_group_handler.py", line 66, in update_table_info
+    cursor.execute(sql)
+  File "D:\anaconda3\envs\ai_ads\lib\site-packages\pymysql\cursors.py", line 148, in execute
+    result = self._query(query)
+  File "D:\anaconda3\envs\ai_ads\lib\site-packages\pymysql\cursors.py", line 310, in _query
+    conn.query(q)
+  File "D:\anaconda3\envs\ai_ads\lib\site-packages\pymysql\connections.py", line 548, in query
+    self._affected_rows = self._read_query_result(unbuffered=unbuffered)
+  File "D:\anaconda3\envs\ai_ads\lib\site-packages\pymysql\connections.py", line 775, in _read_query_result
+    result.read()
+  File "D:\anaconda3\envs\ai_ads\lib\site-packages\pymysql\connections.py", line 1156, in read
+    first_packet = self.connection._read_packet()
+  File "D:\anaconda3\envs\ai_ads\lib\site-packages\pymysql\connections.py", line 725, in _read_packet
+    packet.raise_for_error()
+  File "D:\anaconda3\envs\ai_ads\lib\site-packages\pymysql\protocol.py", line 221, in raise_for_error
+    err.raise_mysql_exception(self._data)
+  File "D:\anaconda3\envs\ai_ads\lib\site-packages\pymysql\err.py", line 143, in raise_mysql_exception
+    raise errorclass(errno, errval)
+pymysql.err.OperationalError: (1054, "Unknown column 'ab' in 'where clause'")
+
+01/14/2021 06:08:20 PM INFO ai strategy request service started at 2021-01-14 18:08:20
+01/14/2021 06:09:15 PM INFO ai strategy request service started at 2021-01-14 18:09:15
+01/14/2021 06:13:03 PM INFO ai strategy request service started at 2021-01-14 18:13:03
+01/14/2021 06:13:50 PM INFO ai strategy request service started at 2021-01-14 18:13:50
+01/14/2021 06:14:47 PM INFO ai strategy request service started at 2021-01-14 18:14:47
+01/14/2021 06:17:37 PM INFO ai strategy request service started at 2021-01-14 18:17:37
+01/14/2021 06:19:16 PM INFO ai strategy request service started at 2021-01-14 18:19:16
+01/14/2021 06:39:23 PM INFO ai strategy request service started at 2021-01-14 18:39:23

+ 2 - 2
main.py

@@ -71,10 +71,10 @@ def create_application():
          {"logger": ai_strategy_request_logger}),
          {"logger": ai_strategy_request_logger}),
         (r"/ai_callback_add_group",
         (r"/ai_callback_add_group",
          ai_callback_add_group_handler.AiCallBackAddGroup,
          ai_callback_add_group_handler.AiCallBackAddGroup,
-         {"logger": ai_strategy_request_logger}),
+         {"logger": ai_callback_add_group_logger}),
         (r"/ai_callback_add_creative",
         (r"/ai_callback_add_creative",
          ai_callback_add_creative_handler.AiCallBackAddCreative,
          ai_callback_add_creative_handler.AiCallBackAddCreative,
-         {"logger": ai_strategy_request_logger}),
+         {"logger": ai_callback_add_creative_logger}),
     ])
     ])
 
 
     return web_application
     return web_application

+ 0 - 0
parse_json.py


+ 0 - 108
request_json.py

@@ -1,108 +0,0 @@
-import pandas as pd
-import numpy as np
-import datetime
-import pymysql
-from sqlalchemy import create_engine
-
-# online_con_str = "mysql+pymysql://%s:%s@%s:%d/%s" % ("readonly", "hcst@2021", "139.186.27.96", 4000, "jeecg-boot")
-# engine = create_engine(online_con_str, connect_args={'charset': 'utf8'})
-
-# test_con_str = "mysql+pymysql://%s:%s@%s:%d/%s" % ("hcst", "hcst2020", "139.186.151.174", 3306, "jeecg-boot")
-# engine = create_engine(test_con_str, connect_args={'charset': 'utf8'})
-
-online_con_str = "mysql+pymysql://%s:%s@%s:%d/%s" % ("hcst", "hcst@2020", "139.186.151.174", 3306, "jeecg-boot")
-engine = create_engine(online_con_str, connect_args={'charset': 'utf8'})
-
-
-
-
-# 拼接请求的json
-# example: 整个项目近30天内,消耗top10的视频,创建组
-account_id = 9556344
-request_dict = {}
-# 1、读取 客户策略表中 status = 1 的记录 (ctop_ai_kuaishou_advertiser_strategy)
-get_advertiser_strategy_sql = """
-select * 
-from ctop_ai_kuaishou_advertiser_strategy 
-where account_id = %d 
-and status = 1
-""" % account_id
-advertiser_strategy_df = pd.read_sql(get_advertiser_strategy_sql, engine)
-advertiser_strategy_drop_cols = ['id', 'status', 'create_time', 'effective_time', 'expiry_time']
-advertiser_strategy_df.drop(columns=advertiser_strategy_drop_cols, inplace=True)
-request_dict['advertiser_strategy_info'] = advertiser_strategy_df.T.to_dict()[0]
-
-# 2、拼接请求的json
-
-
-
-# 2.1 获取需要创建广告组所需要的视频
-# 调用于蒙的视频接口
-
-# 获取视频方式一
-days = 30
-num = 10
-sql = """
-select * from ctop_kuaishou_video_get
-        where account_id = %d
-        and signature in
-        (
-        select
-            daily_material.signature
-        from
-        ctop_kuaishou_report_daily_material daily_material
-        inner join
-        ctop_user_allocation allocation
-        on daily_material.account_id = allocation.account_id
-        where  allocation.project_id in (select project_id from ctop_user_allocation where account_id = %d)
-        and  to_days(now()) - to_days(daily_material.stat_date) <= %d
-        and daily_material.signature is not null
-        GROUP BY daily_material.signature
-        order by sum(daily_material.charge) desc
-        limit %d
-        )
-""" % (account_id, account_id, days, num)
-# video_df = pd.read_sql(sql, engine)
-# print(video_df.shape)
-
-# 获取视频方式二
-# 离线分析手动提取 signature,然后创建广告组
-# signature_list = ['f17059ef15d5940a43bd38f9b13dc551', 'c0065cbd882d94c7c0a808db68f73666']
-# sql = """
-# select * from ctop_kuaishou_video_get
-#         where account_id = %d
-#         and signature in %s
-# """ % (account_id, tuple(signature_list))
-# video_df = pd.read_sql(sql, engine)
-# print(video_df)
-
-# 2.1 计划层级的参数
-campaign_name = "户14-上下滑&信息流-跑量视频-剪辑-低价-低价包邮-活动-年龄18岁以上-单出价-" + \
-                datetime.datetime.now().strftime("%Y/%m/%d %H:%M:%S")
-# campaign_id 为空表示需要创建广告计划, 不为空则表示在该广告计划下新增广告组
-campaign_dict = {}
-campaign_id = None
-campaign_dict['campaign_name'] = campaign_name
-campaign_dict['campaign_id'] = campaign_id
-campaign_dict['campaign_type'] = 2
-campaign_dict['day_budget'] = None
-campaign_dict['day_budget_schedule'] = None
-campaign_dict['operation_type'] = "add"
-
-request_dict['campaign'] = campaign_dict
-
-
-# 2.2 组层级的参数
-
-
-
-
-
-
-
-
-
-
-
-
-