from wechat_action.sql_tools import save_wechat_cookies, save_human_info, delete_wechat_info, save_wechat_info from wechat_api.get_wechat_info import WechatApi from wechat_action.create_ad_layout import CreateAd from wechat_action.create_ad_plan import CreateAdPlan from wechat_action import sql_tools from sqlalchemy import Table from communication_tools import dingtalk import json import logging import time layout_create_action = 'create_ad_layout' ad_plan_create_action = 'create_ad_plan' def run(user_id, log_ad, db, cookie_canuse): sql_session = db.DBSession() # 检查是否有已经开启的任务 result = sql_tools.get_action_status(sql_session, user_id) # 有: 只将任务进行添加操作todo if result: action_info = {'user_id': user_id, 'service_name': ''} sql_tools.save_action_record() # 无: 任务添加到数据库中doing # 检查是否需要登录 # 任务开始 # 任务中间添加的----不断循环获取同userid,----doing,error,todo状态任务 # 关闭driver def cookie_acion(db, log_ad, cookie_canuse, user_id): wechat_cookies_table = Table('wechat_cookies', db.metadata, autoload=True, autoload_with=db.engine) sql_session = db.DBSession() # 等待页面加载完成 log_ad.log_in_wait() # 1.保存cookie, if not cookie_canuse: log_ad.cookies_save(log_ad) print('update wechat cookies') def carry_plan(user_id, ad_plan_list, log_ad, db, cookie_canuse): # TODO:action_record涉及到的地方都需要改动 # 创建中的数据需要进行删除 # TODO: # 1.任务有不断中途新增,该如何操作.------只管 # 2.落地页创建一半失败了怎么办 try: 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) # 现在默认layout_name在30个字符以内 layout_name = _['idea']['jump_type_page_type']['layout_name'].replace(' ', '')[:29] 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, service_name, wechat_name) 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) 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.创建计划 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=_, 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, service_name, wechat_name) log_ad.refresh_driver() # 每次运行微信相关操作,对微信相关信息进行刷新 get_human_info(user_id, log_ad, db, cookie_canuse) except Exception as e: #TODO:直接进行截图 dingtalk.send_message('user_id:{} 计划执行出错,进行检查\n{}'.format(user_id, str(e))) logging.error(e) finally: try: print('任务结束') log_ad.driver.quit() except: pass def get_human_info(user_id, log_ad, db, cookie_canuse): try: #TODO: 添加action_record对应数据记录 # 数据库 human_info_table = Table('human_info', db.metadata, autoload=True, autoload_with=db.engine) wechat_info_table = Table('wechat_info', db.metadata, autoload=True, autoload_with=db.engine) sql_session = db.DBSession() # 1.cookies保存 cookie_acion(db, log_ad, cookie_canuse, user_id) # 2.刷新人群包 # 3.刷新微信 公众号 分层 信息 # wechat_info.每次都删除掉前面全部数据,进行更新 # human_info 进行全局更新 w_api = WechatApi(log_ad=log_ad) res_list = w_api.get_human_info() if res_list is None: dingtalk.send_message('user_id:{} 获取微信数据为空,进行检查'.format(user_id)) log_ad.driver.close() return # human info 相关数据进行更新 for _ in res_list: service_name = _['service_name'] wechat_name = _['wechat_name'] human_info = _['data']['list'] update_res = human_info_table.update() \ .where(human_info_table.c.service_name == service_name) \ .where(human_info_table.c.wechat_name == wechat_name) \ .values(human_info=human_info) update_res = sql_session.execute(update_res) sql_session.commit() if update_res.rowcount == 0: human_info = {'service_name': service_name, 'wechat_name': wechat_name, 'human_info': human_info} human_insert = save_human_info(human_info=human_info, table_human=human_info_table) sql_session.execute(human_insert) sql_session.commit() print('update human info') # wechat info进行数据更新 # 1.删除所有数据 delete_wechat_info(sql_session=sql_session, user_id=user_id) # 2.重新添加一遍相关数据 for _ in res_list: service_name = _['service_name'] wechat_name = _['wechat_name'] appid = _['appid'] wxname = _['wxname'] wechat_info = {'appid': appid, 'wxname': wxname, 'service_name': service_name, 'wechat_name': wechat_name, 'user_id': user_id} wechat_insert = save_wechat_info(wechat_info=wechat_info, table_wechat=wechat_info_table) sql_session.execute(wechat_insert) sql_session.commit() print('update wechat info') # 浏览器关闭 log_ad.driver.close() except Exception as e: dingtalk.send_message('user_id:{} 获取微信数据出错,进行检查\n{}'.format(user_id, str(e))) logging.error(e) finally: try: print('任务结束') log_ad.driver.quit() except: pass if __name__ == "__main__": pass