Bläddra i källkod

MOD:后台v1.6

cxyu 3 år sedan
förälder
incheckning
96f8ebda04

+ 13 - 1
.gitignore

@@ -1 +1,13 @@
-settings.py
+settings.py
+.vscode/
+.idea/
+*.pyc
+*.log*
+nohup.out
+config.py
+local_config.py
+
+*.png
+#
+*.txt
+*.xlsx

+ 1 - 0
ReadMe

@@ -0,0 +1 @@
+selenium-docker

+ 8 - 6
web_module/tornado_api.py

@@ -122,7 +122,9 @@ class create_ad_plan(BaseHandler):
             # 2.历史记录
             print(_)
             for action_type in ['create_ad_plan', 'create_ad_layout']:
-                object_name = _['title'] if action_type == 'create_ad_plan' else _['idea']['jump_type_page_type']['layout_name']
+                object_name = _['title'] if action_type == 'create_ad_plan' else _['idea']['jump_type_page_type'][
+                    'layout_name']
+                object_name = object_name.replace(' ', '')[:29]
                 action_info = {'user_id': user_id, 'service_name': _['service_name'], 'wechat_name': _['wechat_name'],
                                'action_type': action_type, 'object_name': object_name, 'task_name': task_name,
                                'status': 'todo'}
@@ -132,8 +134,8 @@ class create_ad_plan(BaseHandler):
         sql_session.commit()
 
         # 4.开始运行
-        # threading.Thread(target=user_action.create_ad_plan,
-        #                  args=(user_id, ad_plan_name, wechat_json, log_ad, db, cookie_canuse)).start()
+        threading.Thread(target=user_action.carry_plan,
+                         args=(user_id, ad_plan_list, log_ad, db, cookie_canuse)).start()
 
 
 class get_ad_plan_local(BaseHandler):
@@ -417,7 +419,7 @@ class delete_ad_plan(BaseHandler):
         # 落地页名字精确到毫秒,默认是全局唯一
 
         sql_tools.delete_ad_plan_typesetting_vir(sql_session=sql_session, user_id=user_id,
-                                                 typesetting_name=plan_name,wechat_name=wechat_name,
+                                                 typesetting_name=plan_name, wechat_name=wechat_name,
                                                  service_name=service_name)
         self.write({'status': {'msg': 'success', "RetCode": 200}})
 
@@ -523,7 +525,7 @@ class get_task_list(BaseHandler):
 
 
 class get_all_ad_task(BaseHandler):
-    #TODO:添加两个字段,微信,朋友圈
+    # TODO:添加两个字段,微信,朋友圈
     def get(self):
         user_id = self.get_argument('user_id', None)
         sql_session = db.DBSession()
@@ -572,7 +574,7 @@ def make_app():
         ("/get_ad_wechat_service_name", get_ad_wechat_service_name),
         ("/get_ad_wechat_wechat_name", get_ad_wechat_wechat_name),
         # ("/create_ad_plan_local", create_ad_plan_local),
-        # ("/create_ad_layout_local", create_ad_layout_local),
+        ("/create_ad_layout_local", create_ad_layout_local),
         ("/get_layout_local", get_ad_layout_local),
         ("/get_ad_plan_local", get_ad_plan_local),
         ("/delete_layout_local", delete_ad_layout),

+ 52 - 24
web_module/user_action.py

@@ -7,8 +7,8 @@ from sqlalchemy import Table
 import json
 import time
 
-layout_create_action = 'layout_create'
-ad_plan_create_action = 'ad_plan_create'
+layout_create_action = 'create_ad_layout'
+ad_plan_create_action = 'create_ad_plan'
 
 
 def run(user_id, log_ad, db, cookie_canuse):
@@ -53,9 +53,54 @@ def cookie_acion(db, log_ad, cookie_canuse, user_id):
             sql_session.commit()
         print('update wechat cookies')
 
-def carry_plan():
-    #TODO:action_record涉及到的地方都需要改动
-    pass
+
+def carry_plan(user_id, ad_plan_list, log_ad, db, cookie_canuse):
+    # TODO:action_record涉及到的地方都需要改动
+
+    action_record_table = Table('action_record', db.metadata,
+                                autoload=True, autoload_with=db.engine)
+    sql_session = db.DBSession()
+
+    # cookies保存
+    cookie_acion(db, log_ad, cookie_canuse, user_id)
+
+    for _ in ad_plan_list:
+        service_name = _['service_name']
+        wechat_name = _['wechat_name']
+        # 1.检查1.落地页是否创建过了
+        log_ad.select_ad_master(service_name, wechat_name)
+        create_ad_layout = CreateAd(login_ad=log_ad, service_name=service_name, wechat_name=wechat_name)
+        create_ad_layout.check_sucess_ready()
+        # TODO:现在默认layout_name在30个字符以内
+        layout_name = _['idea']['jump_type_page_type']['layout_name'].replace(' ', '')[:29]
+        if create_ad_layout.check_sucess(layout_name=layout_name):
+            res = {'sucess': True, 'result_info': '已经创建过对应落地页'}
+            sql_tools.action_record(res, sql_session, layout_create_action, user_id, layout_name, action_record_table,
+                                    service_name, wechat_name)
+
+        else:
+            # 1.5无则创建落地页
+            create_ad_layout.get_into_create_page()
+            layout_typesetting_dict = sql_tools.get_layout_typesetting(sql_session, user_id,
+                                                                       typesetting_name=layout_name)
+            layout_typesetting_dict = json.loads(layout_typesetting_dict)
+            res = create_ad_layout.create_layout(layout_typesetting_dict)
+            sql_tools.action_record(res, sql_session, layout_create_action, user_id, layout_name, action_record_table,
+                                    service_name, wechat_name)
+        log_ad.refresh_driver()
+        # 3.创建计划
+        # TODO:添加计划是否创建检查,现默认计划没有重复
+        log_ad.select_ad_master(service_name, wechat_name)
+        plan_name = _['title'].replace(' ', '')[:29]
+        # plan_typesetting_dict = sql_tools.get_ad_plan_typesetting(sql_session=sql_session, user_id=user_id,
+        #                                                           typesetting_name=plan_name)
+        create_ad_plan = CreateAdPlan(login_ad=log_ad, task=_)
+        res = create_ad_plan.run()
+        # 4.更新action_record相关计划信息
+        sql_tools.action_record(res, sql_session, ad_plan_create_action, user_id, plan_name, action_record_table,
+                                service_name, wechat_name)
+        #TODO:添加final ,来关闭chrome
+
 
 # TODO:这里都是线程调度的函数,设定线程生命周期最长60分钟
 
@@ -133,7 +178,7 @@ def create_layout(user_id, layout_name, wechat_json, log_ad, db, cookie_canuse):
     sql_session = db.DBSession()
     # 等待页面加载完成
 
-    # 1.cookies保存
+    # cookies保存
     cookie_acion(db, log_ad, cookie_canuse, user_id)
 
     # 获取到对应layout
@@ -146,14 +191,6 @@ def create_layout(user_id, layout_name, wechat_json, log_ad, db, cookie_canuse):
     typesetting_dict[-4] = {'layout_name': layout_name}
     # action 进行对应记录
     wechat_json = json.loads(wechat_json)
-    for _ in wechat_json:
-        action_info = {'user_id': user_id, 'service_name': _['service_name'], 'wechat_name': _['wechat_name'],
-                       'action_type': json.dumps({'action_type': layout_create_action, 'object_name': layout_name}),
-                       'status': 'todo'}
-        record_insert = sql_tools.save_action_record(action_record_info=action_info,
-                                                     table_action_record=action_record_table)
-        sql_session.execute(record_insert)
-        sql_session.commit()
 
     for _ in wechat_json:
         service_name = _['service_name']
@@ -179,6 +216,7 @@ def create_layout(user_id, layout_name, wechat_json, log_ad, db, cookie_canuse):
                 pass
             # TODO:截图,传回错误信息
         action_type = layout_create_action
+        # TODO:进行对应数据修改
         sql_tools.action_record(res, sql_session, action_type, user_id, layout_name, action_record_table, service_name,
                                 wechat_name)
         log_ad.refresh_driver()
@@ -212,16 +250,6 @@ def create_ad_plan(user_id, ad_plan_name, wechat_json, log_ad, db, cookie_canuse
     typesetting_dict['title'] = ad_plan_name
     # action 进行对应记录
     wechat_json = json.loads(wechat_json)
-    for _ in wechat_json:
-        # TODO:有时间看看 create_layout与create_ad_plan是否需要合并
-        # TODO:action_type 名字设置
-        action_info = {'user_id': user_id, 'service_name': _['service_name'], 'wechat_name': _['wechat_name'],
-                       'action_type': json.dumps({'action_type': 'ad_plan_create', 'object_name': ad_plan_name}),
-                       'status': 'todo'}
-        record_insert = sql_tools.save_action_record(action_record_info=action_info,
-                                                     table_action_record=action_record_table)
-        sql_session.execute(record_insert)
-        sql_session.commit()
 
     for _ in wechat_json:
         service_name = _['service_name']

+ 7 - 0
wechat_action/create_ad_layout.py

@@ -632,6 +632,13 @@ class CreateAd:
         self.driver.find_element_by_xpath('/html/body/div[6]/div/div/div[2]/div/div[3]/button[2]').click()
         time.sleep(1)
 
+    def check_sucess_ready(self):
+        # 基于混乱页面情况,进入检查
+        self.log_ad.refresh_driver()
+        self.log_ad.select_ad_master(self.service_name, self.wechat_name)
+        self.driver.find_element_by_id('material').click()
+        WebDriverWait(self.driver, 30).until(lambda driver: driver.find_element_by_class_name('ui-fl-r'))
+
     def check_sucess(self, layout_name):
         # 进入素材中心
         WebDriverWait(self.driver, 100).until(

+ 4 - 4
wechat_action/create_ad_plan_idea.py

@@ -62,7 +62,7 @@ class IdeaAction:
             input_elements = self.driver.find_element_by_xpath('//*[@class="adui-input-base"]')
             for _ in input_elements:
                 if _.get_attribute("placeholder") == '输入关键字搜索推广页':
-                    _.send_keys(idea_dic['jump_type_page_type'])
+                    _.send_keys(idea_dic['jump_type_page_type']['layout_name'])
                     _.send_keys(Keys.RETURN)
             WebDriverWait(self.driver, 30).until(
                 lambda driver: self.driver.find_elements_by_xpath('//*[@class="adui-table-cellInner"]'))
@@ -70,7 +70,7 @@ class IdeaAction:
             page_elements = self.driver.find_elements_by_xpath('//*[@class="adui-table-cellInner"]')
             for _ in page_elements:
                 # 推广页的名字需要一模一样
-                if _.text == idea_dic['jump_type_page_type']:
+                if _.text == idea_dic['jump_type_page_type']['layout_name']:
                     _.click()
             time.sleep(random.uniform(0.1, 0.2))
 
@@ -254,7 +254,7 @@ class IdeaAction:
         input_elements = self.driver.find_elements_by_xpath('//*[@class="adui-input-base"]')
         for _ in input_elements:
             if _.get_attribute("placeholder") == '输入关键字搜索推广页':
-                _.send_keys(self.task['idea']['jump_type_page_type'])
+                _.send_keys(self.task['idea']['jump_type_page_type']['layout_name'])
                 _.send_keys(Keys.RETURN)
         # TODO:有空去除这个时间,使用等待
         time.sleep(random.uniform(0.5, 1))
@@ -264,7 +264,7 @@ class IdeaAction:
         page_elements = self.driver.find_elements_by_xpath('//*[@class="adui-table-cellInner"]')
         for _ in page_elements:
             # 推广页的名字需要一模一样
-            if _.text == self.task['idea']['jump_type_page_type']:
+            if _.text == self.task['idea']['jump_type_page_type']['layout_name']:
                 _.click()
         time.sleep(random.uniform(0.1, 0.2))
 

+ 4 - 2
wechat_action/sql_tools.py

@@ -255,16 +255,18 @@ def get_action_status(sql_session, user_id):
     return result
 
 
-def action_record(res, sql_session, action_type, user_id, object_name, action_table, service_name, wechat_name):
+def action_record(res, sql_session, action_type, user_id, object_name, action_table, service_name,
+                  wechat_name):
     print('get in action record ', service_name, wechat_name, res)
     status = 'done' if res['sucess'] else 'error'
-    action_type = json.dumps({'action_type': action_type, 'object_name': object_name})
     print(action_type)
     update_res = action_table.update() \
         .where(action_table.c.service_name == service_name) \
         .where(action_table.c.wechat_name == wechat_name) \
         .where(action_table.c.user_id == user_id) \
+        .where(action_table.c.object_name == object_name) \
         .where(action_table.c.action_type == action_type) \
+        .where(action_table.c.status == 'todo') \
         .values({
         action_table.c.status: status,
         action_table.c.result: res['result_info']