from wechat_action.sql_tools import 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 from datetime import datetime layout_create_action = 'create_ad_layout' ad_plan_create_action = 'create_ad_plan' refresh_wechat_action = 'refresh_wechat_info' 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 pass 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() task_name = 'user_id: {user_id} time:{time_sign} action:create_plan'.format(user_id=user_id, time_sign=datetime.now().strftime( "%Y-%m-%d, %H:%M:%S")) # 2.2存行为记录 for _ in ad_plan_list: 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 = 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'} 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() # 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, task_name) else: # 1.5无则创建落地页 create_ad_layout = CreateAd(login_ad=log_ad, service_name=service_name, wechat_name=wechat_name) layout_typesetting_dict = sql_tools.get_layout_typesetting(sql_session, user_id, typesetting_name=layout_name) print(layout_typesetting_dict) 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, task_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, task_name) log_ad.refresh_driver() # 每次运行微信相关操作,对微信相关信息进行刷新 get_human_info(user_id, log_ad, db, cookie_canuse) except Exception as e: log_ad.driver.save_screenshot( 'user_id:{}_time_{}_plan_error.png'.format(user_id, datetime.now().strftime("%Y-%m-%d, %H:%M:%S"))) 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: # 数据库 action_record_table = Table('action_record', db.metadata, autoload=True, autoload_with=db.engine) 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() # 行为记录 task_name = 'user_id: {user_id} time:{time_sign} action:refresh_wechat_info'.format(user_id=user_id, time_sign=datetime.now().strftime( "%Y-%m-%d, %H:%M:%S")) action_type = 'refresh_wechat_info' action_info = {'user_id': user_id, 'service_name': '', 'wechat_name': '', 'action_type': action_type, 'object_name': '', 'task_name': task_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() # 1.cookies保存 cookie_acion(db, log_ad, cookie_canuse, user_id) # wechat_info.每次都删除掉前面全部数据,进行更新 # human_info 进行全局更新 w_api = WechatApi(log_ad=log_ad) res_info = w_api.get_human_info() if not res_info['sucess']: dingtalk.send_message('user_id:{} 获取微信数据为空,进行检查'.format(user_id)) log_ad.driver.close() object_name = '' service_name = '' wechat_name = '' sql_tools.action_record(res_info, sql_session, refresh_wechat_action, user_id, object_name, action_record_table, service_name, wechat_name, task_name) return # wechat info进行数据更新 # 1.删除所有数据 delete_wechat_info(sql_session=sql_session, user_id=user_id) # 2.重新添加一遍相关数据 for _ in res_info['result_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() logging.info('update wechat info') # human info 相关数据进行更新 for _ in res_info['result_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') # 浏览器关闭 log_ad.driver.close() object_name = '' service_name = '' wechat_name = '' sql_tools.action_record(res_info, sql_session, refresh_wechat_action, user_id, object_name, action_record_table, service_name, wechat_name, task_name) except Exception as e: log_ad.driver.save_screenshot( 'user_id:{}_time_{}_wechat_info_error.png'.format(user_id, datetime.now().strftime("%Y-%m-%d, %H:%M:%S"))) 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