Pārlūkot izejas kodu

ADD:添加wechat 修改服务商 更新cookie

cxyu 3 gadi atpakaļ
vecāks
revīzija
98678448eb

+ 20 - 3
web_module/tornado_api.py

@@ -280,7 +280,7 @@ class ad_human_info(BaseHandler):
         cookie_db = sql_tools.get_wechat_cookies(sql_session, user_id=user_id)
 
         # 进行登录操作
-        log_ad = LogIn()
+        log_ad = LogIn(user_id=user_id)
 
         # 使driver可以使用
         cookie_canuse = False
@@ -528,7 +528,6 @@ class get_task_list(BaseHandler):
 
 
 class get_all_ad_task(BaseHandler):
-    # TODO:添加两个字段,微信,朋友圈
     def get(self):
         user_id = self.get_argument('user_id', None)
         sql_session = db.DBSession()
@@ -595,11 +594,29 @@ def make_app():
         ("/ad_wechat_info", ad_wechat_info),
         # ("/ad_status", ad_status),
         ("/get_plan_action_record", get_plan_action_record),
-        ("/get_task_list", get_task_list)
+        # ("/get_task_list", get_task_list)
     ], debug=True, autoreload=True)
 
 
 if __name__ == "__main__":
+    import logging
+
+    logging.basicConfig(
+        handlers=[
+            logging.handlers.RotatingFileHandler('./tornado.log',
+                                                 maxBytes=10 * 1024 * 1024,
+                                                 backupCount=5,
+                                                 encoding='utf-8')
+            , logging.StreamHandler()  # 供输出使用
+        ],
+        level=logging.INFO,
+        format="%(asctime)s - %(levelname)s %(filename)s %(funcName)s %(lineno)s - %(message)s"
+    )
+    handler = logging.FileHandler('tornado.log')
+    logger=logging.getLogger()
+    logger.addHandler(handler)
+    logger.setLevel(logging.INFO)
+    logger.info('foo')
     tornado.log.LogFormatter()
     app = make_app()
     app.listen(8888)

+ 5 - 5
web_module/user_action.py

@@ -69,11 +69,9 @@ def carry_plan(user_id, ad_plan_list, log_ad, db, cookie_canuse):
             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):
+            if CreateAd.check_sucess_api(layout_name=layout_name, log_ad=log_ad):
                 res = {'sucess': True, 'result_info': '已经创建过对应落地页'}
                 sql_tools.action_record(res, sql_session, layout_create_action, user_id, layout_name,
                                         action_record_table,
@@ -81,6 +79,7 @@ def carry_plan(user_id, ad_plan_list, log_ad, db, cookie_canuse):
 
             else:
                 # 1.5无则创建落地页
+                create_ad_layout = CreateAd(login_ad=log_ad, service_name=service_name, wechat_name=wechat_name)
                 create_ad_layout.get_into_create_page()
                 layout_typesetting_dict = sql_tools.get_layout_typesetting(sql_session, user_id,
                                                                            typesetting_name=layout_name)
@@ -96,7 +95,7 @@ def carry_plan(user_id, ad_plan_list, log_ad, db, cookie_canuse):
             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=_)
+            create_ad_plan = CreateAdPlan(login_ad=log_ad, task=_, service_name=service_name, wechat_name=wechat_name)
             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,
@@ -276,7 +275,8 @@ def create_ad_plan(user_id, ad_plan_name, wechat_json, log_ad, db, cookie_canuse
         if sql_tools.check_plan_alive(sql_session, service_name, wechat_name, ad_plan_name):
             continue
         log_ad.select_ad_master(service_name, wechat_name)
-        res = CreateAdPlan(login_ad=log_ad, task=typesetting_dict).run()
+        res = CreateAdPlan(login_ad=log_ad, task=typesetting_dict, service_name=service_name,
+                           wechat_name=wechat_name).run()
         print(res)
         if not res['sucess']:
             now_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())

+ 24 - 9
wechat_action/create_ad_layout.py

@@ -326,7 +326,7 @@ class CreateAd:
 
     def set_content(self, config_info):
         # TODO:长文本需要优化输入时间
-
+        logging.info(' 开始设置文本模块')
         # 设置文本模块
         # 1.文本内容2.文本颜色3.是否加粗4.文本位置设置5.文本大小
 
@@ -408,7 +408,7 @@ class CreateAd:
             distance_buttons_can_use[1].click()
             for i in range(4):
                 distance_buttons_can_use[1].send_keys(Keys.BACKSPACE)
-            distance_buttons_can_use[1].send_keys(config_info['str_dimarginBottomstance'])
+            distance_buttons_can_use[1].send_keys(config_info['marginBottom'])
 
     def set_follow_button(self, config_info):
         # TODO:是否一键关注
@@ -632,14 +632,28 @@ 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'))
+    @staticmethod
+    def check_sucess_api(log_ad, layout_name):
+        # 默认在进入公众号初始页面
+        logging.info('开始检查落地页是否创建成功')
+        WebDriverWait(log_ad.driver, 100).until(
+            lambda driver: True if 'token' in log_ad.driver.current_url else False)
+        cookie_dict = log_ad.get_cookie(log_ad.driver, login_cookie=False)
+        token_id = re.findall('token=(\d+)', log_ad.driver.current_url)[0]
+        requests.session()
+        layout_url = 'https://mp.weixin.qq.com/promotion/landingpage_manager?action=list_pages&page=1&page_size=10&canvas_name={layout_name}&login_from=&is_grant=0&owner_uid=&token={wechat_token}&appid=&spid=&_={time_}'.format(
+            layout_name=layout_name, wechat_token=token_id, time_=int(time.time() * 1000))
+        session = requests.session()
+        rsp = session.get(url=layout_url, cookies=cookie_dict)
+        result_json = rsp.json()
+        if 'landing_page_list' in result_json.keys():
+            if len(result_json['landing_page_list']):
+                logging.info('对应落地页存在于微信后台')
+                return True
 
     def check_sucess(self, layout_name):
+        # TODO:检查使用接口实现
+
         # 进入素材中心
         WebDriverWait(self.driver, 100).until(
             lambda x: self.driver.find_element_by_id('material'))
@@ -681,7 +695,7 @@ class CreateAd:
             self.set_share_content(title_content=layout['shareTittle'], des_content=layout['shareDesc'])
 
             self.remove_all_file()
-            if self.check_sucess(layout_name=layout['layoutName']):
+            if self.check_sucess_api(layout_name=layout['layoutName'], log_ad=self.log_ad):
                 return {'sucess': True, 'result_info': ''}
             else:
                 if err_num > 3:
@@ -693,6 +707,7 @@ class CreateAd:
                     self.get_into_create_page()
                     return self.create_layout(layout, err_num=err_num + 1)
         except Exception as e:
+            print(e)
             raise
             # TODO:有空时讲 e 内容设置为原始内容
             if err_num > 3:

+ 34 - 39
wechat_action/create_ad_plan.py

@@ -1,24 +1,22 @@
-from selenium import webdriver
 from selenium.webdriver import ActionChains
-from selenium.webdriver.common.by import By
-from selenium.webdriver.support import expected_conditions as EC
 from selenium.webdriver.support.wait import WebDriverWait
 from wechat_action.create_ad_plan_idea import IdeaAction
 from wechat_action.human_ad import HumanAd
 from selenium.webdriver.common.keys import Keys
-from wechat_action.login_ad import LogIn
-from selenium.webdriver import ChromeOptions
 import re
 import time
 import logging
 import random
+import requests
 
 
 class CreateAdPlan():
     # TODO:因为人群包现在可能存在唯一性,公众号间的复制,需要怎么处理
-    def __init__(self, task, login_ad):
+    def __init__(self, task, login_ad, service_name, wechat_name):
         self.task = task
         # self.task_check()
+        self.service_name = service_name
+        self.wechat_name = wechat_name
         self.login_ad = login_ad
         self.driver = login_ad.get_driver_loged()
         self.ad_idea_action = IdeaAction(self.driver, task)
@@ -306,35 +304,23 @@ class CreateAdPlan():
         #     exit()
         pass
 
-    def check_is_sucess(self, plan_name):
+    def check_is_sucess(self):
         logging.info('检查广告计划创建是否成功')
-        # TODO:进一步修改
-
-        # 进入搜索页面,
-        click_elements = self.driver.find_elements_by_xpath('//*[contains(@class, "navItem-3MjWMCbkWT")]/span')
-        for _ in click_elements:
-            if '广告' in _.text:
-                _.click()
-
-        time.sleep(random.uniform(0.1, 0.2))
-        # 设置状态为--审核中
-        choice_elements = self.driver.find_elements_by_xpath('//*[contains(@class, "tag-3loTlkncVq")]/span')
-        for _ in choice_elements:
-            if '状态' in _.text:
-                _.click()
-        time.sleep(random.uniform(0.1, 0.2))
-        lable_elements = self.driver.find_elements_by_xpath('//*[contains(@class, "label-2ZOAbuO31o")]/span')
-        for _ in lable_elements:
-            if '审核中' in _.text:
-                _.click()
-
-        # 输入搜索字段
-        input_element = self.driver.find_element_by_xpath('//*[contains(@class, "search-2yiDvyFHoH")]/span')
-        input_element.click()
-        time.sleep(random.uniform(0.1, 0.2))
-        input_element.send_keys()
-
-        # 查看有无对应数据
+        plan_name = self.task['title'].replace(' ', '')[:29]
+        WebDriverWait(self.login_ad.driver, 100).until(
+            lambda driver: True if 'token' in self.login_ad.driver.current_url else False)
+        cookie_dict = self.login_ad.get_cookie(self.login_ad.driver, login_cookie=False)
+        token_id = re.findall('token=(\d+)', self.login_ad.driver.current_url)[0]
+        time_big = str(int(time.time() * 1000))
+        time_small = str(int(time.time()))
+        token = token_id
+        plan_check_url = 'https://mp.weixin.qq.com/promotion/as_rock?action=get_campaign_data&args={"op_type":1,"where":{},"page":1,"page_size":20,"pos_type":999,"ad_filter":{"name":"' \
+                         + plan_name + '"},"advanced":true,"create_time_range":{"start_time":1610884851},"time_range":{"start_time":1610748800,"last_time":' + time_small + '}}&token=' + token + '&appid=&spid=&_=' + time_big
+        rsp = requests.get(plan_check_url, cookies=cookie_dict)
+        print(rsp.text)
+        if 'list' in rsp.json():
+            if len(rsp.json()['list']):
+                return True
 
     def run(self, err_num=0):
         try:
@@ -355,17 +341,26 @@ class CreateAdPlan():
             self.push_ad()
 
             # 切回到前一页
-            self.driver.switch_to.window(self.driver.window_handles[-1])
-            logging.info('创建广告计划成功')
-            return {'sucess': True, 'result_info': ''}
+            if self.check_is_sucess():
+                logging.info('创建广告计划成功')
+                return {'sucess': True, 'result_info': ''}
+            else:
+                if err_num > 3:
+                    return {'sucess': False, 'result_info': '过程中全程无错误,失败'}
+                else:
+
+                    self.login_ad.refresh_driver()
+                    self.login_ad.select_ad_master(service_name=self, wechat_name=self.wechat_name)
+                    return self.run(err_num=err_num + 1)
         except Exception as e:
             time.sleep(5)
             self.driver.save_screenshot('liuyi{}.png'.format(time.time()))
             time.sleep(5)
-            raise
+
             # TODO:有空时讲 e 内容设置为原始内容
             if err_num > 3:
                 return {'sucess': False, 'result_info': str(e)}
             else:
+                self.login_ad.refresh_driver()
+                self.login_ad.select_ad_master(service_name=self, wechat_name=self.wechat_name)
                 return self.run(err_num=err_num + 1)
-            pass

+ 32 - 12
wechat_action/login_ad.py

@@ -8,6 +8,7 @@ from wechat_action.human_ad import HumanAd
 from selenium.webdriver import ChromeOptions
 from selenium.webdriver.common.keys import Keys
 from sqlalchemy import Table
+from wechat_action import sql_tools
 import time
 import pickle
 from settings import using_config
@@ -19,11 +20,15 @@ import logging
 
 class LogIn:
     # TODO:整体运行使用逻辑,需要修改几次
-    def __init__(self):
+    def __init__(self, user_id):
         # 获取到单独服务商下的独立公众号页面
         # TODO:之后的落地页创建,推广计划创建,改动service_name,wechat_name通过,login函数主动改动
-
+        self.user_id = user_id
         self.driver = self.get_driver()
+        self.db = DB(config=using_config)
+        self.wechat_cookies_table = Table('wechat_cookies', self.db.metadata,
+                                          autoload=True, autoload_with=self.db.engine)
+        self.sql_session = self.db.DBSession()
         # self.log_in()
         # self.select_ad_master()
 
@@ -35,11 +40,11 @@ class LogIn:
         # prefs = {"profile.managed_default_content_settings.images": 2, 'permissions.default.stylesheet': 2}
         # options.add_experimental_option("prefs", prefs)
 
-        driver = webdriver.Remote(
-            # command_executor='http://192.168.1.101:4444/wd/hub',
-            command_executor='http://118.31.53.105:4555/wd/hub',
-            options=options)
-        # driver = webdriver.Chrome(options=options)
+        # driver = webdriver.Remote(
+        #     # command_executor='http://192.168.1.101:4444/wd/hub',
+        #     command_executor='http://118.31.53.105:4555/wd/hub',
+        #     options=options)
+        driver = webdriver.Chrome(options=options)
         driver.maximize_window()
         return driver
 
@@ -63,6 +68,7 @@ class LogIn:
         logging.info('登录成功')
 
     def select_ad_master(self, service_name, wechat_name):
+        # TODO:每次切换服务商,cookie进行数据库保存
         logging.info('开始切换服务商')
         time.sleep(5)
         self.driver.execute_script('''
@@ -100,12 +106,26 @@ class LogIn:
         WebDriverWait(self.driver, 100).until(lambda driver: driver.find_element_by_class_name(
             'adui-button-hasLeftIcon'))
 
-    @staticmethod
-    def get_cookie(driver):
+        # cookie 进行数据库保存
+        wechat_cookies = self.wechat_cookie_pickle()
+        update_res = self.wechat_cookies_table.update() \
+            .where(self.wechat_cookies_table.c.user_id == self.user_id) \
+            .values(cookies=wechat_cookies)
+        self.sql_session.execute(update_res)
+        self.sql_session.commit()
+        if update_res.rowcount == 0:
+            wechat_cookies_info = {'user_id': self.user_id, 'cookies': wechat_cookies}
+            wechat_insert = sql_tools.save_wechat_cookies(wechat_cookies_info=wechat_cookies_info,
+                                                          table_wechat_cookies=self.wechat_cookies_table)
+            self.sql_session.execute(wechat_insert)
+            self.sql_session.commit()
 
-        WebDriverWait(driver, 100).until(
-            lambda x: [True for _ in driver.get_cookies() if 'token_ticket' == _['name']]
-        )
+    @staticmethod
+    def get_cookie(driver, login_cookie=True):
+        if login_cookie:
+            WebDriverWait(driver, 100).until(
+                lambda x: [True for _ in driver.get_cookies() if 'token_ticket' == _['name']]
+            )
         cookies = driver.get_cookies()
         cookie_dict = {}
         for _ in cookies: