user_action.py 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  1. from wechat_action.sql_tools import save_wechat_cookies, 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. import json
  8. import time
  9. layout_create_action = 'create_ad_layout'
  10. ad_plan_create_action = 'create_ad_plan'
  11. def run(user_id, log_ad, db, cookie_canuse):
  12. sql_session = db.DBSession()
  13. # 检查是否有已经开启的任务
  14. result = sql_tools.get_action_status(sql_session, user_id)
  15. # 有: 只将任务进行添加操作todo
  16. if result:
  17. action_info = {'user_id': user_id, 'service_name': ''}
  18. sql_tools.save_action_record()
  19. # 无: 任务添加到数据库中doing
  20. # 检查是否需要登录
  21. # 任务开始
  22. # 任务中间添加的----不断循环获取同userid,----doing,error,todo状态任务
  23. # 关闭driver
  24. def cookie_acion(db, log_ad, cookie_canuse, user_id):
  25. wechat_cookies_table = Table('wechat_cookies', db.metadata,
  26. autoload=True, autoload_with=db.engine)
  27. sql_session = db.DBSession()
  28. # 等待页面加载完成
  29. log_ad.log_in_wait()
  30. # 1.保存cookie,
  31. if not cookie_canuse:
  32. wechat_cookies = log_ad.wechat_cookie_pickle()
  33. update_res = wechat_cookies_table.update() \
  34. .where(wechat_cookies_table.c.user_id == user_id) \
  35. .values(cookies=wechat_cookies)
  36. update_res = sql_session.execute(update_res)
  37. sql_session.commit()
  38. if update_res.rowcount == 0:
  39. wechat_cookies_info = {'user_id': user_id, 'cookies': wechat_cookies}
  40. wechat_insert = save_wechat_cookies(wechat_cookies_info=wechat_cookies_info,
  41. table_wechat_cookies=wechat_cookies_table)
  42. sql_session.execute(wechat_insert)
  43. sql_session.commit()
  44. print('update wechat cookies')
  45. def carry_plan(user_id, ad_plan_list, log_ad, db, cookie_canuse):
  46. # TODO:action_record涉及到的地方都需要改动
  47. action_record_table = Table('action_record', db.metadata,
  48. autoload=True, autoload_with=db.engine)
  49. sql_session = db.DBSession()
  50. # cookies保存
  51. cookie_acion(db, log_ad, cookie_canuse, user_id)
  52. try:
  53. for _ in ad_plan_list:
  54. service_name = _['service_name']
  55. wechat_name = _['wechat_name']
  56. # 1.检查1.落地页是否创建过了
  57. log_ad.select_ad_master(service_name, wechat_name)
  58. create_ad_layout = CreateAd(login_ad=log_ad, service_name=service_name, wechat_name=wechat_name)
  59. create_ad_layout.check_sucess_ready()
  60. # TODO:现在默认layout_name在30个字符以内
  61. layout_name = _['idea']['jump_type_page_type']['layout_name'].replace(' ', '')[:29]
  62. if create_ad_layout.check_sucess(layout_name=layout_name):
  63. res = {'sucess': True, 'result_info': '已经创建过对应落地页'}
  64. sql_tools.action_record(res, sql_session, layout_create_action, user_id, layout_name,
  65. action_record_table,
  66. service_name, wechat_name)
  67. else:
  68. # 1.5无则创建落地页
  69. create_ad_layout.get_into_create_page()
  70. layout_typesetting_dict = sql_tools.get_layout_typesetting(sql_session, user_id,
  71. typesetting_name=layout_name)
  72. layout_typesetting_dict = json.loads(layout_typesetting_dict)
  73. res = create_ad_layout.create_layout(layout_typesetting_dict)
  74. sql_tools.action_record(res, sql_session, layout_create_action, user_id, layout_name,
  75. action_record_table,
  76. service_name, wechat_name)
  77. log_ad.refresh_driver()
  78. # 3.创建计划
  79. # TODO:添加计划是否创建检查,现默认计划没有重复
  80. log_ad.select_ad_master(service_name, wechat_name)
  81. plan_name = _['title'].replace(' ', '')[:29]
  82. # plan_typesetting_dict = sql_tools.get_ad_plan_typesetting(sql_session=sql_session, user_id=user_id,
  83. # typesetting_name=plan_name)
  84. create_ad_plan = CreateAdPlan(login_ad=log_ad, task=_)
  85. res = create_ad_plan.run()
  86. # 4.更新action_record相关计划信息
  87. sql_tools.action_record(res, sql_session, ad_plan_create_action, user_id, plan_name, action_record_table,
  88. service_name, wechat_name)
  89. log_ad.refresh_driver()
  90. # TODO:添加final ,来关闭chrome
  91. except Exception as e:
  92. print(e)
  93. finally:
  94. try:
  95. print('任务结束')
  96. log_ad.driver.quit()
  97. except:
  98. pass
  99. # TODO:这里都是线程调度的函数,设定线程生命周期最长60分钟
  100. def get_human_info(user_id, log_ad, db, cookie_canuse):
  101. # 数据库
  102. human_info_table = Table('human_info', db.metadata,
  103. autoload=True, autoload_with=db.engine)
  104. wechat_info_table = Table('wechat_info', db.metadata,
  105. autoload=True, autoload_with=db.engine)
  106. sql_session = db.DBSession()
  107. # TODO:log_ad 在这个线程结束之后并没有自动关闭,需要设置一下log_ad这个类删除,
  108. # 然后看一下多次请求之后,线程数量,
  109. # TODO:需要添加公众号信息
  110. # 1.cookies保存
  111. cookie_acion(db, log_ad, cookie_canuse, user_id)
  112. # 2.刷新人群包
  113. # 3.刷新微信 公众号 分层 信息
  114. # wechat_info.每次都删除掉前面全部数据,进行更新
  115. # human_info 进行全局更新
  116. w_api = WechatApi(log_ad=log_ad)
  117. res_list = w_api.get_human_info()
  118. # human info 相关数据进行更新
  119. for _ in res_list:
  120. service_name = _['service_name']
  121. wechat_name = _['wechat_name']
  122. human_info = _['data']['list']
  123. update_res = human_info_table.update() \
  124. .where(human_info_table.c.service_name == service_name) \
  125. .where(human_info_table.c.wechat_name == wechat_name) \
  126. .values(human_info=human_info)
  127. update_res = sql_session.execute(update_res)
  128. sql_session.commit()
  129. if update_res.rowcount == 0:
  130. human_info = {'service_name': service_name, 'wechat_name': wechat_name, 'human_info': human_info}
  131. human_insert = save_human_info(human_info=human_info,
  132. table_human=human_info_table)
  133. sql_session.execute(human_insert)
  134. sql_session.commit()
  135. print('update human info')
  136. # wechat info进行数据更新
  137. # 1.删除所有数据
  138. delete_wechat_info(sql_session=sql_session, user_id=user_id)
  139. # 2.重新添加一遍相关数据
  140. for _ in res_list:
  141. service_name = _['service_name']
  142. wechat_name = _['wechat_name']
  143. wechat_info = {'service_name': service_name, 'wechat_name': wechat_name, 'user_id': user_id}
  144. wechat_insert = save_wechat_info(wechat_info=wechat_info,
  145. table_wechat=wechat_info_table)
  146. sql_session.execute(wechat_insert)
  147. sql_session.commit()
  148. print('update wechat info')
  149. # 浏览器关闭
  150. log_ad.driver.close()
  151. def create_layout(user_id, layout_name, wechat_json, log_ad, db, cookie_canuse):
  152. # TODO:
  153. # 1.任务有不断中途新增,该如何操作.------只管
  154. # 2.落地页创建一半失败了怎么办
  155. # 4.cookie记录每次刷新都会失效,需要改进
  156. action_record_table = Table('action_record', db.metadata,
  157. autoload=True, autoload_with=db.engine)
  158. sql_session = db.DBSession()
  159. # 等待页面加载完成
  160. # cookies保存
  161. cookie_acion(db, log_ad, cookie_canuse, user_id)
  162. # 获取到对应layout
  163. typesetting_json = sql_tools.get_layout_typesetting(sql_session=sql_session, user_id=user_id,
  164. typesetting_name=layout_name)
  165. if not typesetting_json:
  166. return
  167. print(typesetting_json)
  168. typesetting_dict = json.loads(typesetting_json)
  169. typesetting_dict[-4] = {'layout_name': layout_name}
  170. # action 进行对应记录
  171. wechat_json = json.loads(wechat_json)
  172. for _ in wechat_json:
  173. service_name = _['service_name']
  174. wechat_name = _['wechat_name']
  175. # 检查落地页之前有无创建过
  176. layout_num = sql_tools.check_layout_alive(sql_session, service_name, wechat_name, layout_name)
  177. if layout_num:
  178. continue
  179. log_ad.select_ad_master(service_name, wechat_name)
  180. res = CreateAd(login_ad=log_ad, service_name=service_name, wechat_name=wechat_name).create_layout(
  181. typesetting_dict)
  182. print(res)
  183. if not res['sucess']:
  184. now_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
  185. try:
  186. log_ad.driver.save_screenshot(
  187. 'create_ad_layout-{layout_name}-{now_time}-{service_name}-{wechat_name}.png'.format(
  188. layout_name=layout_name,
  189. now_time=now_time,
  190. service_name=service_name,
  191. wechat_name=wechat_name))
  192. except:
  193. pass
  194. # TODO:截图,传回错误信息
  195. action_type = layout_create_action
  196. # TODO:进行对应数据修改
  197. sql_tools.action_record(res, sql_session, action_type, user_id, layout_name, action_record_table, service_name,
  198. wechat_name)
  199. log_ad.refresh_driver()
  200. # 成功一个record,更新一个record
  201. log_ad.driver.quit()
  202. def create_ad_plan(user_id, ad_plan_name, wechat_json, log_ad, db, cookie_canuse):
  203. # TODO:
  204. # 1.任务有不断中途新增,该如何操作.------只管
  205. # 2.落地页创建一半失败了怎么办
  206. # 4.cookie记录每次刷新都会失效,需要改进
  207. action_record_table = Table('action_record', db.metadata,
  208. autoload=True, autoload_with=db.engine)
  209. sql_session = db.DBSession()
  210. action_type = ad_plan_create_action
  211. # 等待页面加载完成
  212. # 1.cookies保存
  213. cookie_acion(db, log_ad, cookie_canuse, user_id)
  214. # 获取到对应layout
  215. typesetting_json = sql_tools.get_ad_plan_typesetting(sql_session=sql_session, user_id=user_id,
  216. typesetting_name=ad_plan_name)
  217. if not typesetting_json:
  218. return
  219. print(typesetting_json)
  220. typesetting_dict = json.loads(typesetting_json)
  221. typesetting_dict['title'] = ad_plan_name
  222. # action 进行对应记录
  223. wechat_json = json.loads(wechat_json)
  224. for _ in wechat_json:
  225. service_name = _['service_name']
  226. wechat_name = _['wechat_name']
  227. # 检查这个名字是否已经创建过
  228. layout_name = typesetting_dict['idea']['jump_type-page_type']
  229. if not sql_tools.check_layout_alive(sql_session, service_name, wechat_name, layout_name):
  230. res = {'sucess': False, 'result_info': '公众号对应落地页未创建'}
  231. sql_tools.action_record(res, sql_session, action_type, user_id, ad_plan_name, action_record_table,
  232. service_name,
  233. wechat_name)
  234. continue
  235. if sql_tools.check_plan_alive(sql_session, service_name, wechat_name, ad_plan_name):
  236. continue
  237. log_ad.select_ad_master(service_name, wechat_name)
  238. res = CreateAdPlan(login_ad=log_ad, task=typesetting_dict).run()
  239. print(res)
  240. if not res['sucess']:
  241. now_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
  242. try:
  243. log_ad.driver.save_screenshot(
  244. 'create_ad_plan-{plan_name}-{now_time}-{service_name}-{wechat_name}.png'.format(
  245. plan_name=ad_plan_name,
  246. now_time=now_time,
  247. service_name=service_name,
  248. wechat_name=wechat_name))
  249. except:
  250. pass
  251. # 截图,传回错误信息
  252. sql_tools.action_record(res, sql_session, action_type, user_id, ad_plan_name, action_record_table, service_name,
  253. wechat_name)
  254. log_ad.refresh_driver()
  255. # 成功一个record,更新一个record
  256. log_ad.driver.quit()
  257. if __name__ == "__main__":
  258. pass