liyuyi@c-top.com.cn 4 年之前
父节点
当前提交
6d33164aba

+ 6 - 0
.idea/encodings.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="Encoding">
+    <file url="file://$PROJECT_DIR$/logs/add_group_log/ai_strategy_request.log.2021-01-14" charset="GBK" />
+  </component>
+</project>

Python.gitignore → ai_ads.gitignore


+ 4 - 5
ai_callback_add_creative_handler.py

@@ -57,17 +57,16 @@ class UpdateCreativeLevelRecordTable(object):
                                  database=db,
                                  charset=charset)
         cursor = db_con.cursor()
-        for item in self.data['callbackdata']:
+        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))
+                cursor.execute("""UPDATE ctop_ai_kuaishou_creative_level_operation_record
+                        SET unit_id= %s, creative_id=%s
+                        WHERE creative_uuid = %s""", (unit_id, creative_id, creative_uuid))
             else:
                 self.logger.error("on single update callback info: %s" % item)
 

+ 2 - 2
ai_callback_add_group_handler.py

@@ -57,12 +57,12 @@ class UpdateGroupLevelRecordTable(object):
                                  database=db,
                                  charset=charset)
         cursor = db_con.cursor()
-        for item in self.data['callbackdata']:
+        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']
+                unit_create_time = item['group_create_time']
                 self.logger.info("on single update callback info: %s" % item)
 
                 cursor.execute("""UPDATE ctop_ai_kuaishou_unit_level_operation_record

+ 82 - 87
ai_strategy_request_handler.py

@@ -32,34 +32,41 @@ class AiStrategyRequestParse(tornado.web.RequestHandler):
         # 1、新增广告组操作
         try:
             if data["operation_type"] == 1:
-                inst = ParseAddCampaignOrAddGroupRequest(data)
+                inst = ParseAddCampaignOrAddGroupRequest(data,self.logger)
                 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
+                        raise Exception('广告计划创建失败')
 
                 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)
+                inst.update_intelligence_strategy_table()
+                self.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)
+                                        )
                 create_group_and_creative_response_data = simplejson.loads(request.text)
+                self.logger.info("请求返回:%s" % create_group_and_creative_response_data)
+                self.write(json.dumps({'account_id': inst.account_id, 'ai_strategy_id': inst.ai_strategy_uuid,
+                                       'message': create_group_and_creative_response_data}))
+                self.flush()
+            else:
+                self.write(json.dumps({"message": "operation_type 不支持"}))
+                self.flush()
         except Exception:
             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.flush()
-
+            self.write(json.dumps(traceback.format_exc()))
+            self.flush()
 
 # 该类解析的是 手动请求的新增广告计划或者新增广告组的数据
 class ParseAddCampaignOrAddGroupRequest(object):
-    def __init__(self, request_data):
+    def __init__(self, request_data, logger):
         self.ai_strategy_uuid = str(uuid.uuid4())
         self.request_data = request_data
+        self.logger = logger
         self.video = self.request_data['video']
         self.account_id = self.request_data['account_id']
         self.campaign_info = self.request_data['campaign_info']
@@ -100,7 +107,7 @@ class ParseAddCampaignOrAddGroupRequest(object):
                 '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_receive_content': str(self.request_data),
                 'ai_strategy_remark': self.request_data['ai_strategy_remark'],
                 'create_time': datetime.datetime.now()
             }
@@ -108,6 +115,24 @@ class ParseAddCampaignOrAddGroupRequest(object):
         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):
         """
@@ -121,23 +146,25 @@ class ParseAddCampaignOrAddGroupRequest(object):
                               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"}
+        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(url=create_campaign_url,
+                                headers=headers,
+                                data=json.JSONEncoder().encode(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 = {
@@ -189,68 +216,25 @@ class ParseAddCampaignOrAddGroupRequest(object):
         #             (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']}
+        drop_cols = ['id', 'account_id', 'status', 'campaign_type',
+                     'site_id', 'click_track_url', 'impression_url', 'ad_photo_played_t3s_url',
+                     'actionbar_click_url',
+                     'create_time', 'effective_time', 'expiry_time']
+        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、从请求的信息中更新计划层级信息
         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:
@@ -272,6 +256,10 @@ class ParseAddCampaignOrAddGroupRequest(object):
                       if_exists='append',
                       index=False)
 
+            # 发送的请求,这几个字段需要转为 [] 数组
+            for col in cols_to_list:
+                single_group_info[col] = eval(single_group_info[col]) if single_group_info[col] is not None else None
+
             single_group_info['creative_list'] = []
             group_cnt += 1
 
@@ -308,6 +296,13 @@ class ParseAddCampaignOrAddGroupRequest(object):
                 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
+
+                cols_to_str = ['creative_tag']
+                for col in cols_to_str:
+                    single_creative_info_to_db[col] = str(single_creative_info_to_db[col]) \
+                        if single_creative_info_to_db[col] is not None else None
+
+
                 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",

+ 3 - 1
db_config.py

@@ -20,6 +20,8 @@ charset = 'utf8'
 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'})
 
+
+headers = {'Content-Type': 'application/json'}
 # 创建计划url
 create_campaign_url = "http://192.168.1.8:8080/jeecg-boot/kuaishou/create/campaignCreate"
 
@@ -30,6 +32,6 @@ get_new_video_url = "http://192.168.1.8:8080/jeecg-boot/kuaishou/material/getNew
 get_history_video_url = "http://192.168.1.8:8080/jeecg-boot/kuaishou/material/getHistoryVideoList"
 
 # 创建组和创意url
-create_group_and_creative_url = ""
+create_group_and_creative_url = "http://192.168.1.8:8080/jeecg-boot/kuaishou/create/createUnitAndCreative"
 
 

文件差异内容过多而无法显示
+ 172 - 15
logs/add_group_log/ai_callback_add_creative.log


文件差异内容过多而无法显示
+ 306 - 116
logs/add_group_log/ai_callback_add_group.log


文件差异内容过多而无法显示
+ 1077 - 1525
logs/add_group_log/ai_strategy_request.log


+ 0 - 4
main.py

@@ -81,10 +81,6 @@ def create_application():
 
 
 if __name__ == "__main__":
-    # import platform
-    # if platform.system() == 'Windows':
-    #     import asyncio
-    #     asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
     parser = argparse.ArgumentParser()
     parser.add_argument('-p', '--port', type=int, default=31012)
     args = parser.parse_args()

+ 43 - 83
manual_request_json.py

@@ -12,96 +12,56 @@ import numpy as np
 from sqlalchemy import create_engine
 from db_config import *
 import traceback
+from urllib import parse
 
 
-def get_video(acc_id, start_time, end_time, video_cnt):
+def main():
+    account_id = 23212
+    day_delta = 10
+    video_cnt = 2
+    start_date = (datetime.datetime.now() + datetime.timedelta(days=-day_delta)).strftime("%Y-%m-%d %H:%M:%S")
+    end_date = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
     # url = "http://192.168.1.8:8080/jeecg-boot/kuaishou/Ai/getNewVideoList"
-    # request_data = {'account_id': acc_id, 'start_time': start_time, 'end_time': end_time, 'video_cnt': video_cnt}
-    # request = requests.post(url, request_data)
-    # res_data = simplejson.loads(request.text)
-    res_data = {
-        "code": 0,
-        "data": [
-            {
-                "video_url": "http://ucmov.a.yximgs.com/upic/2021/01/07/11/BMjAyMTAxMDcxMTI4MTlfMTI1MDY0NTMyOV80MTk5NzI5Njc0Ml8wXzM=_b_B210bce3effacab7744fa87897f2b4662.mp4?tag=1-1609990769-unknown-0-9ercfqrqp4-dd65af98d83fca04&clientCacheKey=3xigm8jk8fqbti6_b.mp4&tt=b&di=811c96e5&bp=13890",
-                "photo_id": "5227271831775447110",
-                "signature": "ed963b1333fe607d563d5cb0d916b65b",
-                "stat_date": "2021-01-12 10:57:26",
-                "channel_type": 0,
-                "imageList": [
-                    "5ce93696dac9a326ff18505f49391297",
-                    "a368dd69d95539f26f5bee9d1580ccf8",
-                    "33b3e1a2cad48a2309d6ce351e6082fd",
-                    "56f6a8ec736dcdb17a2f052ebfcc255e",
-                    "addd5dc29c52ef863a40c6b688ce7951",
-                    "cb6e10ec5258145056aaafad647e1c36",
-                    "763344141ace6707c79f54bba3db5d1a",
-                    "86e061c34bf675690cb57943d8675130",
-                    "5d5258e7ff4af9dbb196e10ec4e878ce",
-                    "59ca244d88e7f23ef47744110e753bac",
-                    "260e0f08aebbf168b5fd80ee864b2e4c",
-                    "49a551a978d7dd182a04bd6af7e0c08d",
-                    "0c5c43f3b2c215e66d646fb9c03e110b",
-                    "44731b7d8b7e93ac12e8dcf3d34cc272",
-                    "2227f6cc89a5c0f242e04762b0444032"
-                ]
-            },
-            {
-                "video_url": "http://sjymov.a.yximgs.com/upic/2020/12/03/15/BMjAyMDEyMDMxNTEyNDZfMTI1MDY0NTMyOV80MDE1Mjg1MDE5OV8wXzM=_b_B7fd27f653e6af4e8cf0979041e31a38b.mp4?tag=1-1606982411-unknown-0-1ksr2io24f-3a57957a462092c7&clientCacheKey=3xmtw52hxui5j7k_b.mp4&tt=b&di=8bba1fd5&bp=13890",
-                "photo_id": "5211227760959967759",
-                "signature": "fc7717ac4f08316e81aa463c720226c2",
-                "stat_date": "2021-01-12 10:57:21",
-                "channel_type": 0,
-                "imageList": [
-                    "11836a6a4042b254a64bd9a6ca99f9b5",
-                    "82349cfa1e26bd17397a303b85dd0fbb",
-                    "04b1dc6793b0d2a65d8f8b45ce37744d",
-                    "4165fa246defbced026558d62ef30ed5",
-                    "064af2a19b313c0c436f6c2e4d2384eb",
-                    "13997aaa0294bcf1ca0c27a43aecceb2",
-                    "fb138ea0251f0a1c243cb287f1f865d8",
-                    "83e9292549f9617ceb5cb468cd5cce0d",
-                    "4bf798acb18747baacec0762d76e2006",
-                    "74d7b71c4e7be44d12cd7af03568053b",
-                    "b74620eeaa6c19620530b7cb553e954d",
-                    "2a1c907e5e3cf0cf2e871e5df16cca8f",
-                    "981660adc052f807ece9155124290ae1",
-                    "1247852f30b51511b510ef3b2d7f0b70",
-                    "b13119ff3fb326adfdcd04bb87324d02"
-                ]
-            }
-        ],
-        "message": "SUCCESS"
-    }
+    url = "http://192.168.1.8:8080/jeecg-boot/kuaishou/material/getHistoryVideoList"
+    video_request_data = {'accountId': account_id, 'startDate': start_date, 'endDate': end_date, 'num': video_cnt,
+                          'createCount': 10}
+    print(json.JSONEncoder().encode(video_request_data))
+    # 定义请求header
+    HEADERS = {'Content-Type': 'application/json'}
+    request = requests.post(url, headers=HEADERS, data=json.JSONEncoder().encode(video_request_data))
+
+    res_data = simplejson.loads(request.text)
     if res_data["code"] != 0:
-        return
-    else:
-        return res_data["data"]
+        return "没有视频信息"
 
+    request_dict = {"video": res_data['data'],
+                    'operation_type': 1,
+                    "account_id": 23212,
+                    'ai_strategy_remark': "打捞历史素材",
+                    "campaign_info": {
+                        "campaign_id": "",
+                        "campaign_name": '广告计划名称-' + str(datetime.datetime.now()),
+                        # "campaign_name": '广告计划名称Test',
+                        "campaign_type": 2
 
-def get_request_params():
-    video_dict = get_video(account_id, start_date, end_date, video_cnt)
-    if video_dict is None:
-        return
+                    },
+                    'group_info': {'cpa_bid': 22000,
+                                   'unit_name': '户14-上下滑&信息流-剪辑-低价-低价包邮-活动-年龄18岁以上-单出价' +\
+                                                '-' + str(datetime.datetime.now()),
+                                   'begin_time': str(datetime.date.today())},
+                    'creative_info': {'creative_name': '自定义创意',
+                                      'creative_category': 20101,
+                                      'creative_tag': ['起量', '搞笑'],
+                                      'action_bar_text': '一键下载',
+                                      'description': '不买亏大了!众多商品低至一元!看看你多花了多少冤枉钱!'}}
 
-    request_dict = {
-                    "video": video_dict,
-                    "operation_type": operation_type,
-                    "group": {},
-                    "campaign": {}
-                    }
-    request_dict["group"]["cpa_bid"] = cpa_bid
-    request_json = json.dumps(request_dict)
-    return request_json
+    add_request_data = json.dumps(request_dict)
+    url = 'http://127.0.0.1:31012/ai_strategy_request'
+    request = requests.post(url, add_request_data)
+    print(request.text)
+    res_data = simplejson.loads(request.text)
+    print(res_data)
 
 
 if __name__ == '__main__':
-    account_id = 9556344
-    day_delta = 10
-    video_cnt = 10
-    start_date = (datetime.datetime.now()+datetime.timedelta(days=-day_delta)).strftime("%Y-%m-%d %H:%M:%S")
-    end_date = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
-
-    operation_type = "add"
-    cpa_bid = 22000
-    print(get_request_params())
+    print(main())