tornado_api.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. from wechat_action.sql_models import DB
  2. from settings import using_config
  3. import tornado.ioloop
  4. import tornado.web
  5. import json
  6. from wechat_api.get_wechat_info import WechatApi
  7. from wechat_action.login_ad import LogIn
  8. from wechat_action import sql_tools
  9. import threading
  10. from web_module import user_action
  11. from sqlalchemy import Table
  12. import pickle
  13. # TODO:需要添加上supervisor,来维护进程
  14. # TODO:有时间需要对tornado进行改进
  15. db = DB(config=using_config)
  16. wechat_cookies_table = Table('wechat_cookies', db.metadata,
  17. autoload=True, autoload_with=db.engine)
  18. layout_typesetting_table = Table('layout_typesetting', db.metadata,
  19. autoload=True, autoload_with=db.engine)
  20. ad_plan_typesetting_table = Table('ad_plan_typesetting', db.metadata,
  21. autoload=True, autoload_with=db.engine)
  22. # 1.实现本机服务
  23. # 2.实现线上docker-selenium服务
  24. class BaseHandler(tornado.web.RequestHandler):
  25. def options(self):
  26. pass
  27. def set_default_headers(self):
  28. print('get in ')
  29. self.set_header('Access-Control-Allow-Origin', '*')
  30. self.set_header('Access-Control-Allow-Headers', '*')
  31. self.set_header('Access-Control-Max-Age', 1000)
  32. self.set_header('Content-type', '*')
  33. self.set_header('Access-Control-Allow-Methods', '*')
  34. class create_ad_plan_remote(BaseHandler):
  35. # 1.批量创建计划
  36. # 返回创建计划是否已经开始
  37. def post(self):
  38. user_id = self.get_argument("user_id", None)
  39. ad_plan_name = self.get_argument("ad_plan_name", None)
  40. # wechat_json :[{'service_name':'one','wechat_name':''},{'service_name':'','wechat_name':''}]
  41. wechat_json = self.get_argument('wechat_json', None)
  42. log_ad, cookie_canuse = ad_human_info.refresh_wechat_cookies(self, user_id=user_id)
  43. threading.Thread(target=user_action.create_ad_plan,
  44. args=(user_id, ad_plan_name, wechat_json, log_ad, db, cookie_canuse)).start()
  45. class create_ad_plan_local(BaseHandler):
  46. def post(self):
  47. user_id = self.get_argument("user_id", None)
  48. ad_plan_typesetting = self.get_argument("plan_typesetting", None)
  49. ad_plan_name = self.get_argument("plan_name", None)
  50. print(user_id, ad_plan_typesetting, ad_plan_name)
  51. sql_session = db.DBSession()
  52. if user_id is None or ad_plan_name is None or ad_plan_typesetting is None:
  53. self.write({'status': {'msg': 'url parameter error', "RetCode": 400}})
  54. return
  55. # 落地页名字精确到毫秒,默认是全局唯一
  56. # TODO:检查一下plan--内容 有无问题-----和前端确定一下
  57. ad_plan_typesetting_info = {'user_id': user_id, 'name': ad_plan_name, 'typesetting': ad_plan_typesetting}
  58. ad_plan_typesetting_inserte = sql_tools.save_ad_plan_typesetting_info(
  59. ad_plan_typesetting_info=ad_plan_typesetting_info,
  60. table_ad_plan_typesetting=ad_plan_typesetting_table)
  61. sql_session.execute(ad_plan_typesetting_inserte)
  62. sql_session.commit()
  63. self.write({'status': {'msg': 'success', "RetCode": 200}})
  64. class create_ad_layout_remote(BaseHandler):
  65. # 1.批量创建落地页
  66. def post(self):
  67. user_id = self.get_argument("user_id", None)
  68. layout_name = self.get_argument("layout_name", None)
  69. # wechat_json :[{'service_name':'one','wechat_name':''},{'service_name':'','wechat_name':''}]
  70. wechat_json = self.get_argument('wechat_json', None)
  71. log_ad, cookie_canuse = ad_human_info.refresh_wechat_cookies(self, user_id=user_id)
  72. threading.Thread(target=user_action.create_layout,
  73. args=(user_id, layout_name, wechat_json, log_ad, db, cookie_canuse)).start()
  74. class create_ad_layout_local(BaseHandler):
  75. def post(self):
  76. user_id = self.get_argument("user_id", None)
  77. layout_typesetting = self.get_argument("layout_typesetting", None)
  78. layout_name = self.get_argument("layout_name", None)
  79. print(user_id, layout_typesetting, layout_name)
  80. sql_session = db.DBSession()
  81. if user_id is None or layout_name is None or layout_typesetting is None:
  82. self.write({'status': {'msg': 'url parameter error', "RetCode": 400}})
  83. return
  84. # 落地页名字精确到毫秒,默认是全局唯一
  85. # TODO:检查一下layout--内容 有无问题-----和前端确定一下
  86. layout_typesetting_info = {'user_id': user_id, 'name': layout_name, 'typesetting': layout_typesetting}
  87. layout_typesetting_inserte = sql_tools.save_layout_typesetting_info(
  88. layout_typesetting_info=layout_typesetting_info,
  89. table_layout_typesetting=layout_typesetting_table)
  90. sql_session.execute(layout_typesetting_inserte)
  91. sql_session.commit()
  92. self.write({'status': {'msg': 'success', "RetCode": 200}})
  93. # TODO:wechat_info,human_info 这两张表有空时需要进行对应改进
  94. class ad_status(BaseHandler):
  95. def get(self):
  96. user_id = self.get_argument("user_id", None)
  97. if user_id is None:
  98. self.write({'status': {'msg': 'url parameter error', "RetCode": 400}})
  99. return
  100. sql_session = db.DBSession()
  101. lines = sql_tools.get_ad_status(sql_session=sql_session, user_id=user_id)
  102. result = []
  103. for line in lines:
  104. action_type, wechat_name, service_name, update_time, create_time, status = line
  105. result.append(
  106. {'action_type': json.loads(action_type), 'wechat_name': wechat_name, 'service_name': service_name,
  107. 'update_time': update_time.strftime("%Y-%m-%d %H:%M:%S"),
  108. 'create_time': create_time.strftime("%Y-%m-%d %H:%M:%S"), 'status': status})
  109. # result = json.loads(result)
  110. print(result)
  111. self.write({'status': {'msg': 'success', "RetCode": 200},
  112. 'ad_status_info': result})
  113. class ad_human_info(BaseHandler):
  114. @staticmethod
  115. def refresh_wechat_cookies(tornado_web, user_id):
  116. # 1.返回二维码链接
  117. # ----1.查看cookie是否可用
  118. sql_session = db.DBSession()
  119. cookie_db = sql_tools.get_wechat_cookies(sql_session, user_id=user_id)
  120. # 进行登录操作
  121. log_ad = LogIn()
  122. # 使driver可以使用
  123. cookie_canuse = False
  124. if cookie_db:
  125. cookie_db = pickle.loads(cookie_db)
  126. # TODO:log 日志需要进行对应配置
  127. if not log_ad.wechat_cookies_check_alive(cookie_db):
  128. # cookie 不能使用
  129. wechat_code = log_ad.log_in()
  130. tornado_web.write({'status': {'msg': 'success', "RetCode": 200},
  131. 'wechat_code': wechat_code})
  132. print('cookie can not use')
  133. else:
  134. # cookie 可以继续使用
  135. cookie_canuse = True
  136. log_ad.driver.get('https://a.weixin.qq.com/index.html')
  137. tornado_web.write({'status': {'msg': 'success', "RetCode": 200}})
  138. else:
  139. # cookie 不能使用
  140. wechat_code = log_ad.log_in()
  141. tornado_web.write({'status': {'msg': 'success', "RetCode": 200},
  142. 'wechat_code': wechat_code})
  143. return log_ad, cookie_canuse
  144. # 1.人群包获取
  145. def get(self):
  146. # TODO:添加分页
  147. # 0.是否刷新
  148. # 1.获取userid,以及是否刷新
  149. user_id = self.get_argument("user_id", None)
  150. is_refresh = self.get_argument("is_refresh", None)
  151. print(user_id, is_refresh)
  152. if user_id is None or is_refresh is None:
  153. self.write({'status': {'msg': 'url parameter error', "RetCode": 400}})
  154. return
  155. sql_session = db.DBSession()
  156. # TODO:一个涉及到selenium-driver的请求-生命周期.----看一下tornado是怎么处理请求的生命周期
  157. if int(is_refresh) == 1:
  158. log_ad, cookie_canuse = self.refresh_wechat_cookies(self, user_id=user_id)
  159. threading.Thread(target=user_action.get_human_info,
  160. args=(
  161. user_id, log_ad, db, cookie_canuse)).start()
  162. else:
  163. # 1.查看是否在刷新,
  164. # 在刷新中,
  165. # 返回正在刷新
  166. # -------不管上面逻辑让他们多刷新几次
  167. # 不在刷新
  168. # 返回对应数据
  169. # 2.获取userid对应数据
  170. result = sql_tools.get_human_info(sql_session=sql_session, user_id=user_id)
  171. result = [json.loads(x) for x in result]
  172. print(result)
  173. self.write({'status': {'msg': 'success', "RetCode": 200},
  174. 'human_info': result})
  175. class ad_wechat_info(BaseHandler):
  176. # 1.公众号相关信息获取
  177. def get(self):
  178. # TODO:添加分页
  179. # 0.是否刷新
  180. # 1.获取userid,以及是否刷新
  181. user_id = self.get_argument("user_id", None)
  182. is_refresh = self.get_argument("is_refresh", None)
  183. print(user_id, is_refresh)
  184. if user_id is None or is_refresh is None:
  185. self.write({'status': {'msg': 'url parameter error', "RetCode": 400}})
  186. return
  187. sql_session = db.DBSession()
  188. # TODO:一个涉及到selenium-driver的请求-生命周期.----看一下tornado是怎么处理请求的生命周期
  189. if int(is_refresh) == 1:
  190. log_ad, cookie_canuse = ad_human_info.refresh_wechat_cookies(self, user_id=user_id)
  191. threading.Thread(target=user_action.get_human_info,
  192. args=(
  193. user_id, log_ad, db, cookie_canuse)).start()
  194. else:
  195. # 1.查看是否在刷新,
  196. # 在刷新中,
  197. # 返回正在刷新
  198. # -------不管上面逻辑让他们多刷新几次
  199. # 不在刷新
  200. # 返回对应数据
  201. # 2.获取userid对应数据
  202. result = sql_tools.get_wechat_info(sql_session=sql_session, user_id=user_id)
  203. result_list = []
  204. for _ in result:
  205. service_name, wechat_name = _
  206. result_list.append({'service_name': service_name, 'wechat_name': wechat_name})
  207. print(result_list)
  208. self.write({'status': {'msg': 'success', "RetCode": 200},
  209. 'wechat_info': result_list})
  210. def make_app():
  211. return tornado.web.Application([
  212. ("/create_ad_plan_local", create_ad_plan_local),
  213. ("/create_ad_layout_local", create_ad_layout_local),
  214. ("/create_ad_plan_remote", create_ad_plan_remote),
  215. ("/create_ad_layout_remote", create_ad_layout_remote),
  216. ("/ad_human_info", ad_human_info),
  217. ("/ad_wechat_info", ad_wechat_info),
  218. ("/ad_status", ad_status)
  219. ], debug=True, autoreload=True)
  220. if __name__ == "__main__":
  221. app = make_app()
  222. app.listen(8888)
  223. tornado.ioloop.IOLoop.current().start()