app.py 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988
  1. import json
  2. import threading
  3. import time
  4. from flask import Flask, request, make_response
  5. from task.task_dict import task_dict
  6. from strategy.rpa_handler import rpa_handler
  7. from strategy.rpa_atom_handler import rpa_handler as rpa_atom_handler
  8. from flask_restful import Api
  9. from simplejson import JSONEncoder
  10. from scene.dongchedi.interaction_poc import dong_action, dongcd_stop
  11. from scene.oprator.atom_data import single_click_by_control, send_text_by_control, single_click_by_text, \
  12. get_content_by_control, start_app, stop_app
  13. from apscheduler.schedulers.background import BackgroundScheduler
  14. from task.task_job import auto_pull_task
  15. from tools import common_util, loggerKit, redis_client
  16. from tools.api_route import route
  17. app = Flask(__name__)
  18. # 实例化对象
  19. api = Api(app)
  20. # 404处理
  21. @app.errorhandler(404)
  22. def not_found(e):
  23. return make_response({'code': 404, 'msg': 'not found'}, 404)
  24. datas = [{'id': 1, 'name': 'xag', 'age': 18}, {'id': 2, 'name': 'xingag', 'age': 19}]
  25. @route(app, '/', methods=['POST', 'GET'])
  26. def hello_world():
  27. return {'lists': [0, 1, 2, 3, 4, 5]}
  28. @route(app, '/index', methods=['GET'])
  29. def index():
  30. return json.dumps(datas)
  31. # 异常处理
  32. @route(app, '/error', methods=['POST', 'GET'])
  33. def error():
  34. a = 99
  35. b = 0
  36. return a / b # 除0引发异常
  37. @route(app, '/start_douyin', methods=['POST'])
  38. def start_douyin():
  39. data = request.json
  40. if data is not None \
  41. and data.get('keyword') is not None \
  42. and data.get('content') is not None \
  43. and data.get('device_serials') is not None:
  44. keyword = data.get('keyword')
  45. content = data.get('content')
  46. device_serials = data.get('device_serials')
  47. # devices = device_serials.split(',')
  48. # 解析 mobile、device
  49. strs = device_serials.split(',')
  50. threads = []
  51. i = 0
  52. while i < len(strs):
  53. devices_mobiles = strs[i]
  54. device_mobile = devices_mobiles.split('+')
  55. # threads.append(threading.Thread(target=dou_action, args=(device_mobile[1], device_mobile[0], keyword,
  56. # content,))) operator_action(devices[i], keyword, content)
  57. i += 1
  58. for t in threads:
  59. print(t)
  60. t.start()
  61. else:
  62. return 400
  63. return 200
  64. @route(app, '/start_dong', methods=['POST'])
  65. def start_dong():
  66. data = request.json
  67. if data is not None \
  68. and data.get('keyword') is not None \
  69. and data.get('content') is not None \
  70. and data.get('device_serials') is not None:
  71. keyword = data.get('keyword')
  72. content = data.get('content')
  73. device_serials = data.get('device_serials')
  74. # devices = device_serials.split(',')
  75. # 解析 mobile、device
  76. strs = device_serials.split(',')
  77. threads = []
  78. i = 0
  79. while i < len(strs):
  80. devices_mobiles = strs[i]
  81. device_mobile = devices_mobiles.split('+')
  82. threads.append(
  83. threading.Thread(target=dong_action, args=(device_mobile[1], device_mobile[0], keyword, content,)))
  84. i += 1
  85. for t in threads:
  86. print(t)
  87. t.start()
  88. else:
  89. return 400
  90. return 200
  91. @route(app, '/stop_douyin', methods=['POST'])
  92. def dou_stop():
  93. data = request.json
  94. print(data)
  95. if data is not None \
  96. and data.get('device_serials') is not None:
  97. device_serials = data.get('device_serials')
  98. if ',' in device_serials:
  99. devices = device_serials.split(',')
  100. threads = []
  101. i = 0
  102. while i < len(devices):
  103. # threads.append(threading.Thread(target=douyin_stop, args=(devices[i],)))
  104. i += 1
  105. for t in threads:
  106. print(t)
  107. t.start()
  108. else:
  109. # douyin_stop(device_serials)
  110. pass
  111. else:
  112. return 400
  113. return 200
  114. @route(app, '/stop_dong', methods=['POST'])
  115. def dong_stop():
  116. data = request.json
  117. if data is not None \
  118. and data.get('device_serials') is not None:
  119. device_serials = data.get('device_serials')
  120. if ',' in device_serials:
  121. devices = device_serials.split(',')
  122. threads = []
  123. i = 0
  124. while i < len(devices):
  125. threads.append(threading.Thread(target=dongcd_stop, args=(devices[i],)))
  126. i += 1
  127. for t in threads:
  128. print(t)
  129. t.start()
  130. else:
  131. dongcd_stop(device_serials)
  132. else:
  133. return 400
  134. return 200
  135. @route(app, '/get_ip_info', methods=['GET'])
  136. def get_ip_info():
  137. common_util.get_ip_info('58.216.107.91')
  138. @route(app, '/get_local_ip', methods=['GET'])
  139. def query_local_ip():
  140. print(common_util.get_ip_info('8.8.8.8'))
  141. # 领取任务接口v2
  142. @route(app, '/api/action_v1', methods=['POST'])
  143. def do_action_v1():
  144. """
  145. :param deviceID [必填]设备的ID
  146. :param performActionId [非必填]前一条指令的ID
  147. :param performActionResult success or failure
  148. :param recognizedResult 你好,我是你根据控件Id查到的text内容
  149. 领取任务接口
  150. :return: 指令json串
  151. """
  152. data = request.json
  153. loggerKit.info('请求信息:{0}', data)
  154. device_id = data.get("deviceID")
  155. perform_action_id = data.get("performActionId")
  156. result = data.get("result")
  157. if device_id is None:
  158. loggerKit.info('请求信息:{0}', data)
  159. return_dict = {
  160. "data": "",
  161. "code": -1,
  162. "message": "fail, request device_id is null"
  163. }
  164. return return_dict
  165. # action0_id = int(round(time.time() * 1000))
  166. if result is not None:
  167. """
  168. 非首个指令
  169. """
  170. perform_action_result = result.get("performActionResult")
  171. if perform_action_result is None:
  172. return_dict = {
  173. "data": "",
  174. "code": -2,
  175. "message": "fail, performActionResult is null"
  176. }
  177. return return_dict
  178. action0_id_mem = redis_client.get(device_id)
  179. step0 = redis_client.get(f"{device_id}_step0")
  180. if step0 is not None and int(step0) == 1 and action0_id_mem is not None and int(perform_action_id) == int(
  181. action0_id_mem) and perform_action_result == "success":
  182. action1_id = int(round(time.time() * 1000))
  183. """
  184. 发送第1条指令
  185. 懂车帝APP首页点击搜索框
  186. """
  187. action1_dict = single_click_by_control(action1_id, target_version="7.9.0",
  188. control_id="com.ss.android.auto:id/c9c")
  189. redis_client.set(device_id + "operate", action1_id)
  190. redis_client.set(f"{device_id}_{action1_id}_step1", "1")
  191. redis_client.delete(f"{device_id}_step0")
  192. loggerKit.info("设备:{0}, action1_id:{1}", device_id, action1_id)
  193. return action1_dict
  194. action1_id_mem = redis_client.get(device_id)
  195. step1 = redis_client.get(f"{device_id}_{perform_action_id}_step1")
  196. if step1 is not None and int(step1) == 1 and action1_id_mem is not None and int(perform_action_id) == int(
  197. action1_id_mem) and perform_action_result == "success":
  198. loggerKit.info("设备:{0}, action1_id_mem:{1}", device_id, int(action1_id_mem))
  199. action2_id = int(round(time.time() * 1000))
  200. """
  201. 发送第2条指令
  202. 在搜索框输入关键词
  203. """
  204. action2_dict = send_text_by_control(action2_id, control_id="com.ss.android.auto:id/h5q", content="飞凡F7")
  205. redis_client.set(device_id + "operate", action2_id)
  206. redis_client.set(f"{device_id}_{action2_id}_step2", "1")
  207. redis_client.delete(f"{device_id}_{action2_id}_step1")
  208. loggerKit.info("设备:{0}, action2_id:{1}", device_id, action2_id)
  209. return action2_dict
  210. action2_id_mem = redis_client.get(device_id)
  211. step2 = redis_client.get(f"{device_id}_{perform_action_id}_step2")
  212. if step2 is not None and int(step2) == 1 and action2_id_mem is not None and int(perform_action_id) == int(
  213. action2_id_mem) and perform_action_result == "success":
  214. loggerKit.info("设备:{0}, action2_id_mem:{1}", device_id, int(action2_id_mem))
  215. action3_id = int(round(time.time() * 1000))
  216. """
  217. 发送第3条指令
  218. 点击搜索
  219. """
  220. action3_dict = single_click_by_control(action3_id, control_id="com.ss.android.auto:id/g9e")
  221. redis_client.set(device_id + "operate", action3_id)
  222. redis_client.set(f"{device_id}_{action3_id}_step3", "1")
  223. redis_client.delete(f"{device_id}_{action3_id}_step2")
  224. loggerKit.info("设备:{0}, action3_id:{1}", device_id, action3_id)
  225. return action3_dict
  226. action3_id_mem = redis_client.get(device_id)
  227. step3 = redis_client.get(f"{device_id}_{perform_action_id}_step3")
  228. if step3 is not None and int(step3) == 1 and action3_id_mem is not None and int(perform_action_id) == int(
  229. action3_id_mem) and perform_action_result == "success":
  230. loggerKit.info("设备:{0}, action3_id_mem:{1}", device_id, int(action3_id_mem))
  231. action4_id = int(round(time.time() * 1000))
  232. """
  233. 发送第4条指令
  234. 点击tab->口碑
  235. """
  236. action4_dict = single_click_by_text(action4_id, text="口碑")
  237. redis_client.set(device_id + "operate", action4_id)
  238. redis_client.set(f"{device_id}_{action4_id}_step4", "1")
  239. redis_client.delete(f"{device_id}_{action4_id}_step3")
  240. loggerKit.info("设备:{0}, action3_id:{1}", device_id, action4_id)
  241. return action4_dict
  242. action4_id_mem = redis_client.get(device_id)
  243. step4 = redis_client.get(f"{device_id}_{perform_action_id}_step4")
  244. if step4 is not None and int(step4) == 1 and action4_id_mem is not None and int(perform_action_id) == int(
  245. action4_id_mem) and perform_action_result == "success":
  246. loggerKit.info("设备:{0}, action4_id_mem:{1}", device_id, int(action4_id_mem))
  247. action5_id = int(round(time.time() * 1000))
  248. """
  249. 发送第5条指令
  250. 点击tab->车友圈
  251. """
  252. action5_dict = single_click_by_text(action5_id, text="车友圈")
  253. redis_client.set(device_id + "operate", action5_id)
  254. redis_client.set(f"{device_id}_{action5_id}_step5", "1")
  255. redis_client.delete(f"{device_id}_{action5_id}_step4")
  256. loggerKit.info("设备:{0}, action3_id:{1}", device_id, action5_id)
  257. return action5_dict
  258. action5_id_mem = redis_client.get(device_id)
  259. step5 = redis_client.get(f"{device_id}_{perform_action_id}_step5")
  260. if step5 is not None and int(step5) == 1 and action5_id_mem is not None and int(perform_action_id) == int(
  261. action5_id_mem) and perform_action_result == "success":
  262. loggerKit.info("设备:{0}, action5_id_mem:{1}", device_id, int(action5_id_mem))
  263. action6_id = int(round(time.time() * 1000))
  264. """
  265. 发送第6条指令
  266. 点击tab->用户
  267. """
  268. action6_dict = single_click_by_text(action6_id, text="用户")
  269. redis_client.set(device_id + "operate", action6_id)
  270. redis_client.set(f"{device_id}_{action6_id}_step6", "1")
  271. redis_client.delete(f"{device_id}_{action6_id}_step5")
  272. loggerKit.info("设备:{0}, action3_id:{1}", device_id, action6_id)
  273. return action6_dict
  274. # 判断是否有搜索结果
  275. action6_id_mem = redis_client.get(device_id)
  276. step6 = redis_client.get(f"{device_id}_{perform_action_id}_step6")
  277. if step6 is not None and int(step6) == 1 and action6_id_mem is not None and int(perform_action_id) == int(
  278. action6_id_mem) and perform_action_result == "success":
  279. loggerKit.info("设备:{0}, action6_id_mem:{1}", device_id, int(action6_id_mem))
  280. action7_id = int(round(time.time() * 1000))
  281. """
  282. 点击搜素出来的博主
  283. """
  284. action7_dict = single_click_by_text(action7_id, text="飞凡F7")
  285. redis_client.set(device_id + "operate", action7_id)
  286. redis_client.set(f"{device_id}_{action7_id}_step7", "1")
  287. redis_client.delete(f"{device_id}_{action7_id}_step6")
  288. loggerKit.info("设备:{0}, action7_id:{1}", device_id, action7_id)
  289. return action7_dict
  290. # 存在搜索结果
  291. action7_id_mem = redis_client.get(device_id)
  292. step7 = redis_client.get(f"{device_id}_{perform_action_id}_step7")
  293. if step7 is not None and int(step7) == 1 and action7_id_mem is not None and int(perform_action_id) == int(
  294. action7_id_mem) and perform_action_result == "success":
  295. loggerKit.info("设备:{0}, action7_id_mem:{1}", device_id, int(action7_id_mem))
  296. action8_id = int(round(time.time() * 1000))
  297. """
  298. 存在搜索结果,已经跳转到了用户中心首页
  299. 开始匹配文章
  300. """
  301. action8_dict = get_content_by_control(action8_id, control_id="android.widget.TextView",
  302. title="北京福7飞凡车队正式成立啦")
  303. redis_client.set(device_id + "operate", action8_id)
  304. redis_client.set(f"{device_id}_{action8_id}_step8", "1")
  305. redis_client.delete(f"{device_id}_{action8_id}_step7")
  306. loggerKit.info("设备:{0}, action8_id:{1}", device_id, action8_id)
  307. return action8_dict
  308. # 文章匹配,点击评论
  309. action8_id_mem = redis_client.get(device_id)
  310. step8 = redis_client.get(f"{device_id}_{perform_action_id}_step8")
  311. if step8 is not None and int(step8) == 1 and action8_id_mem is not None and int(perform_action_id) == int(
  312. action8_id_mem) and perform_action_result == "success":
  313. loggerKit.info("设备:{0}, action8_id_mem:{1}", device_id, int(action8_id_mem))
  314. action9_id = int(round(time.time() * 1000))
  315. """
  316. 文章匹配,点击评论
  317. """
  318. loggerKit.info("action9_id:{0}, 文章匹配,点击评论", action9_id)
  319. action9_dict = single_click_by_control(action9_id, control_id="com.ss.android.auto:id/ini")
  320. redis_client.set(device_id + "operate", action9_id)
  321. redis_client.set(f"{device_id}_{action9_id}_step9", "1")
  322. redis_client.delete(f"{device_id}_{action9_id}_step8")
  323. loggerKit.info("设备:{0}, action9_id:{1}", device_id, action9_id)
  324. return action9_dict
  325. # 文章匹配,点击输入框
  326. action9_id_mem = redis_client.get(device_id)
  327. step9 = redis_client.get(f"{device_id}_{perform_action_id}_step9")
  328. if step9 is not None and int(step9) == 1 and action9_id_mem is not None and int(perform_action_id) == int(
  329. action9_id_mem) and perform_action_result == "success":
  330. loggerKit.info("设备:{0}, action8_id_mem:{1}", device_id, int(action9_id_mem))
  331. action10_id = int(round(time.time() * 1000))
  332. """
  333. 文章匹配,点击输入框
  334. """
  335. loggerKit.info("action10_id:{0}, 文章匹配,点击输入框", action10_id)
  336. action10_dict = single_click_by_control(action10_id, control_id="com.ss.android.auto:id/inv")
  337. redis_client.set(device_id + "operate", action10_id)
  338. redis_client.set(f"{device_id}_{action10_id}_step10", "1")
  339. redis_client.delete(f"{device_id}_{action10_id}_step9")
  340. loggerKit.info("设备:{0}, action10_id:{1}", device_id, action10_id)
  341. return action10_dict
  342. # 文章匹配,点击输入框,返回回复内容
  343. action10_id_mem = redis_client.get(device_id)
  344. step10 = redis_client.get(f"{device_id}_{perform_action_id}_step10")
  345. if step10 is not None and int(step10) == 1 and action10_id_mem is not None and int(perform_action_id) == int(
  346. action10_id_mem) and perform_action_result == "success":
  347. loggerKit.info("设备:{0}, action10_id_mem:{1}", device_id, int(action10_id_mem))
  348. action11_id = int(round(time.time() * 1000))
  349. """
  350. 文章匹配,点击输入框,返回回复内容
  351. """
  352. loggerKit.info("action11_id:{0}, 文章title:{1}, 回复内容:{2}")
  353. action11_dict = send_text_by_control(action11_id, control_id="com.ss.android.auto:id/dcz", content="不错👍")
  354. redis_client.set(device_id + "operate", action11_id)
  355. redis_client.set(f"{device_id}_{action11_id}_step11", "1")
  356. redis_client.delete(f"{device_id}_{action11_id}_step10")
  357. loggerKit.info("设备:{0}, action11_id:{1}", device_id, action11_id)
  358. return action11_dict
  359. # 停止app
  360. action11_id_mem = redis_client.get(device_id)
  361. step11 = redis_client.get(f"{device_id}_{perform_action_id}_step11")
  362. if step11 is not None and int(step11) == 1 and action11_id_mem is not None and int(perform_action_id) == int(
  363. action11_id_mem) and perform_action_result == "success":
  364. loggerKit.info("设备:{0}, action11_id_mem:{1}", device_id, int(action11_id_mem))
  365. action12_id = int(round(time.time() * 1000))
  366. """
  367. 停止指令
  368. 停止app
  369. """
  370. action12_dict = stop_app(action12_id, target_version="7.9.0")
  371. redis_client.set(device_id + "operate", action12_id)
  372. redis_client.set(f"{device_id}_{action12_id}_step12", "1")
  373. redis_client.delete(f"{device_id}_{action12_id}_step11")
  374. # 批量模糊删除keys
  375. keys = redis_client.match_pattern_prefix(device_id)
  376. if len(keys) > 0:
  377. # 需要判断是否有匹配的值, 没有的话会报错
  378. for key in keys:
  379. redis_client.delete(key)
  380. loggerKit.info(f"clear {device_id} keys success...")
  381. else:
  382. loggerKit.info(f"{device_id} keys none ...")
  383. loggerKit.info("设备:{0}, action12_id:{1}", device_id, action12_id)
  384. return action12_dict
  385. else:
  386. action0_id = int(round(time.time() * 1000))
  387. """
  388. 启动指令
  389. 启动app
  390. """
  391. action0_dict = start_app(action0_id, target_version="7.9.0")
  392. redis_client.set(device_id + "operate", action0_id)
  393. redis_client.set(f"{device_id}_step0", "1")
  394. redis_client.delete(f"{device_id}_step9")
  395. loggerKit.info("设备:{0}, action0_id:{1}", device_id, action0_id)
  396. return action0_dict
  397. # 领取任务接口
  398. # @route(app, '/api/action_V2', methods=['POST'])
  399. def do_action_v2():
  400. """
  401. :param deviceID [必填]设备的ID
  402. :param performActionId [非必填]前一条指令的ID
  403. :param performActionResult success(指令成功) or failure(指令失败) or picNotFound(针对查找图片场景 图片未识别到) or stop(指令终止) or eleNotFound(针对元素 未获取到)
  404. :param recognizedResult 你好,我是你根据控件Id查到的text内容
  405. 领取任务接口
  406. :return: 指令json串
  407. """
  408. request_data = request.json
  409. loggerKit.info('请求信息:{0}'.format(request_data))
  410. device_id = request_data.get("deviceID")
  411. if device_id is None:
  412. loggerKit.info('请求信息异常:{0}'.format(request_data))
  413. return_dict = {
  414. "data": "",
  415. "code": -1,
  416. "message": "fail, request device_id is null"
  417. }
  418. return return_dict
  419. # 缓存中获取到对应的任务信息
  420. task_response = redis_client.get(device_id + "_task_json")
  421. if task_response is not None:
  422. data = json.loads(task_response)
  423. task = task_dict(str(data.get('taskId')), data.get('mediaChannel'), data.get('taskType'), data.get('taskDesc'),
  424. data.get('actionType'),
  425. data.get('resourceName'), data.get('subResourceName'), data.get('executeRobotAccount'),
  426. data.get('executeRobotName'), data.get('deviceId'), data.get('content'),
  427. data.get('answerType'),
  428. data.get('materialUri'),
  429. data.get('taskSubType'), data.get('taskSequenceId'), None, None, None, request_data,
  430. data.get('taskKey'))
  431. handler = rpa_handler().set_processor(task)
  432. return handler.process_rpa(task)
  433. # 领取任务接口
  434. # @route(app, '/api/action', methods=['POST'])
  435. def do_action_():
  436. """
  437. :param deviceID [必填]设备的ID
  438. :param performActionId [非必填]前一条指令的ID
  439. :param performActionResult success or failure
  440. :param recognizedResult 你好,我是你根据控件Id查到的text内容
  441. 领取任务接口
  442. :return: 指令json串
  443. """
  444. data = request.json
  445. loggerKit.info('请求信息:{0}'.format(data))
  446. device_id = data.get("deviceID")
  447. perform_action_id = data.get("performActionId")
  448. result = data.get("result")
  449. if device_id is None:
  450. loggerKit.info('请求信息异常:{0}'.format(data))
  451. return_dict = {
  452. "data": "",
  453. "code": -1,
  454. "message": "fail, request device_id is null"
  455. }
  456. return return_dict
  457. # 获取到对应策略
  458. action0_id_mem = redis_client.get(device_id)
  459. # action0_id = int(round(time.time() * 1000))
  460. if result is not None:
  461. """
  462. 非首个指令
  463. """
  464. perform_action_result = result.get("performActionResult")
  465. if perform_action_result is None:
  466. return_dict = {
  467. "data": "",
  468. "code": -2,
  469. "message": "fail, performActionResult is null"
  470. }
  471. return return_dict
  472. action0_id_mem = redis_client.get(device_id)
  473. step0 = redis_client.get(f"{device_id}_step0")
  474. if step0 is not None and int(step0) == 1 and action0_id_mem is not None and int(perform_action_id) == int(
  475. action0_id_mem) and perform_action_result == "success":
  476. action1_id = int(round(time.time() * 1000))
  477. """
  478. 发送第1条指令
  479. 懂车帝APP首页点击搜索框
  480. """
  481. action1_dict = single_click_by_control(action1_id, target_version="7.9.0",
  482. control_id="com.ss.android.auto:id/c9c")
  483. redis_client.set(device_id, action1_id)
  484. redis_client.set(f"{device_id}_{action1_id}_step1", "1")
  485. redis_client.delete(f"{device_id}_step0")
  486. loggerKit.info("设备:{0}, action1_id:{1}", device_id, action1_id)
  487. return action1_dict
  488. action1_id_mem = redis_client.get(device_id)
  489. step1 = redis_client.get(f"{device_id}_{perform_action_id}_step1")
  490. if step1 is not None and int(step1) == 1 and action1_id_mem is not None and int(perform_action_id) == int(
  491. action1_id_mem) and perform_action_result == "success":
  492. loggerKit.info("设备:{0}, action1_id_mem:{1}", device_id, int(action1_id_mem))
  493. action2_id = int(round(time.time() * 1000))
  494. """
  495. 发送第2条指令
  496. 在搜索框输入关键词
  497. """
  498. action2_dict = send_text_by_control(action2_id, control_id="com.ss.android.auto:id/h5q", content="飞凡F7")
  499. redis_client.set(device_id, action2_id)
  500. redis_client.set(f"{device_id}_{action2_id}_step2", "1")
  501. redis_client.delete(f"{device_id}_{action2_id}_step1")
  502. loggerKit.info("设备:{0}, action2_id:{1}", device_id, action2_id)
  503. return action2_dict
  504. action2_id_mem = redis_client.get(device_id)
  505. step2 = redis_client.get(f"{device_id}_{perform_action_id}_step2")
  506. if step2 is not None and int(step2) == 1 and action2_id_mem is not None and int(perform_action_id) == int(
  507. action2_id_mem) and perform_action_result == "success":
  508. loggerKit.info("设备:{0}, action2_id_mem:{1}", device_id, int(action2_id_mem))
  509. action3_id = int(round(time.time() * 1000))
  510. """
  511. 发送第3条指令
  512. 点击搜索
  513. """
  514. action3_dict = single_click_by_control(action3_id, control_id="com.ss.android.auto:id/g9e")
  515. redis_client.set(device_id, action3_id)
  516. redis_client.set(f"{device_id}_{action3_id}_step3", "1")
  517. redis_client.delete(f"{device_id}_{action3_id}_step2")
  518. loggerKit.info("设备:{0}, action3_id:{1}", device_id, action3_id)
  519. return action3_dict
  520. action3_id_mem = redis_client.get(device_id)
  521. step3 = redis_client.get(f"{device_id}_{perform_action_id}_step3")
  522. if step3 is not None and int(step3) == 1 and action3_id_mem is not None and int(perform_action_id) == int(
  523. action3_id_mem) and perform_action_result == "success":
  524. loggerKit.info("设备:{0}, action3_id_mem:{1}", device_id, int(action3_id_mem))
  525. action4_id = int(round(time.time() * 1000))
  526. """
  527. 发送第4条指令
  528. 点击tab->口碑
  529. """
  530. action4_dict = single_click_by_text(action4_id, text="二手车")
  531. redis_client.set(device_id, action4_id)
  532. redis_client.set(f"{device_id}_{action4_id}_step4", "1")
  533. redis_client.delete(f"{device_id}_{action4_id}_step3")
  534. loggerKit.info("设备:{0}, action3_id:{1}", device_id, action4_id)
  535. return action4_dict
  536. action4_id_mem = redis_client.get(device_id)
  537. step4 = redis_client.get(f"{device_id}_{perform_action_id}_step4")
  538. if step4 is not None and int(step4) == 1 and action4_id_mem is not None and int(perform_action_id) == int(
  539. action4_id_mem) and perform_action_result == "success":
  540. loggerKit.info("设备:{0}, action4_id_mem:{1}", device_id, int(action4_id_mem))
  541. action5_id = int(round(time.time() * 1000))
  542. """
  543. 发送第5条指令
  544. 点击tab->车友圈
  545. """
  546. action5_dict = single_click_by_text(action5_id, text="车友圈")
  547. redis_client.set(device_id, action5_id)
  548. redis_client.set(f"{device_id}_{action5_id}_step5", "1")
  549. redis_client.delete(f"{device_id}_{action5_id}_step4")
  550. loggerKit.info("设备:{0}, action3_id:{1}", device_id, action5_id)
  551. return action5_dict
  552. action5_id_mem = redis_client.get(device_id)
  553. step5 = redis_client.get(f"{device_id}_{perform_action_id}_step5")
  554. if step5 is not None and int(step5) == 1 and action5_id_mem is not None and int(perform_action_id) == int(
  555. action5_id_mem) and perform_action_result == "success":
  556. loggerKit.info("设备:{0}, action5_id_mem:{1}", device_id, int(action5_id_mem))
  557. action6_id = int(round(time.time() * 1000))
  558. """
  559. 发送第6条指令
  560. 点击tab->用户
  561. """
  562. action6_dict = single_click_by_text(action6_id, text="用户")
  563. redis_client.set(device_id, action6_id)
  564. redis_client.set(f"{device_id}_{action6_id}_step6", "1")
  565. redis_client.delete(f"{device_id}_{action6_id}_step5")
  566. loggerKit.info("设备:{0}, action3_id:{1}", device_id, action6_id)
  567. return action6_dict
  568. # 判断是否有搜索结果
  569. action6_id_mem = redis_client.get(device_id)
  570. step6 = redis_client.get(f"{device_id}_{perform_action_id}_step6")
  571. if step6 is not None and int(step6) == 1 and action6_id_mem is not None and int(perform_action_id) == int(
  572. action6_id_mem) and perform_action_result == "success":
  573. loggerKit.info("设备:{0}, action6_id_mem:{1}", device_id, int(action6_id_mem))
  574. action7_id = int(round(time.time() * 1000))
  575. """
  576. 点击搜素出来的博主
  577. """
  578. action7_dict = single_click_by_text(action7_id, text="飞凡F7")
  579. redis_client.set(device_id, action7_id)
  580. redis_client.set(f"{device_id}_{action7_id}_step7", "1")
  581. redis_client.delete(f"{device_id}_{action7_id}_step6")
  582. loggerKit.info("设备:{0}, action7_id:{1}", device_id, action7_id)
  583. return action7_dict
  584. # 存在搜索结果
  585. action7_id_mem = redis_client.get(device_id)
  586. step7 = redis_client.get(f"{device_id}_{perform_action_id}_step7")
  587. if step7 is not None and int(step7) == 1 and action7_id_mem is not None and int(perform_action_id) == int(
  588. action7_id_mem) and perform_action_result == "success":
  589. loggerKit.info("设备:{0}, action7_id_mem:{1}", device_id, int(action7_id_mem))
  590. action8_id = int(round(time.time() * 1000))
  591. """
  592. 存在搜索结果,已经跳转到了用户中心首页
  593. 开始匹配文章
  594. """
  595. action8_dict = get_content_by_control(action8_id, control_id="android.widget.TextView",
  596. title="北京福7飞凡车队正式成立啦")
  597. redis_client.set(device_id, action8_id)
  598. redis_client.set(f"{device_id}_{action8_id}_step8", "1")
  599. redis_client.delete(f"{device_id}_{action8_id}_step7")
  600. loggerKit.info("设备:{0}, action8_id:{1}", device_id, action8_id)
  601. return action8_dict
  602. # 文章评论,点击铅笔父节点
  603. action8_id_mem = redis_client.get(device_id)
  604. step8 = redis_client.get(f"{device_id}_{perform_action_id}_step8")
  605. if step8 is not None and int(step8) == 1 and action8_id_mem is not None and int(perform_action_id) == int(
  606. action8_id_mem) and perform_action_result == "success":
  607. loggerKit.info("设备:{0}, action8_id_mem:{1}", device_id, int(action8_id_mem))
  608. action9_id = int(round(time.time() * 1000))
  609. """
  610. 文章匹配,点击评论
  611. """
  612. loggerKit.info("action9_id:{0}, 文章评论,点击铅笔父节点", action9_id)
  613. action9_dict = single_click_by_control(action9_id, control_id="com.ss.android.auto:id/d98")
  614. redis_client.set(device_id, action9_id)
  615. redis_client.set(f"{device_id}_{action9_id}_step9", "1")
  616. redis_client.delete(f"{device_id}_{action9_id}_step8")
  617. loggerKit.info("设备:{0}, action9_id:{1}", device_id, action9_id)
  618. return action9_dict
  619. """
  620. 文章匹配,点击输入框,返回回复内容
  621. """
  622. action9_id_mem = redis_client.get(device_id)
  623. step9 = redis_client.get(f"{device_id}_{perform_action_id}_step9")
  624. if step9 is not None and int(step9) == 1 and action9_id_mem is not None and int(perform_action_id) == int(
  625. action9_id_mem) and perform_action_result == "success":
  626. loggerKit.info("设备:{0}, action9_id_mem:{1}", device_id, int(action9_id_mem))
  627. action10_id = int(round(time.time() * 1000))
  628. """
  629. 文章匹配,点击输入框,返回回复内容
  630. """
  631. loggerKit.info("action10_id:{0}, 文章title:{1}, 回复内容:{2}")
  632. action11_dict = send_text_by_control(action10_id, control_id="com.ss.android.auto:id/byd", content="不错👍")
  633. redis_client.set(device_id, action10_id)
  634. redis_client.set(f"{device_id}_{action10_id}_step10", "1")
  635. redis_client.delete(f"{device_id}_{action10_id}_step9")
  636. loggerKit.info("设备:{0}, action10_id:{1}", device_id, action10_id)
  637. return action11_dict
  638. """
  639. 点击发送按钮
  640. """
  641. action10_id_mem = redis_client.get(device_id)
  642. step10 = redis_client.get(f"{device_id}_{perform_action_id}_step10")
  643. if step10 is not None and int(step10) == 1 and action10_id_mem is not None and int(perform_action_id) == int(
  644. action10_id_mem) and perform_action_result == "success":
  645. loggerKit.info("设备:{0}, action9_id_mem:{1}", device_id, int(action10_id_mem))
  646. action11_id = int(round(time.time() * 1000))
  647. """
  648. 文章匹配,点击输入框,返回回复内容
  649. """
  650. action11_dict = single_click_by_control(action11_id, control_id="com.ss.android.auto:id/jxq")
  651. redis_client.set(device_id, action11_id)
  652. redis_client.set(f"{device_id}_{action11_id}_step11", "1")
  653. redis_client.delete(f"{device_id}_{action11_id}_step10")
  654. loggerKit.info("设备:{0}, action11_id:{1}", device_id, action11_id)
  655. return action11_dict
  656. """
  657. 停止app
  658. """
  659. action11_id_mem = redis_client.get(device_id)
  660. step11 = redis_client.get(f"{device_id}_{perform_action_id}_step11")
  661. if step11 is not None and int(step11) == 1 and action11_id_mem is not None and int(perform_action_id) == int(
  662. action11_id_mem) and perform_action_result == "success":
  663. loggerKit.info("设备:{0}, action10_id_mem:{1}", device_id, int(action11_id_mem))
  664. action12_id = int(round(time.time() * 1000))
  665. """
  666. 停止指令
  667. 停止app
  668. """
  669. action12_dict = stop_app(action12_id, target_version="7.9.0")
  670. redis_client.set(device_id, action12_id)
  671. redis_client.set(f"{device_id}_{action12_id}_step12", "1")
  672. redis_client.delete(f"{device_id}_{action12_id}_step11")
  673. # 批量模糊删除keys
  674. keys = redis_client.match_pattern_prefix(device_id)
  675. if len(keys) > 0:
  676. # 需要判断是否有匹配的值, 没有的话会报错
  677. for key in keys:
  678. redis_client.delete(key)
  679. loggerKit.info(f"clear {device_id} keys success...")
  680. else:
  681. loggerKit.info(f"{device_id} keys none ...")
  682. loggerKit.info("设备:{0}, action12_id:{1}", device_id, action12_dict)
  683. return action12_dict
  684. else:
  685. action0_id = int(round(time.time() * 1000))
  686. """
  687. 启动指令
  688. 启动app
  689. """
  690. action0_dict = start_app(action0_id, target_version="7.9.0")
  691. redis_client.set(device_id, action0_id)
  692. redis_client.set(f"{device_id}_step0", "1")
  693. redis_client.delete(f"{device_id}_step9")
  694. loggerKit.info("设备:{0}, action0_id:{1}", device_id, action0_id)
  695. return action0_dict
  696. # 定时任务
  697. def scheduler_start():
  698. rpa_scheduler = BackgroundScheduler()
  699. # 定时拉取任务
  700. rpa_scheduler.add_job(auto_pull_task, 'interval', seconds=1, max_instances=60)
  701. # 定时上报设备状态
  702. # rpa_scheduler.add_job(auto_synchronization_devices_status_func, 'interval', seconds=60, max_instances=2)
  703. rpa_scheduler.start()
  704. @route(app, '/api/action', methods=['POST'])
  705. def do_action():
  706. """
  707. 入参:
  708. :param taskId
  709. :param taskType
  710. :param subTaskType
  711. :param requestId
  712. :param scriptName
  713. :param deviceID [必填]设备的ID
  714. :param performActionId [非必填]前一条指令的ID
  715. :param performActionResult success(指令成功) or failure(指令失败) or picNotFound(针对查找图片场景 图片未识别到) or stop(指令终止) or eleNotFound(针对元素 未获取到)
  716. :param recognizedResult 你好,我是你根据控件Id查到的text内容
  717. 领取任务接口
  718. :return: 指令json串
  719. """
  720. request_data = request.json
  721. loggerKit.info('请求信息:{0}'.format(request_data))
  722. # device_work(device_id)
  723. # 缓存中获取到对应的任务信息
  724. # task_response = redis_client.get(device_id + "_task_json")
  725. """
  726. 根据任务类型、子任务类型匹配不同的执行脚本
  727. """
  728. if request_data is not None:
  729. device_id = request_data.get("deviceID")
  730. # task_id = request_data.get("taskID")
  731. # task_type = request_data.get("taskType")
  732. # sub_task_type = request_data.get("subTaskType")
  733. data = request_data.get("data")
  734. if device_id is None or data is None:
  735. loggerKit.info('请求信息异常:{0}'.format(request_data))
  736. return_dict = {
  737. "data": "",
  738. "code": -1,
  739. "message": "fail, request device_id or task_pull_data is none"
  740. }
  741. return return_dict
  742. task = task_dict(int(data.get('taskId')), data.get('mediaChannel'), data.get('taskType'), data.get('taskDesc'),
  743. data.get('actionType'),
  744. data.get('resourceName'), data.get('subResourceName'), data.get('executeRobotAccount'),
  745. data.get('executeRobotName'), data.get('deviceId'), data.get('content'),
  746. data.get('answerType'),
  747. data.get('materialUri'),
  748. data.get('taskSubType'), data.get('taskSequenceId'), None, None, None, request_data,data.get('taskKey'))
  749. handler = rpa_atom_handler().set_processor(task)
  750. return handler.process_rpa(task)
  751. if __name__ == '__main__':
  752. app.json_encoder = JSONEncoder
  753. # scheduler_start()
  754. app.run(debug=True, host='0.0.0.0', port=80)
  755. print(f'API服务启动成功')