tornado_api.py 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606
  1. from wechat_action.sql_models import DB
  2. from settings import using_config
  3. import tornado.log
  4. import tornado.ioloop
  5. import tornado.web
  6. import json
  7. import time
  8. from wechat_api.get_wechat_info import WechatApi
  9. from wechat_action.login_ad import LogIn
  10. from wechat_action import sql_tools
  11. import threading
  12. from web_module import user_action
  13. from sqlalchemy import Table
  14. import json
  15. import pickle
  16. # TODO:需要添加上supervisor,来维护进程
  17. # TODO:有时间需要对tornado进行改进
  18. # TODO:需要有一套上线工具,来维持线上稳定
  19. db = DB(config=using_config)
  20. wechat_cookies_table = Table('wechat_cookies', db.metadata,
  21. autoload=True, autoload_with=db.engine)
  22. layout_typesetting_table = Table('layout_typesetting', db.metadata,
  23. autoload=True, autoload_with=db.engine)
  24. ad_plan_typesetting_table = Table('ad_plan_typesetting', db.metadata,
  25. autoload=True, autoload_with=db.engine)
  26. action_record_table = Table('action_record', db.metadata,
  27. autoload=True, autoload_with=db.engine)
  28. # 1.实现本机服务
  29. # 2.实现线上docker-selenium服务
  30. class BaseHandler(tornado.web.RequestHandler):
  31. def options(self):
  32. pass
  33. def set_default_headers(self):
  34. self.set_header('Access-Control-Allow-Origin', '*')
  35. self.set_header('Access-Control-Allow-Headers', '*')
  36. self.set_header('Access-Control-Max-Age', 1000)
  37. self.set_header('Content-type', '*')
  38. self.set_header('Access-Control-Allow-Methods', '*')
  39. class create_ad_plan_remote(BaseHandler):
  40. # 1.批量创建计划
  41. # 返回创建计划是否已经开始
  42. # TODO:落地页创建也在这个里面
  43. def post(self):
  44. user_id = self.get_argument("user_id", None)
  45. ad_plan_name = self.get_argument("ad_plan_name", None)
  46. # wechat_json :[{'service_name':'one','wechat_name':''},{'service_name':'','wechat_name':''}]
  47. wechat_json = self.get_argument('wechat_json', None)
  48. log_ad, cookie_canuse = ad_human_info.refresh_wechat_cookies(self, user_id=user_id)
  49. threading.Thread(target=user_action.create_ad_plan,
  50. args=(user_id, ad_plan_name, wechat_json, log_ad, db, cookie_canuse)).start()
  51. class create_ad_plan_local(BaseHandler):
  52. def post(self):
  53. request_dict = json.loads(self.request.body, encoding='utf-8')
  54. user_id = request_dict['user_id']
  55. ad_plan_list = request_dict['plan_list']
  56. print(user_id, ad_plan_list)
  57. sql_session = db.DBSession()
  58. if user_id is None or ad_plan_list is None:
  59. self.write({'status': {'msg': 'url parameter error', "RetCode": 400}})
  60. return
  61. # 落地页名字精确到毫秒,默认是全局唯一
  62. # TODO:检查一下plan--内容 有无问题-----和前端确定一下
  63. for _ in ad_plan_list:
  64. ad_plan_name = _['title']
  65. ad_plan_typesetting_info = {'user_id': user_id, 'name': ad_plan_name,
  66. 'typesetting': json.dumps(_, ensure_ascii=False)}
  67. ad_plan_typesetting_inserte = sql_tools.save_ad_plan_typesetting_info(
  68. ad_plan_typesetting_info=ad_plan_typesetting_info,
  69. table_ad_plan_typesetting=ad_plan_typesetting_table)
  70. sql_session.execute(ad_plan_typesetting_inserte)
  71. sql_session.commit()
  72. self.write({'status': {'msg': 'success', "RetCode": 200}})
  73. class create_ad_plan(BaseHandler):
  74. # TODO:只要tornado开着就不允许修改数据库,------想好之后上线如何操作
  75. def post(self):
  76. request_dict = json.loads(self.request.body, encoding='utf-8')
  77. print(request_dict)
  78. user_id = request_dict['user_id']
  79. # TODO:task_name设置全局唯一
  80. ad_plan_list = request_dict['plan_list']
  81. # 1.查看是否cookie可用
  82. log_ad, cookie_canuse = ad_human_info.refresh_wechat_cookies(self, user_id=user_id)
  83. # 2.数据存入数据库
  84. print(user_id, ad_plan_list)
  85. sql_session = db.DBSession()
  86. if user_id is None or ad_plan_list is None:
  87. self.write({'status': {'msg': 'url parameter error', "RetCode": 400}})
  88. return
  89. # 2.1存计划数据
  90. for _ in ad_plan_list:
  91. ad_plan_name = _['title'].replace(' ', '')[:29]
  92. ad_plan_typesetting_info = {'user_id': user_id, 'name': ad_plan_name,
  93. 'typesetting': json.dumps(_, ensure_ascii=False)}
  94. print('typesetting_info')
  95. print(_)
  96. print(ad_plan_typesetting_info)
  97. ad_plan_typesetting_inserte = sql_tools.save_ad_plan_typesetting_info(
  98. ad_plan_typesetting_info=ad_plan_typesetting_info,
  99. table_ad_plan_typesetting=ad_plan_typesetting_table)
  100. sql_session.execute(ad_plan_typesetting_inserte)
  101. # 2.2存行为历史记录
  102. task_name = '{user_id}_{time_sign}'.format(user_id=user_id, time_sign=time.time())
  103. for _ in ad_plan_list:
  104. # 1.查看历史中有无对应落地页
  105. # TODO:落地页直接存放到action_record,运行过程中进行不同公众号进行不同操作
  106. # 2.历史记录
  107. print(_)
  108. for action_type in ['create_ad_plan', 'create_ad_layout']:
  109. object_name = _['title'] if action_type == 'create_ad_plan' else _['idea']['jump_type_page_type'][
  110. 'layout_name']
  111. object_name = object_name.replace(' ', '')[:29]
  112. action_info = {'user_id': user_id, 'service_name': _['service_name'], 'wechat_name': _['wechat_name'],
  113. 'action_type': action_type, 'object_name': object_name, 'task_name': task_name,
  114. 'status': 'todo'}
  115. record_insert = sql_tools.save_action_record(action_record_info=action_info,
  116. table_action_record=action_record_table)
  117. sql_session.execute(record_insert)
  118. sql_session.commit()
  119. # 4.开始运行
  120. threading.Thread(target=user_action.carry_plan,
  121. args=(user_id, ad_plan_list, log_ad, db, cookie_canuse)).start()
  122. class get_ad_plan_local(BaseHandler):
  123. def get(self):
  124. user_id = self.get_argument('user_id', None)
  125. layout_name = self.get_argument('plan_name', None)
  126. sql_session = db.DBSession()
  127. if user_id is None:
  128. self.write({'status': {'msg': 'url parameter error', "RetCode": 400}})
  129. return
  130. # 落地页名字精确到毫秒,默认是全局唯一
  131. if layout_name:
  132. result = sql_tools.get_plan_typesetting_rough(sql_session=sql_session, user_id=user_id,
  133. typesetting_name=layout_name)
  134. else:
  135. # TODO:之后修改一下,让其查询效率高点,like效率过低
  136. layout_name = ''
  137. result = sql_tools.get_plan_typesetting_rough(sql_session=sql_session, user_id=user_id,
  138. typesetting_name=layout_name)
  139. print(result)
  140. result_ = []
  141. for i in range(len(result)):
  142. print(result[i])
  143. typesetting, name, create_time, update_time = result[i]
  144. _ = {}
  145. _['typesetting'] = json.loads(typesetting)
  146. _['ad_plan_name'] = name
  147. _['id'] = i
  148. _['create_time'] = create_time.strftime("%Y-%m-%d %H:%M:%S")
  149. _['update_time'] = update_time.strftime("%Y-%m-%d %H:%M:%S")
  150. result_.append(_)
  151. self.write({'statu': {'msg': 'success', "RetCode": 200},
  152. 'local_ad_plan_info': result_})
  153. class create_ad_layout_remote(BaseHandler):
  154. # 1.批量创建落地页
  155. def post(self):
  156. user_id = self.get_argument("user_id", None)
  157. layout_name = self.get_argument("layout_name", None)
  158. # wechat_json :[{'service_name':'one','wechat_name':''},{'service_name':'','wechat_name':''}]
  159. wechat_json = self.get_argument('wechat_json', None)
  160. log_ad, cookie_canuse = ad_human_info.refresh_wechat_cookies(self, user_id=user_id)
  161. threading.Thread(target=user_action.create_layout,
  162. args=(user_id, layout_name, wechat_json, log_ad, db, cookie_canuse)).start()
  163. class create_ad_layout_local(BaseHandler):
  164. def post(self):
  165. # TODO:返回一个layout_name重复的一个信息
  166. request_dict = json.loads(self.request.body)
  167. user_id = request_dict['user_id']
  168. layout_typesetting = request_dict['layout_typesetting']
  169. layout_name = request_dict['layout_name']
  170. print(user_id, layout_typesetting, layout_name)
  171. print('layout-typesetting', type(layout_typesetting), layout_typesetting)
  172. sql_session = db.DBSession()
  173. if user_id is None or layout_name is None or layout_typesetting is None:
  174. self.write({'status': {'msg': 'url parameter error', "RetCode": 400}})
  175. return
  176. # 落地页名字精确到毫秒,默认是全局唯一
  177. layout_typesetting_info = {'user_id': user_id, 'name': layout_name,
  178. 'typesetting': layout_typesetting}
  179. layout_typesetting_inserte = sql_tools.save_layout_typesetting_info(
  180. layout_typesetting_info=layout_typesetting_info,
  181. table_layout_typesetting=layout_typesetting_table)
  182. sql_session.execute(layout_typesetting_inserte)
  183. sql_session.commit()
  184. self.write({'status': {'msg': 'success', "RetCode": 200}})
  185. class get_ad_layout_local(BaseHandler):
  186. def get(self):
  187. user_id = self.get_argument('user_id', None)
  188. layout_name = self.get_argument('layout_name', None)
  189. sql_session = db.DBSession()
  190. if user_id is None:
  191. self.write({'status': {'msg': 'url parameter error', "RetCode": 400}})
  192. return
  193. # 落地页名字精确到毫秒,默认是全局唯一
  194. if layout_name:
  195. result = sql_tools.get_layout_typesetting_rough(sql_session=sql_session, user_id=user_id,
  196. typesetting_name=layout_name)
  197. else:
  198. # TODO:之后修改一下,让其查询效率高点,like效率过低
  199. layout_name = ''
  200. result = sql_tools.get_layout_typesetting_rough(sql_session=sql_session, user_id=user_id,
  201. typesetting_name=layout_name)
  202. print(result)
  203. result_ = []
  204. for i in range(len(result)):
  205. print(result[i])
  206. typesetting, name, create_time, update_time = result[i]
  207. _ = {}
  208. _['typesetting'] = json.loads(typesetting)
  209. _['layout_name'] = name
  210. _['id'] = i
  211. _['create_time'] = create_time.strftime("%Y-%m-%d %H:%M:%S")
  212. _['update_time'] = update_time.strftime("%Y-%m-%d %H:%M:%S")
  213. result_.append(_)
  214. self.write({'statu': {'msg': 'success', "RetCode": 200},
  215. 'local_layout_info': result_})
  216. # TODO:wechat_info,human_info 这两张表有空时需要进行对应改进
  217. class ad_status(BaseHandler):
  218. def get(self):
  219. user_id = self.get_argument("user_id", None)
  220. if user_id is None:
  221. self.write({'status': {'msg': 'url parameter error', "RetCode": 400}})
  222. return
  223. sql_session = db.DBSession()
  224. lines = sql_tools.get_ad_status(sql_session=sql_session, user_id=user_id)
  225. result = []
  226. for line in lines:
  227. action_type, wechat_name, service_name, update_time, create_time, status = line
  228. result.append(
  229. {'action_type': json.loads(action_type), 'wechat_name': wechat_name, 'service_name': service_name,
  230. 'update_time': update_time.strftime("%Y-%m-%d %H:%M:%S"),
  231. 'create_time': create_time.strftime("%Y-%m-%d %H:%M:%S"), 'status': status})
  232. # result = json.loads(result)
  233. print(result)
  234. self.write({'status': {'msg': 'success', "RetCode": 200},
  235. 'ad_status_info': result})
  236. class ad_human_info(BaseHandler):
  237. # TODO:不允许短时间,刷新
  238. @staticmethod
  239. def refresh_wechat_cookies(tornado_web, user_id):
  240. # TODO:添加互动接口,添加状态字段,打开selenium就变换
  241. # 1.返回二维码链接
  242. # ----1.查看cookie是否可用
  243. sql_session = db.DBSession()
  244. cookie_db = sql_tools.get_wechat_cookies(sql_session, user_id=user_id)
  245. # 进行登录操作
  246. log_ad = LogIn()
  247. # 使driver可以使用
  248. cookie_canuse = False
  249. if cookie_db:
  250. cookie_db = pickle.loads(cookie_db)
  251. # TODO:log 日志需要进行对应配置
  252. if not log_ad.wechat_cookies_check_alive(cookie_db):
  253. # cookie 不能使用
  254. wechat_code = log_ad.log_in()
  255. tornado_web.write({'status': {'msg': 'success', "RetCode": 200},
  256. 'wechat_code': wechat_code})
  257. print('cookie can not use')
  258. else:
  259. # cookie 可以继续使用
  260. cookie_canuse = True
  261. log_ad.driver.get('https://a.weixin.qq.com/index.html')
  262. tornado_web.write({'status': {'msg': 'success', "RetCode": 200}})
  263. else:
  264. # cookie 不能使用
  265. wechat_code = log_ad.log_in()
  266. tornado_web.write({'status': {'msg': 'success', "RetCode": 200},
  267. 'wechat_code': wechat_code})
  268. return log_ad, cookie_canuse
  269. # 1.人群包获取
  270. def get(self):
  271. # TODO:添加分页
  272. # 0.是否刷新
  273. # 1.获取userid,以及是否刷新
  274. user_id = self.get_argument("user_id", None)
  275. human_package_name = self.get_argument('human_package_name', None)
  276. is_refresh = self.get_argument("is_refresh", None)
  277. wechat_name = self.get_argument('wechat_name', None)
  278. service_name = self.get_argument('service_name', None)
  279. print(user_id, is_refresh)
  280. if user_id is None or is_refresh is None or wechat_name is None or service_name is None:
  281. self.write({'status': {'msg': 'url parameter error', "RetCode": 400}})
  282. return
  283. sql_session = db.DBSession()
  284. # TODO:一个涉及到selenium-driver的请求-生命周期.----看一下tornado是怎么处理请求的生命周期
  285. if int(is_refresh) == 1:
  286. log_ad, cookie_canuse = self.refresh_wechat_cookies(self, user_id=user_id)
  287. threading.Thread(target=user_action.get_human_info,
  288. args=(
  289. user_id, log_ad, db, cookie_canuse)).start()
  290. else:
  291. # 1.查看是否在刷新,
  292. # 在刷新中,
  293. # 返回正在刷新
  294. # -------不管上面逻辑让他们多刷新几次
  295. # 不在刷新
  296. # 返回对应数据
  297. # 2.获取userid对应数据
  298. result = sql_tools.get_human_info(sql_session=sql_session,
  299. service_name=service_name, wechat_name=wechat_name)
  300. print(result)
  301. result = json.loads(result)
  302. if human_package_name:
  303. result = [_ for _ in result if human_package_name in _['name']]
  304. result_ = []
  305. for i in range(len(result)):
  306. _ = result[i]
  307. _['id'] = i
  308. result_.append(_)
  309. self.write({'status': {'msg': 'success', "RetCode": 200},
  310. 'human_info': result})
  311. class ad_wechat_info(BaseHandler):
  312. # 1.公众号相关信息获取
  313. def get(self):
  314. # TODO:添加分页,
  315. # 公众号,服务商,唯一id设计或者获取
  316. # 0.是否刷新
  317. # 1.获取userid,以及是否刷新
  318. user_id = self.get_argument("user_id", None)
  319. is_refresh = self.get_argument("is_refresh", None)
  320. print(user_id, is_refresh)
  321. if user_id is None or is_refresh is None:
  322. self.write({'status': {'msg': 'url parameter error', "RetCode": 400}})
  323. return
  324. sql_session = db.DBSession()
  325. # TODO:一个涉及到selenium-driver的请求-生命周期.----看一下tornado是怎么处理请求的生命周期
  326. if int(is_refresh) == 1:
  327. log_ad, cookie_canuse = ad_human_info.refresh_wechat_cookies(self, user_id=user_id)
  328. threading.Thread(target=user_action.get_human_info,
  329. args=(
  330. user_id, log_ad, db, cookie_canuse)).start()
  331. else:
  332. # 1.查看是否在刷新,
  333. # 在刷新中,
  334. # 返回正在刷新
  335. # -------不管上面逻辑让他们多刷新几次
  336. # 不在刷新
  337. # 返回对应数据
  338. # 2.获取userid对应数据
  339. result = sql_tools.get_wechat_info(sql_session=sql_session, user_id=user_id)
  340. result_list = []
  341. for _ in result:
  342. service_name, wechat_name = _
  343. result_list.append({'service_name': service_name, 'wechat_name': wechat_name})
  344. print(result_list)
  345. self.write({'status': {'msg': 'success', "RetCode": 200},
  346. 'wechat_info': result_list})
  347. class delete_ad_layout(BaseHandler):
  348. def get(self):
  349. user_id = self.get_argument('user_id', None)
  350. layout_name = self.get_argument('layout_name', None)
  351. sql_session = db.DBSession()
  352. if user_id is None or layout_name is None:
  353. self.write({'status': {'msg': 'url parameter error', "RetCode": 400}})
  354. return
  355. # 落地页名字精确到毫秒,默认是全局唯一
  356. sql_tools.delete_layout_typesetting_vir(sql_session=sql_session, user_id=user_id,
  357. typesetting_name=layout_name)
  358. self.write({'status': {'msg': 'success', "RetCode": 200}})
  359. class delete_ad_plan(BaseHandler):
  360. def get(self):
  361. user_id = self.get_argument('user_id', None)
  362. plan_name = self.get_argument('plan_name', None)
  363. service_name = self.get_argument('service_name', None)
  364. wechat_name = self.get_argument('wechat_name', None)
  365. sql_session = db.DBSession()
  366. if user_id is None or plan_name is None:
  367. self.write({'status': {'msg': 'url parameter error', "RetCode": 400}})
  368. return
  369. # 落地页名字精确到毫秒,默认是全局唯一
  370. sql_tools.delete_ad_plan_typesetting_vir(sql_session=sql_session, user_id=user_id,
  371. typesetting_name=plan_name, wechat_name=wechat_name,
  372. service_name=service_name)
  373. self.write({'status': {'msg': 'success', "RetCode": 200}})
  374. class get_ad_wechat_service_name(BaseHandler):
  375. def get(self):
  376. user_id = self.get_argument('user_id', None)
  377. sql_session = db.DBSession()
  378. if user_id is None:
  379. self.write({'status': {'msg': 'url parameter error', "RetCode": 400}})
  380. return
  381. result = sql_tools.get_wechat_info_service_name(sql_session=sql_session, user_id=user_id)
  382. result_list = []
  383. for _ in result:
  384. service_name = _
  385. result_list.append({'service_name': service_name})
  386. print(result_list)
  387. self.write({'status': {'msg': 'success', "RetCode": 200},
  388. 'wechat_info': result_list})
  389. class get_ad_wechat_wechat_name(BaseHandler):
  390. def get(self):
  391. user_id = self.get_argument('user_id', None)
  392. service_name = self.get_argument('service_name', None)
  393. sql_session = db.DBSession()
  394. if user_id is None or service_name is None:
  395. self.write({'status': {'msg': 'url parameter error', "RetCode": 400}})
  396. return
  397. result = sql_tools.get_wechat_info_wechat_name(sql_session=sql_session, user_id=user_id,
  398. service_name=service_name)
  399. result_list = []
  400. for _ in result:
  401. service_name, wechat_name = _
  402. result_list.append({'service_name': service_name, 'wechat_name': wechat_name})
  403. print(result_list)
  404. self.write({'status': {'msg': 'success', "RetCode": 200},
  405. 'wechat_info': result_list})
  406. class get_plan_action_record(BaseHandler):
  407. def get(self):
  408. user_id = self.get_argument('user_id', None)
  409. service_name = self.get_argument('service_name', None)
  410. wechat_name = self.get_argument('wechat_name', None)
  411. status = self.get_argument('status', None)
  412. plan_name = self.get_argument('plan_name', None)
  413. sql_session = db.DBSession()
  414. if user_id is None:
  415. self.write({'status': {'msg': 'url parameter error', "RetCode": 400}})
  416. return
  417. # 落地页名字精确到毫秒,默认是全局唯一
  418. result = sql_tools.get_plan_record(sql_session=sql_session, user_id=user_id,
  419. service_name=service_name, wechat_name=wechat_name,
  420. status=status, plan_name=plan_name)
  421. result_ = []
  422. for i in range(len(result)):
  423. print(result[i])
  424. user_id, name, service_name, wechat_name, create_time, status, typesetting, wechat_id_info = result[i]
  425. _ = {}
  426. _['typesetting'] = json.loads(typesetting)
  427. _['ad_plan_name'] = name
  428. _['id'] = i
  429. _['create_time'] = create_time.strftime("%Y-%m-%d %H:%M:%S")
  430. _['service_name'] = service_name
  431. _['wechat_name'] = wechat_name
  432. _['wechat_id_info'] = wechat_id_info
  433. _['status'] = status
  434. result_.append(_)
  435. self.write({'statu': {'msg': 'success', "RetCode": 200},
  436. 'local_ad_plan_info': result_})
  437. class get_task_list(BaseHandler):
  438. def get(self):
  439. user_id = self.get_argument('user_id', None)
  440. sql_session = db.DBSession()
  441. if user_id is None:
  442. self.write({'status': {'msg': 'url parameter error', "RetCode": 400}})
  443. return
  444. # 落地页名字精确到毫秒,默认是全局唯一
  445. result = sql_tools.get_ad_task(sql_session=sql_session, user_id=user_id)
  446. result_ = []
  447. for i in range(len(result)):
  448. print(result[i])
  449. user_id, name, service_name, wechat_name, create_time, status, typesetting, wechat_id_info = result[i]
  450. _ = {}
  451. _['typesetting'] = json.loads(typesetting)
  452. _['ad_plan_name'] = name
  453. _['id'] = i
  454. _['create_time'] = create_time.strftime("%Y-%m-%d %H:%M:%S")
  455. _['service_name'] = service_name
  456. _['wechat_name'] = wechat_name
  457. _['wechat_id_info'] = wechat_id_info
  458. _['status'] = status
  459. result_.append(_)
  460. self.write({'statu': {'msg': 'success', "RetCode": 200},
  461. 'local_ad_plan_info': result_})
  462. class get_all_ad_task(BaseHandler):
  463. # TODO:添加两个字段,微信,朋友圈
  464. def get(self):
  465. user_id = self.get_argument('user_id', None)
  466. sql_session = db.DBSession()
  467. if user_id is None:
  468. self.write({'status': {'msg': 'url parameter error', "RetCode": 400}})
  469. return
  470. # 落地页名字精确到毫秒,默认是全局唯一
  471. result = sql_tools.get_ad_task(sql_session=sql_session, user_id=user_id)
  472. task_dict = {}
  473. localtion = ['微信', '']
  474. for _ in result:
  475. task_name, status, task_status_num, create_time, typesetting = _
  476. print(typesetting)
  477. typesetting = json.loads(typesetting)
  478. if typesetting['plan_base'][1] == 'pyq':
  479. localtion[1] = '朋友圈'
  480. create_time = create_time.strftime("%Y-%m-%d %H:%M:%S")
  481. if task_name not in task_dict.keys():
  482. task_dict[task_name] = {}
  483. task_dict[task_name][status] = (task_status_num, create_time)
  484. result_ = []
  485. num = 0
  486. for k, v in task_dict.items():
  487. # TODO:修改为dict的sort
  488. sum_num = 0
  489. print(k, v)
  490. new_dict = {}
  491. create_time = None
  492. for k_, v_ in v.items():
  493. task_status_num, create_time = v_
  494. sum_num = sum_num + task_status_num
  495. new_dict[k_] = task_status_num
  496. status = 'todo' if 'todo' in new_dict.keys() else 'done'
  497. task_dict[k]['sum_num'] = sum_num
  498. new_dict['sum_num'] = sum_num
  499. result_.append(
  500. {'task_name': k, 'task_info': new_dict, 'create_time': create_time, 'channel': localtion[0],
  501. 'localtion': localtion[1], 'id': num, 'status': status})
  502. num = num + 1
  503. print(json.dumps(task_dict))
  504. self.write({'statu': {'msg': 'success', "RetCode": 200},
  505. 'local_ad_plan_info': result_})
  506. def make_app():
  507. return tornado.web.Application([
  508. ("/get_all_ad_task", get_all_ad_task),
  509. ("/create_ad_plan", create_ad_plan),
  510. ("/get_ad_wechat_service_name", get_ad_wechat_service_name),
  511. ("/get_ad_wechat_wechat_name", get_ad_wechat_wechat_name),
  512. # ("/create_ad_plan_local", create_ad_plan_local),
  513. ("/create_ad_layout_local", create_ad_layout_local),
  514. ("/get_layout_local", get_ad_layout_local),
  515. ("/get_ad_plan_local", get_ad_plan_local),
  516. ("/delete_layout_local", delete_ad_layout),
  517. ("/delete_ad_plan_local", delete_ad_plan),
  518. # ("/create_ad_plan_remote", create_ad_plan_remote),
  519. # ("/create_ad_layout_remote", create_ad_layout_remote),
  520. ("/ad_human_info", ad_human_info),
  521. ("/ad_wechat_info", ad_wechat_info),
  522. # ("/ad_status", ad_status),
  523. ("/get_plan_action_record", get_plan_action_record),
  524. ("/get_task_list", get_task_list)
  525. ], debug=True, autoreload=True)
  526. if __name__ == "__main__":
  527. tornado.log.LogFormatter()
  528. app = make_app()
  529. app.listen(8888)
  530. tornado.ioloop.IOLoop.current().start()