user_action.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. from wechat_action.sql_tools import save_human_info, delete_wechat_info, save_wechat_info
  2. from wechat_api.get_wechat_info import WechatApi
  3. from wechat_action.create_ad_layout import CreateAd
  4. from wechat_action.create_ad_plan import CreateAdPlan
  5. from wechat_action import sql_tools
  6. from sqlalchemy import Table
  7. from communication_tools import dingtalk
  8. import json
  9. import logging
  10. from datetime import datetime
  11. layout_create_action = 'create_ad_layout'
  12. ad_plan_create_action = 'create_ad_plan'
  13. refresh_wechat_action = 'refresh_wechat_info'
  14. def run(user_id, log_ad, db, cookie_canuse):
  15. # sql_session = db.DBSession()
  16. # # 检查是否有已经开启的任务
  17. # result = sql_tools.get_action_status(sql_session, user_id)
  18. # # 有: 只将任务进行添加操作todo
  19. # if result:
  20. # action_info = {'user_id': user_id, 'service_name': ''}
  21. #
  22. # sql_tools.save_action_record()
  23. # 无: 任务添加到数据库中doing
  24. # 检查是否需要登录
  25. # 任务开始
  26. # 任务中间添加的----不断循环获取同userid,----doing,error,todo状态任务
  27. # 关闭driver
  28. pass
  29. def cookie_acion(db, log_ad, cookie_canuse, user_id):
  30. wechat_cookies_table = Table('wechat_cookies', db.metadata,
  31. autoload=True, autoload_with=db.engine)
  32. sql_session = db.DBSession()
  33. # 等待页面加载完成
  34. log_ad.log_in_wait()
  35. # 1.保存cookie,
  36. if not cookie_canuse:
  37. log_ad.cookies_save(log_ad)
  38. print('update wechat cookies')
  39. def carry_plan(user_id, ad_plan_list, log_ad, db, cookie_canuse):
  40. # TODO:与get_human_info的交互需要改动
  41. # TODO:失败后 ,状态为:创建中 ----进行对应删除
  42. # 创建中的数据需要进行删除
  43. # TODO:
  44. # 1.任务有不断中途新增,该如何操作.------只管
  45. # 2.落地页创建一半失败了怎么办
  46. try:
  47. action_record_table = Table('action_record', db.metadata,
  48. autoload=True, autoload_with=db.engine)
  49. sql_session = db.DBSession()
  50. task_name = 'user_id: {user_id} time:{time_sign} action:create_plan'.format(user_id=user_id,
  51. time_sign=datetime.now().strftime(
  52. "%Y-%m-%d, %H:%M:%S"))
  53. # 2.2存行为记录
  54. for _ in ad_plan_list:
  55. print(_)
  56. for action_type in ['create_ad_plan', 'create_ad_layout']:
  57. object_name = _['title'] if action_type == 'create_ad_plan' else _['idea']['jump_type_page_type'][
  58. 'layout_name']
  59. object_name = object_name.replace(' ', '')[:29]
  60. action_info = {'user_id': user_id, 'service_name': _['service_name'], 'wechat_name': _['wechat_name'],
  61. 'action_type': action_type, 'object_name': object_name, 'task_name': task_name,
  62. 'status': 'todo'}
  63. record_insert = sql_tools.save_action_record(action_record_info=action_info,
  64. table_action_record=action_record_table)
  65. sql_session.execute(record_insert)
  66. sql_session.commit()
  67. # cookies保存
  68. cookie_acion(db, log_ad, cookie_canuse, user_id)
  69. for _ in ad_plan_list:
  70. service_name = _['service_name']
  71. wechat_name = _['wechat_name']
  72. # 1.检查1.落地页是否创建过了
  73. log_ad.select_ad_master(service_name, wechat_name)
  74. # 现在默认layout_name在30个字符以内
  75. layout_name = _['idea']['jump_type_page_type']['layout_name'].replace(' ', '')[:29]
  76. if CreateAd.check_sucess_api(layout_name=layout_name, log_ad=log_ad):
  77. res = {'sucess': True, 'result_info': '已经创建过对应落地页'}
  78. sql_tools.action_record(res, sql_session, layout_create_action, user_id, layout_name,
  79. action_record_table,
  80. service_name, wechat_name, task_name)
  81. else:
  82. # 1.5无则创建落地页
  83. create_ad_layout = CreateAd(login_ad=log_ad, service_name=service_name, wechat_name=wechat_name)
  84. layout_typesetting_dict = sql_tools.get_layout_typesetting(sql_session, user_id,
  85. typesetting_name=layout_name)
  86. print(layout_typesetting_dict)
  87. layout_typesetting_dict = json.loads(layout_typesetting_dict)
  88. res = create_ad_layout.create_layout(layout_typesetting_dict)
  89. sql_tools.action_record(res, sql_session, layout_create_action, user_id, layout_name,
  90. action_record_table,
  91. service_name, wechat_name, task_name)
  92. log_ad.refresh_driver()
  93. # 3.创建计划
  94. log_ad.select_ad_master(service_name, wechat_name)
  95. plan_name = _['title'].replace(' ', '')[:29]
  96. # plan_typesetting_dict = sql_tools.get_ad_plan_typesetting(sql_session=sql_session, user_id=user_id,
  97. # typesetting_name=plan_name)
  98. create_ad_plan = CreateAdPlan(login_ad=log_ad, task=_, service_name=service_name, wechat_name=wechat_name)
  99. res = create_ad_plan.run()
  100. # 4.更新action_record相关计划信息
  101. sql_tools.action_record(res, sql_session, ad_plan_create_action, user_id, plan_name, action_record_table,
  102. service_name, wechat_name, task_name)
  103. logging.info('创建计划任务结束')
  104. log_ad.refresh_driver()
  105. # 每次运行微信相关操作,对微信相关信息进行刷新
  106. get_human_info(user_id, log_ad, db, cookie_canuse)
  107. except Exception as e:
  108. log_ad.driver.save_screenshot(
  109. 'user_id:{}_time_{}_plan_error.png'.format(user_id, datetime.now().strftime("%Y-%m-%d, %H:%M:%S")))
  110. raise
  111. dingtalk.send_message('user_id:{} 计划执行出错,进行检查\n{}'.format(user_id, str(e)))
  112. logging.error(e)
  113. finally:
  114. try:
  115. print('任务结束')
  116. log_ad.driver.quit()
  117. except:
  118. pass
  119. def get_human_info(user_id, log_ad, db, cookie_canuse):
  120. try:
  121. # 数据库
  122. action_record_table = Table('action_record', db.metadata,
  123. autoload=True, autoload_with=db.engine)
  124. human_info_table = Table('human_info', db.metadata,
  125. autoload=True, autoload_with=db.engine)
  126. wechat_info_table = Table('wechat_info', db.metadata,
  127. autoload=True, autoload_with=db.engine)
  128. sql_session = db.DBSession()
  129. # 行为记录
  130. task_name = 'user_id: {user_id} time:{time_sign} action:refresh_wechat_info'.format(user_id=user_id,
  131. time_sign=datetime.now().strftime(
  132. "%Y-%m-%d, %H:%M:%S"))
  133. action_type = 'refresh_wechat_info'
  134. action_info = {'user_id': user_id, 'service_name': '', 'wechat_name': '',
  135. 'action_type': action_type, 'object_name': '', 'task_name': task_name,
  136. 'status': 'todo'}
  137. record_insert = sql_tools.save_action_record(action_record_info=action_info,
  138. table_action_record=action_record_table)
  139. sql_session.execute(record_insert)
  140. sql_session.commit()
  141. # 1.cookies保存
  142. cookie_acion(db, log_ad, cookie_canuse, user_id)
  143. # wechat_info.每次都删除掉前面全部数据,进行更新
  144. # human_info 进行全局更新
  145. w_api = WechatApi(log_ad=log_ad)
  146. res_info = w_api.get_human_info()
  147. if not res_info['sucess']:
  148. dingtalk.send_message('user_id:{} 获取微信数据为空,进行检查'.format(user_id))
  149. log_ad.driver.close()
  150. object_name = ''
  151. service_name = ''
  152. wechat_name = ''
  153. sql_tools.action_record(res_info, sql_session, refresh_wechat_action, user_id,
  154. object_name, action_record_table,
  155. service_name, wechat_name, task_name)
  156. return
  157. # wechat info进行数据更新
  158. # 1.删除所有数据
  159. delete_wechat_info(sql_session=sql_session, user_id=user_id)
  160. # 2.重新添加一遍相关数据
  161. for _ in res_info['result_list']:
  162. service_name = _['service_name']
  163. wechat_name = _['wechat_name']
  164. appid = _['appid']
  165. wxname = _['wxname']
  166. wechat_info = {'appid': appid, 'wxname': wxname, 'service_name': service_name,
  167. 'wechat_name': wechat_name,
  168. 'user_id': user_id}
  169. wechat_insert = save_wechat_info(wechat_info=wechat_info,
  170. table_wechat=wechat_info_table)
  171. sql_session.execute(wechat_insert)
  172. sql_session.commit()
  173. logging.info('update wechat info')
  174. # human info 相关数据进行更新
  175. for _ in res_info['result_list']:
  176. service_name = _['service_name']
  177. wechat_name = _['wechat_name']
  178. human_info = _['data']['list']
  179. update_res = human_info_table.update() \
  180. .where(human_info_table.c.service_name == service_name) \
  181. .where(human_info_table.c.wechat_name == wechat_name) \
  182. .values(human_info=human_info)
  183. update_res = sql_session.execute(update_res)
  184. sql_session.commit()
  185. if update_res.rowcount == 0:
  186. human_info = {'service_name': service_name, 'wechat_name': wechat_name, 'human_info': human_info}
  187. human_insert = save_human_info(human_info=human_info,
  188. table_human=human_info_table)
  189. sql_session.execute(human_insert)
  190. sql_session.commit()
  191. print('update human info')
  192. # 浏览器关闭
  193. log_ad.driver.close()
  194. object_name = ''
  195. service_name = ''
  196. wechat_name = ''
  197. sql_tools.action_record(res_info, sql_session, refresh_wechat_action,
  198. user_id, object_name, action_record_table,
  199. service_name, wechat_name, task_name)
  200. except Exception as e:
  201. log_ad.driver.save_screenshot(
  202. 'user_id:{}_time_{}_wechat_info_error.png'.format(user_id, datetime.now().strftime("%Y-%m-%d, %H:%M:%S")))
  203. dingtalk.send_message('user_id:{} 获取微信数据出错,进行检查\n{}'.format(user_id, str(e)))
  204. logging.error(e)
  205. finally:
  206. try:
  207. print('任务结束')
  208. log_ad.driver.quit()
  209. except:
  210. pass
  211. if __name__ == "__main__":
  212. pass