| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306 | 
							- import datetime
 
- import json
 
- import traceback
 
- import uuid
 
- from logging.handlers import TimedRotatingFileHandler
 
- import pandas as pd
 
- import requests
 
- from utils.BaseClass import *
 
- from utils.DataBaseConfig import *
 
- from utils.LogConfig import *
 
- from utils.UrlConfig import *
 
- log_handler = TimedRotatingFileHandler("logs/ai_strategy_request/ai_strategy_request.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_strategy_request_logger %s' % id(logger))
 
- def ai_strategy_request_parse(data):
 
-     """
 
-     :param data:
 
-     :return:
 
-     """
 
-     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:
 
-                 return {'code': -2, 'message': '广告计划创建失败!'}
 
-         inst.assemble_group_and_creative_params()
 
-         create_group_and_creative_res = inst.res_data
 
-         inst.update_intelligence_strategy_table()
 
-         logger.info("create group and creative request info: %s" % create_group_and_creative_res)
 
-         request = requests.post(create_group_and_creative_url,
 
-                                 headers=headers,
 
-                                 data=json.JSONEncoder().encode(create_group_and_creative_res)
 
-                                 )
 
-         response_data = json.loads(request.text)
 
-         logger.info("请求返回:%s" % response_data)
 
-         return {'code': 0, 'message': response_data}
 
-     else:
 
-         return {'code': -1, 'message': '暂时不支持非新增的操作请求!'}
 
- # 该类解析的是 手动请求的新增广告计划或者新增广告组的数据
 
- 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.get('group_info', None)
 
-         self.creative_info = self.request_data.get('creative_info',None)
 
-         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_receive_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)
 
-     def update_intelligence_strategy_table(self):
 
-         """
 
-         拼装之后的json, 更新到 ai_strategy_request_content
 
-         :return:
 
-         """
 
-         db_con = pymysql.connect(host=host,
 
-                                  port=port,
 
-                                  user=user,
 
-                                  password=passwd,
 
-                                  database=db,
 
-                                  charset=charset)
 
-         cursor = db_con.cursor()
 
-         cursor.execute("""UPDATE ctop_ai_kuaishou_intelligence_strategy
 
-                         SET ai_strategy_request_content= %s
 
-                         WHERE ai_strategy_uuid = %s""", (str(self.res_data), self.ai_strategy_uuid))
 
-         db_con.commit()
 
-         db_con.close()
 
-     # 如果手动请求的数据结构中,"campaign" 中的 campaign_id 为空则调用该新增计划方法
 
-     def add_campaign(self):
 
-         """
 
-         新增广告计划, 创建成功之后写入计划层级操作表中
 
-         :return:
 
-         """
 
-         create_campaign_req_data = \
 
-             {'account_id': self.account_id,
 
-              'campaign_name': self.campaign_info['campaign_name'],
 
-              'type': self.advertiser_strategy['campaign_type']}
 
-         request = requests.post(url=create_campaign_url,
 
-                                 headers=headers,
 
-                                 data=json.JSONEncoder().encode(create_campaign_req_data))
 
-         res_data = json.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.advertiser_strategy['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:
 
-             logger.info("广告计划创建失败:%s,  ai_strategy_uuid is %s" %
 
-                              (res_data['message'], self.ai_strategy_uuid))
 
-             return -1
 
-     def assemble_group_and_creative_params(self):
 
-         """
 
-         拼接组和创意层级参数
 
-         写入数据库
 
-         :return:
 
-         """
 
-         # 1、组层级基本信息
 
-         drop_cols = ['id', 'account_id', 'status', 'campaign_type', 'campaign_name', 'group_name',
 
-                      'creative_name', 'action_bar_text', 'description', 'short_slogan',
 
-                      'sticker_title', 'overlay_type', 'expose_tag', 'new_expose_tag', 'site_id',
 
-                      'click_track_url', 'impression_url', 'ad_photo_played_t3s_url', 'actionbar_click_url',
 
-                      'creative_category', 'creative_tag', 'image_cnt',
 
-                      'create_time', 'effective_time', 'expiry_time']
 
-         group_cols_to_list = ['app_store', 'scene_id', 'region', 'district_ids', 'ages_range', 'device_brand',
 
-                               'device_price', 'business_interest', 'fans_star', 'interest_video', 'app_interest',
 
-                               'app_ids', 'population', 'exclude_population', 'paid_audience', 'behavior_interest']
 
-         basic_group_info = self.advertiser_strategy.copy()
 
-         for col in drop_cols:
 
-             del basic_group_info[col]
 
-         # 3、从请求的信息中更新组层级信息, 如组的名称、测试定向、测试出价等, update客户策略信息
 
-         if (self.group_info is not None) and (len(self.group_info) > 0):
 
-             for key, value in self.group_info.items():
 
-                 basic_group_info.update({key: value})
 
-         # 发送的请求,这几个字段需要转为 [] 数组
 
-         group_info_to_res_data = basic_group_info.copy()
 
-         for col in group_cols_to_list:
 
-             group_info_to_res_data[col] = eval(group_info_to_res_data[col]) \
 
-                 if group_info_to_res_data[col] is not None else None
 
-         # 写入组层级操作记录数据表基本信息
 
-         group_info_to_db = basic_group_info.copy()
 
-         group_info_to_db['ai_strategy_uuid'] = self.ai_strategy_uuid
 
-         group_info_to_db['account_id'] = self.account_id
 
-         group_info_to_db['campaign_id'] = self.campaign_id
 
-         group_info_to_db['operation_type'] = self.operation_type
 
-         # 2、创意层级基本信息
 
-         creative_cols = ['creative_name',  'action_bar_text', 'description', 'short_slogan',
 
-                          'sticker_title', 'overlay_type', 'expose_tag', 'new_expose_tag', 'site_id',
 
-                          'click_track_url', 'impression_url', 'ad_photo_played_t3s_url', 'actionbar_click_url',
 
-                          'creative_category', 'creative_tag']
 
-         basic_creative_info = {}
 
-         for col in creative_cols:
 
-             basic_creative_info[col] = self.advertiser_strategy.get(col)
 
-         # 2.1从请求的信息中更新创意层级的信息,如广告语
 
-         if (self.creative_info is not None) and (len(self.creative_info) > 0):
 
-             for key, value in self.creative_info.items():
 
-                 basic_creative_info.update({key: value})
 
-         # 2.2
 
-         creative_info_to_res_data = basic_creative_info.copy()
 
-         creative_cols_to_list = ['creative_tag']
 
-         for col in creative_cols_to_list:
 
-             creative_info_to_res_data[col] = eval(creative_info_to_res_data[col]) \
 
-                 if creative_info_to_res_data[col] is not None else None
 
-         # 2.3 写入创意层级操作记录数据表基本信息
 
-         creative_info_to_db = basic_creative_info.copy()
 
-         creative_info_to_db['ai_strategy_uuid'] = self.ai_strategy_uuid
 
-         creative_info_to_db['account_id'] = self.account_id
 
-         creative_info_to_db['campaign_id'] = self.campaign_id
 
-         creative_info_to_db['operation_type'] = self.operation_type
 
-         # 拼接最终请求数据
 
-         self.res_data['group_list'] = []
 
-         group_cnt = 1
 
-         for video in self.video:
 
-             group_uuid = str(uuid.uuid4())
 
-             group_name = basic_group_info['group_name'] + '-' + str(group_cnt)
 
-             # 写入数据表中组信息
 
-             single_group_info_to_db = group_info_to_db.copy()
 
-             single_group_info_to_db['group_uuid'] = group_uuid
 
-             single_group_info_to_db['group_name'] = group_name
 
-             single_group_info_to_db['create_time'] = datetime.datetime.now()
 
-             df = pd.DataFrame.from_dict(single_group_info_to_db, orient='index').T
 
-             df.to_sql(name="ctop_ai_kuaishou_unit_level_operation_record",
 
-                       con=engine,
 
-                       if_exists='append',
 
-                       index=False)
 
-             # 拼装返回json的组信息
 
-             single_group_info_to_res_data = group_info_to_res_data.copy()
 
-             single_group_info_to_res_data['group_uuid'] = group_uuid
 
-             single_group_info_to_res_data['group_name'] = group_name
 
-             single_group_info_to_res_data['creative_list'] = []
 
-             group_cnt += 1
 
-             # 拼装组下面创意的信息
 
-             creative_cnt = 1
 
-             for image_md5 in video['imageList'][: self.advertiser_strategy['image_cnt']]:
 
-                 creative_uuid = str(uuid.uuid4())
 
-                 creative_name = basic_creative_info['creative_name'] + '_' + str(creative_cnt)
 
-                 single_creative_info_to_db = creative_info_to_db.copy()
 
-                 single_creative_info_to_db['creative_uuid'] = creative_uuid
 
-                 single_creative_info_to_db['creative_name'] = creative_name
 
-                 single_creative_info_to_db['photo_id'] = video['photo_id']
 
-                 single_creative_info_to_db['image_md5'] = image_md5
 
-                 single_creative_info_to_db['create_time'] = datetime.datetime.now()
 
-                 df = pd.DataFrame.from_dict(single_creative_info_to_db, orient='index').T
 
-                 df.to_sql(name="ctop_ai_kuaishou_creative_level_operation_record",
 
-                           con=engine,
 
-                           if_exists='append',
 
-                           index=False)
 
-                 single_creative_info_to_res_data = creative_info_to_res_data.copy()
 
-                 single_creative_info_to_res_data['creative_uuid'] = creative_uuid
 
-                 single_creative_info_to_res_data['creative_name'] = creative_name
 
-                 single_creative_info_to_res_data['photo_id'] = video['photo_id']
 
-                 single_creative_info_to_res_data['image_md5'] = image_md5
 
-                 single_group_info_to_res_data['creative_list'].append(single_creative_info_to_res_data)
 
-                 creative_cnt += 1
 
-             # 组和创意信息添加到最终返回数据 group_list 中
 
-             self.res_data['group_list'].append(single_group_info_to_res_data)
 
-         self.res_data['account_id'] = self.account_id
 
-         self.res_data['campaign_id'] = self.campaign_id
 
- # TODO 修改操作
 
- class ParseModifyRequest(object):
 
-     def __init__(self):
 
-         pass
 
- # TODO 关停操作
 
- class ParseShutDownRequest(object):
 
-     def __init__(self):
 
-         pass
 
 
  |