| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988 |
- import json
- import threading
- import time
- from flask import Flask, request, make_response
- from task.task_dict import task_dict
- from strategy.rpa_handler import rpa_handler
- from strategy.rpa_atom_handler import rpa_handler as rpa_atom_handler
- from flask_restful import Api
- from simplejson import JSONEncoder
- from scene.dongchedi.interaction_poc import dong_action, dongcd_stop
- from scene.oprator.atom_data import single_click_by_control, send_text_by_control, single_click_by_text, \
- get_content_by_control, start_app, stop_app
- from apscheduler.schedulers.background import BackgroundScheduler
- from task.task_job import auto_pull_task
- from tools import common_util, loggerKit, redis_client
- from tools.api_route import route
- app = Flask(__name__)
- # 实例化对象
- api = Api(app)
- # 404处理
- @app.errorhandler(404)
- def not_found(e):
- return make_response({'code': 404, 'msg': 'not found'}, 404)
- datas = [{'id': 1, 'name': 'xag', 'age': 18}, {'id': 2, 'name': 'xingag', 'age': 19}]
- @route(app, '/', methods=['POST', 'GET'])
- def hello_world():
- return {'lists': [0, 1, 2, 3, 4, 5]}
- @route(app, '/index', methods=['GET'])
- def index():
- return json.dumps(datas)
- # 异常处理
- @route(app, '/error', methods=['POST', 'GET'])
- def error():
- a = 99
- b = 0
- return a / b # 除0引发异常
- @route(app, '/start_douyin', methods=['POST'])
- def start_douyin():
- data = request.json
- if data is not None \
- and data.get('keyword') is not None \
- and data.get('content') is not None \
- and data.get('device_serials') is not None:
- keyword = data.get('keyword')
- content = data.get('content')
- device_serials = data.get('device_serials')
- # devices = device_serials.split(',')
- # 解析 mobile、device
- strs = device_serials.split(',')
- threads = []
- i = 0
- while i < len(strs):
- devices_mobiles = strs[i]
- device_mobile = devices_mobiles.split('+')
- # threads.append(threading.Thread(target=dou_action, args=(device_mobile[1], device_mobile[0], keyword,
- # content,))) operator_action(devices[i], keyword, content)
- i += 1
- for t in threads:
- print(t)
- t.start()
- else:
- return 400
- return 200
- @route(app, '/start_dong', methods=['POST'])
- def start_dong():
- data = request.json
- if data is not None \
- and data.get('keyword') is not None \
- and data.get('content') is not None \
- and data.get('device_serials') is not None:
- keyword = data.get('keyword')
- content = data.get('content')
- device_serials = data.get('device_serials')
- # devices = device_serials.split(',')
- # 解析 mobile、device
- strs = device_serials.split(',')
- threads = []
- i = 0
- while i < len(strs):
- devices_mobiles = strs[i]
- device_mobile = devices_mobiles.split('+')
- threads.append(
- threading.Thread(target=dong_action, args=(device_mobile[1], device_mobile[0], keyword, content,)))
- i += 1
- for t in threads:
- print(t)
- t.start()
- else:
- return 400
- return 200
- @route(app, '/stop_douyin', methods=['POST'])
- def dou_stop():
- data = request.json
- print(data)
- if data is not None \
- and data.get('device_serials') is not None:
- device_serials = data.get('device_serials')
- if ',' in device_serials:
- devices = device_serials.split(',')
- threads = []
- i = 0
- while i < len(devices):
- # threads.append(threading.Thread(target=douyin_stop, args=(devices[i],)))
- i += 1
- for t in threads:
- print(t)
- t.start()
- else:
- # douyin_stop(device_serials)
- pass
- else:
- return 400
- return 200
- @route(app, '/stop_dong', methods=['POST'])
- def dong_stop():
- data = request.json
- if data is not None \
- and data.get('device_serials') is not None:
- device_serials = data.get('device_serials')
- if ',' in device_serials:
- devices = device_serials.split(',')
- threads = []
- i = 0
- while i < len(devices):
- threads.append(threading.Thread(target=dongcd_stop, args=(devices[i],)))
- i += 1
- for t in threads:
- print(t)
- t.start()
- else:
- dongcd_stop(device_serials)
- else:
- return 400
- return 200
- @route(app, '/get_ip_info', methods=['GET'])
- def get_ip_info():
- common_util.get_ip_info('58.216.107.91')
- @route(app, '/get_local_ip', methods=['GET'])
- def query_local_ip():
- print(common_util.get_ip_info('8.8.8.8'))
- # 领取任务接口v2
- @route(app, '/api/action_v1', methods=['POST'])
- def do_action_v1():
- """
- :param deviceID [必填]设备的ID
- :param performActionId [非必填]前一条指令的ID
- :param performActionResult success or failure
- :param recognizedResult 你好,我是你根据控件Id查到的text内容
- 领取任务接口
- :return: 指令json串
- """
- data = request.json
- loggerKit.info('请求信息:{0}', data)
- device_id = data.get("deviceID")
- perform_action_id = data.get("performActionId")
- result = data.get("result")
- if device_id is None:
- loggerKit.info('请求信息:{0}', data)
- return_dict = {
- "data": "",
- "code": -1,
- "message": "fail, request device_id is null"
- }
- return return_dict
- # action0_id = int(round(time.time() * 1000))
- if result is not None:
- """
- 非首个指令
- """
- perform_action_result = result.get("performActionResult")
- if perform_action_result is None:
- return_dict = {
- "data": "",
- "code": -2,
- "message": "fail, performActionResult is null"
- }
- return return_dict
- action0_id_mem = redis_client.get(device_id)
- step0 = redis_client.get(f"{device_id}_step0")
- if step0 is not None and int(step0) == 1 and action0_id_mem is not None and int(perform_action_id) == int(
- action0_id_mem) and perform_action_result == "success":
- action1_id = int(round(time.time() * 1000))
- """
- 发送第1条指令
- 懂车帝APP首页点击搜索框
- """
- action1_dict = single_click_by_control(action1_id, target_version="7.9.0",
- control_id="com.ss.android.auto:id/c9c")
- redis_client.set(device_id + "operate", action1_id)
- redis_client.set(f"{device_id}_{action1_id}_step1", "1")
- redis_client.delete(f"{device_id}_step0")
- loggerKit.info("设备:{0}, action1_id:{1}", device_id, action1_id)
- return action1_dict
- action1_id_mem = redis_client.get(device_id)
- step1 = redis_client.get(f"{device_id}_{perform_action_id}_step1")
- if step1 is not None and int(step1) == 1 and action1_id_mem is not None and int(perform_action_id) == int(
- action1_id_mem) and perform_action_result == "success":
- loggerKit.info("设备:{0}, action1_id_mem:{1}", device_id, int(action1_id_mem))
- action2_id = int(round(time.time() * 1000))
- """
- 发送第2条指令
- 在搜索框输入关键词
- """
- action2_dict = send_text_by_control(action2_id, control_id="com.ss.android.auto:id/h5q", content="飞凡F7")
- redis_client.set(device_id + "operate", action2_id)
- redis_client.set(f"{device_id}_{action2_id}_step2", "1")
- redis_client.delete(f"{device_id}_{action2_id}_step1")
- loggerKit.info("设备:{0}, action2_id:{1}", device_id, action2_id)
- return action2_dict
- action2_id_mem = redis_client.get(device_id)
- step2 = redis_client.get(f"{device_id}_{perform_action_id}_step2")
- if step2 is not None and int(step2) == 1 and action2_id_mem is not None and int(perform_action_id) == int(
- action2_id_mem) and perform_action_result == "success":
- loggerKit.info("设备:{0}, action2_id_mem:{1}", device_id, int(action2_id_mem))
- action3_id = int(round(time.time() * 1000))
- """
- 发送第3条指令
- 点击搜索
- """
- action3_dict = single_click_by_control(action3_id, control_id="com.ss.android.auto:id/g9e")
- redis_client.set(device_id + "operate", action3_id)
- redis_client.set(f"{device_id}_{action3_id}_step3", "1")
- redis_client.delete(f"{device_id}_{action3_id}_step2")
- loggerKit.info("设备:{0}, action3_id:{1}", device_id, action3_id)
- return action3_dict
- action3_id_mem = redis_client.get(device_id)
- step3 = redis_client.get(f"{device_id}_{perform_action_id}_step3")
- if step3 is not None and int(step3) == 1 and action3_id_mem is not None and int(perform_action_id) == int(
- action3_id_mem) and perform_action_result == "success":
- loggerKit.info("设备:{0}, action3_id_mem:{1}", device_id, int(action3_id_mem))
- action4_id = int(round(time.time() * 1000))
- """
- 发送第4条指令
- 点击tab->口碑
- """
- action4_dict = single_click_by_text(action4_id, text="口碑")
- redis_client.set(device_id + "operate", action4_id)
- redis_client.set(f"{device_id}_{action4_id}_step4", "1")
- redis_client.delete(f"{device_id}_{action4_id}_step3")
- loggerKit.info("设备:{0}, action3_id:{1}", device_id, action4_id)
- return action4_dict
- action4_id_mem = redis_client.get(device_id)
- step4 = redis_client.get(f"{device_id}_{perform_action_id}_step4")
- if step4 is not None and int(step4) == 1 and action4_id_mem is not None and int(perform_action_id) == int(
- action4_id_mem) and perform_action_result == "success":
- loggerKit.info("设备:{0}, action4_id_mem:{1}", device_id, int(action4_id_mem))
- action5_id = int(round(time.time() * 1000))
- """
- 发送第5条指令
- 点击tab->车友圈
- """
- action5_dict = single_click_by_text(action5_id, text="车友圈")
- redis_client.set(device_id + "operate", action5_id)
- redis_client.set(f"{device_id}_{action5_id}_step5", "1")
- redis_client.delete(f"{device_id}_{action5_id}_step4")
- loggerKit.info("设备:{0}, action3_id:{1}", device_id, action5_id)
- return action5_dict
- action5_id_mem = redis_client.get(device_id)
- step5 = redis_client.get(f"{device_id}_{perform_action_id}_step5")
- if step5 is not None and int(step5) == 1 and action5_id_mem is not None and int(perform_action_id) == int(
- action5_id_mem) and perform_action_result == "success":
- loggerKit.info("设备:{0}, action5_id_mem:{1}", device_id, int(action5_id_mem))
- action6_id = int(round(time.time() * 1000))
- """
- 发送第6条指令
- 点击tab->用户
- """
- action6_dict = single_click_by_text(action6_id, text="用户")
- redis_client.set(device_id + "operate", action6_id)
- redis_client.set(f"{device_id}_{action6_id}_step6", "1")
- redis_client.delete(f"{device_id}_{action6_id}_step5")
- loggerKit.info("设备:{0}, action3_id:{1}", device_id, action6_id)
- return action6_dict
- # 判断是否有搜索结果
- action6_id_mem = redis_client.get(device_id)
- step6 = redis_client.get(f"{device_id}_{perform_action_id}_step6")
- if step6 is not None and int(step6) == 1 and action6_id_mem is not None and int(perform_action_id) == int(
- action6_id_mem) and perform_action_result == "success":
- loggerKit.info("设备:{0}, action6_id_mem:{1}", device_id, int(action6_id_mem))
- action7_id = int(round(time.time() * 1000))
- """
- 点击搜素出来的博主
- """
- action7_dict = single_click_by_text(action7_id, text="飞凡F7")
- redis_client.set(device_id + "operate", action7_id)
- redis_client.set(f"{device_id}_{action7_id}_step7", "1")
- redis_client.delete(f"{device_id}_{action7_id}_step6")
- loggerKit.info("设备:{0}, action7_id:{1}", device_id, action7_id)
- return action7_dict
- # 存在搜索结果
- action7_id_mem = redis_client.get(device_id)
- step7 = redis_client.get(f"{device_id}_{perform_action_id}_step7")
- if step7 is not None and int(step7) == 1 and action7_id_mem is not None and int(perform_action_id) == int(
- action7_id_mem) and perform_action_result == "success":
- loggerKit.info("设备:{0}, action7_id_mem:{1}", device_id, int(action7_id_mem))
- action8_id = int(round(time.time() * 1000))
- """
- 存在搜索结果,已经跳转到了用户中心首页
- 开始匹配文章
- """
- action8_dict = get_content_by_control(action8_id, control_id="android.widget.TextView",
- title="北京福7飞凡车队正式成立啦")
- redis_client.set(device_id + "operate", action8_id)
- redis_client.set(f"{device_id}_{action8_id}_step8", "1")
- redis_client.delete(f"{device_id}_{action8_id}_step7")
- loggerKit.info("设备:{0}, action8_id:{1}", device_id, action8_id)
- return action8_dict
- # 文章匹配,点击评论
- action8_id_mem = redis_client.get(device_id)
- step8 = redis_client.get(f"{device_id}_{perform_action_id}_step8")
- if step8 is not None and int(step8) == 1 and action8_id_mem is not None and int(perform_action_id) == int(
- action8_id_mem) and perform_action_result == "success":
- loggerKit.info("设备:{0}, action8_id_mem:{1}", device_id, int(action8_id_mem))
- action9_id = int(round(time.time() * 1000))
- """
- 文章匹配,点击评论
- """
- loggerKit.info("action9_id:{0}, 文章匹配,点击评论", action9_id)
- action9_dict = single_click_by_control(action9_id, control_id="com.ss.android.auto:id/ini")
- redis_client.set(device_id + "operate", action9_id)
- redis_client.set(f"{device_id}_{action9_id}_step9", "1")
- redis_client.delete(f"{device_id}_{action9_id}_step8")
- loggerKit.info("设备:{0}, action9_id:{1}", device_id, action9_id)
- return action9_dict
- # 文章匹配,点击输入框
- action9_id_mem = redis_client.get(device_id)
- step9 = redis_client.get(f"{device_id}_{perform_action_id}_step9")
- if step9 is not None and int(step9) == 1 and action9_id_mem is not None and int(perform_action_id) == int(
- action9_id_mem) and perform_action_result == "success":
- loggerKit.info("设备:{0}, action8_id_mem:{1}", device_id, int(action9_id_mem))
- action10_id = int(round(time.time() * 1000))
- """
- 文章匹配,点击输入框
- """
- loggerKit.info("action10_id:{0}, 文章匹配,点击输入框", action10_id)
- action10_dict = single_click_by_control(action10_id, control_id="com.ss.android.auto:id/inv")
- redis_client.set(device_id + "operate", action10_id)
- redis_client.set(f"{device_id}_{action10_id}_step10", "1")
- redis_client.delete(f"{device_id}_{action10_id}_step9")
- loggerKit.info("设备:{0}, action10_id:{1}", device_id, action10_id)
- return action10_dict
- # 文章匹配,点击输入框,返回回复内容
- action10_id_mem = redis_client.get(device_id)
- step10 = redis_client.get(f"{device_id}_{perform_action_id}_step10")
- if step10 is not None and int(step10) == 1 and action10_id_mem is not None and int(perform_action_id) == int(
- action10_id_mem) and perform_action_result == "success":
- loggerKit.info("设备:{0}, action10_id_mem:{1}", device_id, int(action10_id_mem))
- action11_id = int(round(time.time() * 1000))
- """
- 文章匹配,点击输入框,返回回复内容
- """
- loggerKit.info("action11_id:{0}, 文章title:{1}, 回复内容:{2}")
- action11_dict = send_text_by_control(action11_id, control_id="com.ss.android.auto:id/dcz", content="不错👍")
- redis_client.set(device_id + "operate", action11_id)
- redis_client.set(f"{device_id}_{action11_id}_step11", "1")
- redis_client.delete(f"{device_id}_{action11_id}_step10")
- loggerKit.info("设备:{0}, action11_id:{1}", device_id, action11_id)
- return action11_dict
- # 停止app
- action11_id_mem = redis_client.get(device_id)
- step11 = redis_client.get(f"{device_id}_{perform_action_id}_step11")
- if step11 is not None and int(step11) == 1 and action11_id_mem is not None and int(perform_action_id) == int(
- action11_id_mem) and perform_action_result == "success":
- loggerKit.info("设备:{0}, action11_id_mem:{1}", device_id, int(action11_id_mem))
- action12_id = int(round(time.time() * 1000))
- """
- 停止指令
- 停止app
- """
- action12_dict = stop_app(action12_id, target_version="7.9.0")
- redis_client.set(device_id + "operate", action12_id)
- redis_client.set(f"{device_id}_{action12_id}_step12", "1")
- redis_client.delete(f"{device_id}_{action12_id}_step11")
- # 批量模糊删除keys
- keys = redis_client.match_pattern_prefix(device_id)
- if len(keys) > 0:
- # 需要判断是否有匹配的值, 没有的话会报错
- for key in keys:
- redis_client.delete(key)
- loggerKit.info(f"clear {device_id} keys success...")
- else:
- loggerKit.info(f"{device_id} keys none ...")
- loggerKit.info("设备:{0}, action12_id:{1}", device_id, action12_id)
- return action12_dict
- else:
- action0_id = int(round(time.time() * 1000))
- """
- 启动指令
- 启动app
- """
- action0_dict = start_app(action0_id, target_version="7.9.0")
- redis_client.set(device_id + "operate", action0_id)
- redis_client.set(f"{device_id}_step0", "1")
- redis_client.delete(f"{device_id}_step9")
- loggerKit.info("设备:{0}, action0_id:{1}", device_id, action0_id)
- return action0_dict
- # 领取任务接口
- # @route(app, '/api/action_V2', methods=['POST'])
- def do_action_v2():
- """
- :param deviceID [必填]设备的ID
- :param performActionId [非必填]前一条指令的ID
- :param performActionResult success(指令成功) or failure(指令失败) or picNotFound(针对查找图片场景 图片未识别到) or stop(指令终止) or eleNotFound(针对元素 未获取到)
- :param recognizedResult 你好,我是你根据控件Id查到的text内容
- 领取任务接口
- :return: 指令json串
- """
- request_data = request.json
- loggerKit.info('请求信息:{0}'.format(request_data))
- device_id = request_data.get("deviceID")
- if device_id is None:
- loggerKit.info('请求信息异常:{0}'.format(request_data))
- return_dict = {
- "data": "",
- "code": -1,
- "message": "fail, request device_id is null"
- }
- return return_dict
- # 缓存中获取到对应的任务信息
- task_response = redis_client.get(device_id + "_task_json")
- if task_response is not None:
- data = json.loads(task_response)
- task = task_dict(str(data.get('taskId')), data.get('mediaChannel'), data.get('taskType'), data.get('taskDesc'),
- data.get('actionType'),
- data.get('resourceName'), data.get('subResourceName'), data.get('executeRobotAccount'),
- data.get('executeRobotName'), data.get('deviceId'), data.get('content'),
- data.get('answerType'),
- data.get('materialUri'),
- data.get('taskSubType'), data.get('taskSequenceId'), None, None, None, request_data,
- data.get('taskKey'))
- handler = rpa_handler().set_processor(task)
- return handler.process_rpa(task)
- # 领取任务接口
- # @route(app, '/api/action', methods=['POST'])
- def do_action_():
- """
- :param deviceID [必填]设备的ID
- :param performActionId [非必填]前一条指令的ID
- :param performActionResult success or failure
- :param recognizedResult 你好,我是你根据控件Id查到的text内容
- 领取任务接口
- :return: 指令json串
- """
- data = request.json
- loggerKit.info('请求信息:{0}'.format(data))
- device_id = data.get("deviceID")
- perform_action_id = data.get("performActionId")
- result = data.get("result")
- if device_id is None:
- loggerKit.info('请求信息异常:{0}'.format(data))
- return_dict = {
- "data": "",
- "code": -1,
- "message": "fail, request device_id is null"
- }
- return return_dict
- # 获取到对应策略
- action0_id_mem = redis_client.get(device_id)
- # action0_id = int(round(time.time() * 1000))
- if result is not None:
- """
- 非首个指令
- """
- perform_action_result = result.get("performActionResult")
- if perform_action_result is None:
- return_dict = {
- "data": "",
- "code": -2,
- "message": "fail, performActionResult is null"
- }
- return return_dict
- action0_id_mem = redis_client.get(device_id)
- step0 = redis_client.get(f"{device_id}_step0")
- if step0 is not None and int(step0) == 1 and action0_id_mem is not None and int(perform_action_id) == int(
- action0_id_mem) and perform_action_result == "success":
- action1_id = int(round(time.time() * 1000))
- """
- 发送第1条指令
- 懂车帝APP首页点击搜索框
- """
- action1_dict = single_click_by_control(action1_id, target_version="7.9.0",
- control_id="com.ss.android.auto:id/c9c")
- redis_client.set(device_id, action1_id)
- redis_client.set(f"{device_id}_{action1_id}_step1", "1")
- redis_client.delete(f"{device_id}_step0")
- loggerKit.info("设备:{0}, action1_id:{1}", device_id, action1_id)
- return action1_dict
- action1_id_mem = redis_client.get(device_id)
- step1 = redis_client.get(f"{device_id}_{perform_action_id}_step1")
- if step1 is not None and int(step1) == 1 and action1_id_mem is not None and int(perform_action_id) == int(
- action1_id_mem) and perform_action_result == "success":
- loggerKit.info("设备:{0}, action1_id_mem:{1}", device_id, int(action1_id_mem))
- action2_id = int(round(time.time() * 1000))
- """
- 发送第2条指令
- 在搜索框输入关键词
- """
- action2_dict = send_text_by_control(action2_id, control_id="com.ss.android.auto:id/h5q", content="飞凡F7")
- redis_client.set(device_id, action2_id)
- redis_client.set(f"{device_id}_{action2_id}_step2", "1")
- redis_client.delete(f"{device_id}_{action2_id}_step1")
- loggerKit.info("设备:{0}, action2_id:{1}", device_id, action2_id)
- return action2_dict
- action2_id_mem = redis_client.get(device_id)
- step2 = redis_client.get(f"{device_id}_{perform_action_id}_step2")
- if step2 is not None and int(step2) == 1 and action2_id_mem is not None and int(perform_action_id) == int(
- action2_id_mem) and perform_action_result == "success":
- loggerKit.info("设备:{0}, action2_id_mem:{1}", device_id, int(action2_id_mem))
- action3_id = int(round(time.time() * 1000))
- """
- 发送第3条指令
- 点击搜索
- """
- action3_dict = single_click_by_control(action3_id, control_id="com.ss.android.auto:id/g9e")
- redis_client.set(device_id, action3_id)
- redis_client.set(f"{device_id}_{action3_id}_step3", "1")
- redis_client.delete(f"{device_id}_{action3_id}_step2")
- loggerKit.info("设备:{0}, action3_id:{1}", device_id, action3_id)
- return action3_dict
- action3_id_mem = redis_client.get(device_id)
- step3 = redis_client.get(f"{device_id}_{perform_action_id}_step3")
- if step3 is not None and int(step3) == 1 and action3_id_mem is not None and int(perform_action_id) == int(
- action3_id_mem) and perform_action_result == "success":
- loggerKit.info("设备:{0}, action3_id_mem:{1}", device_id, int(action3_id_mem))
- action4_id = int(round(time.time() * 1000))
- """
- 发送第4条指令
- 点击tab->口碑
- """
- action4_dict = single_click_by_text(action4_id, text="二手车")
- redis_client.set(device_id, action4_id)
- redis_client.set(f"{device_id}_{action4_id}_step4", "1")
- redis_client.delete(f"{device_id}_{action4_id}_step3")
- loggerKit.info("设备:{0}, action3_id:{1}", device_id, action4_id)
- return action4_dict
- action4_id_mem = redis_client.get(device_id)
- step4 = redis_client.get(f"{device_id}_{perform_action_id}_step4")
- if step4 is not None and int(step4) == 1 and action4_id_mem is not None and int(perform_action_id) == int(
- action4_id_mem) and perform_action_result == "success":
- loggerKit.info("设备:{0}, action4_id_mem:{1}", device_id, int(action4_id_mem))
- action5_id = int(round(time.time() * 1000))
- """
- 发送第5条指令
- 点击tab->车友圈
- """
- action5_dict = single_click_by_text(action5_id, text="车友圈")
- redis_client.set(device_id, action5_id)
- redis_client.set(f"{device_id}_{action5_id}_step5", "1")
- redis_client.delete(f"{device_id}_{action5_id}_step4")
- loggerKit.info("设备:{0}, action3_id:{1}", device_id, action5_id)
- return action5_dict
- action5_id_mem = redis_client.get(device_id)
- step5 = redis_client.get(f"{device_id}_{perform_action_id}_step5")
- if step5 is not None and int(step5) == 1 and action5_id_mem is not None and int(perform_action_id) == int(
- action5_id_mem) and perform_action_result == "success":
- loggerKit.info("设备:{0}, action5_id_mem:{1}", device_id, int(action5_id_mem))
- action6_id = int(round(time.time() * 1000))
- """
- 发送第6条指令
- 点击tab->用户
- """
- action6_dict = single_click_by_text(action6_id, text="用户")
- redis_client.set(device_id, action6_id)
- redis_client.set(f"{device_id}_{action6_id}_step6", "1")
- redis_client.delete(f"{device_id}_{action6_id}_step5")
- loggerKit.info("设备:{0}, action3_id:{1}", device_id, action6_id)
- return action6_dict
- # 判断是否有搜索结果
- action6_id_mem = redis_client.get(device_id)
- step6 = redis_client.get(f"{device_id}_{perform_action_id}_step6")
- if step6 is not None and int(step6) == 1 and action6_id_mem is not None and int(perform_action_id) == int(
- action6_id_mem) and perform_action_result == "success":
- loggerKit.info("设备:{0}, action6_id_mem:{1}", device_id, int(action6_id_mem))
- action7_id = int(round(time.time() * 1000))
- """
- 点击搜素出来的博主
- """
- action7_dict = single_click_by_text(action7_id, text="飞凡F7")
- redis_client.set(device_id, action7_id)
- redis_client.set(f"{device_id}_{action7_id}_step7", "1")
- redis_client.delete(f"{device_id}_{action7_id}_step6")
- loggerKit.info("设备:{0}, action7_id:{1}", device_id, action7_id)
- return action7_dict
- # 存在搜索结果
- action7_id_mem = redis_client.get(device_id)
- step7 = redis_client.get(f"{device_id}_{perform_action_id}_step7")
- if step7 is not None and int(step7) == 1 and action7_id_mem is not None and int(perform_action_id) == int(
- action7_id_mem) and perform_action_result == "success":
- loggerKit.info("设备:{0}, action7_id_mem:{1}", device_id, int(action7_id_mem))
- action8_id = int(round(time.time() * 1000))
- """
- 存在搜索结果,已经跳转到了用户中心首页
- 开始匹配文章
- """
- action8_dict = get_content_by_control(action8_id, control_id="android.widget.TextView",
- title="北京福7飞凡车队正式成立啦")
- redis_client.set(device_id, action8_id)
- redis_client.set(f"{device_id}_{action8_id}_step8", "1")
- redis_client.delete(f"{device_id}_{action8_id}_step7")
- loggerKit.info("设备:{0}, action8_id:{1}", device_id, action8_id)
- return action8_dict
- # 文章评论,点击铅笔父节点
- action8_id_mem = redis_client.get(device_id)
- step8 = redis_client.get(f"{device_id}_{perform_action_id}_step8")
- if step8 is not None and int(step8) == 1 and action8_id_mem is not None and int(perform_action_id) == int(
- action8_id_mem) and perform_action_result == "success":
- loggerKit.info("设备:{0}, action8_id_mem:{1}", device_id, int(action8_id_mem))
- action9_id = int(round(time.time() * 1000))
- """
- 文章匹配,点击评论
- """
- loggerKit.info("action9_id:{0}, 文章评论,点击铅笔父节点", action9_id)
- action9_dict = single_click_by_control(action9_id, control_id="com.ss.android.auto:id/d98")
- redis_client.set(device_id, action9_id)
- redis_client.set(f"{device_id}_{action9_id}_step9", "1")
- redis_client.delete(f"{device_id}_{action9_id}_step8")
- loggerKit.info("设备:{0}, action9_id:{1}", device_id, action9_id)
- return action9_dict
- """
- 文章匹配,点击输入框,返回回复内容
- """
- action9_id_mem = redis_client.get(device_id)
- step9 = redis_client.get(f"{device_id}_{perform_action_id}_step9")
- if step9 is not None and int(step9) == 1 and action9_id_mem is not None and int(perform_action_id) == int(
- action9_id_mem) and perform_action_result == "success":
- loggerKit.info("设备:{0}, action9_id_mem:{1}", device_id, int(action9_id_mem))
- action10_id = int(round(time.time() * 1000))
- """
- 文章匹配,点击输入框,返回回复内容
- """
- loggerKit.info("action10_id:{0}, 文章title:{1}, 回复内容:{2}")
- action11_dict = send_text_by_control(action10_id, control_id="com.ss.android.auto:id/byd", content="不错👍")
- redis_client.set(device_id, action10_id)
- redis_client.set(f"{device_id}_{action10_id}_step10", "1")
- redis_client.delete(f"{device_id}_{action10_id}_step9")
- loggerKit.info("设备:{0}, action10_id:{1}", device_id, action10_id)
- return action11_dict
- """
- 点击发送按钮
- """
- action10_id_mem = redis_client.get(device_id)
- step10 = redis_client.get(f"{device_id}_{perform_action_id}_step10")
- if step10 is not None and int(step10) == 1 and action10_id_mem is not None and int(perform_action_id) == int(
- action10_id_mem) and perform_action_result == "success":
- loggerKit.info("设备:{0}, action9_id_mem:{1}", device_id, int(action10_id_mem))
- action11_id = int(round(time.time() * 1000))
- """
- 文章匹配,点击输入框,返回回复内容
- """
- action11_dict = single_click_by_control(action11_id, control_id="com.ss.android.auto:id/jxq")
- redis_client.set(device_id, action11_id)
- redis_client.set(f"{device_id}_{action11_id}_step11", "1")
- redis_client.delete(f"{device_id}_{action11_id}_step10")
- loggerKit.info("设备:{0}, action11_id:{1}", device_id, action11_id)
- return action11_dict
- """
- 停止app
- """
- action11_id_mem = redis_client.get(device_id)
- step11 = redis_client.get(f"{device_id}_{perform_action_id}_step11")
- if step11 is not None and int(step11) == 1 and action11_id_mem is not None and int(perform_action_id) == int(
- action11_id_mem) and perform_action_result == "success":
- loggerKit.info("设备:{0}, action10_id_mem:{1}", device_id, int(action11_id_mem))
- action12_id = int(round(time.time() * 1000))
- """
- 停止指令
- 停止app
- """
- action12_dict = stop_app(action12_id, target_version="7.9.0")
- redis_client.set(device_id, action12_id)
- redis_client.set(f"{device_id}_{action12_id}_step12", "1")
- redis_client.delete(f"{device_id}_{action12_id}_step11")
- # 批量模糊删除keys
- keys = redis_client.match_pattern_prefix(device_id)
- if len(keys) > 0:
- # 需要判断是否有匹配的值, 没有的话会报错
- for key in keys:
- redis_client.delete(key)
- loggerKit.info(f"clear {device_id} keys success...")
- else:
- loggerKit.info(f"{device_id} keys none ...")
- loggerKit.info("设备:{0}, action12_id:{1}", device_id, action12_dict)
- return action12_dict
- else:
- action0_id = int(round(time.time() * 1000))
- """
- 启动指令
- 启动app
- """
- action0_dict = start_app(action0_id, target_version="7.9.0")
- redis_client.set(device_id, action0_id)
- redis_client.set(f"{device_id}_step0", "1")
- redis_client.delete(f"{device_id}_step9")
- loggerKit.info("设备:{0}, action0_id:{1}", device_id, action0_id)
- return action0_dict
- # 定时任务
- def scheduler_start():
- rpa_scheduler = BackgroundScheduler()
- # 定时拉取任务
- rpa_scheduler.add_job(auto_pull_task, 'interval', seconds=1, max_instances=60)
- # 定时上报设备状态
- # rpa_scheduler.add_job(auto_synchronization_devices_status_func, 'interval', seconds=60, max_instances=2)
- rpa_scheduler.start()
- @route(app, '/api/action', methods=['POST'])
- def do_action():
- """
- 入参:
- :param taskId
- :param taskType
- :param subTaskType
- :param requestId
- :param scriptName
- :param deviceID [必填]设备的ID
- :param performActionId [非必填]前一条指令的ID
- :param performActionResult success(指令成功) or failure(指令失败) or picNotFound(针对查找图片场景 图片未识别到) or stop(指令终止) or eleNotFound(针对元素 未获取到)
- :param recognizedResult 你好,我是你根据控件Id查到的text内容
- 领取任务接口
- :return: 指令json串
- """
- request_data = request.json
- loggerKit.info('请求信息:{0}'.format(request_data))
- # device_work(device_id)
- # 缓存中获取到对应的任务信息
- # task_response = redis_client.get(device_id + "_task_json")
- """
- 根据任务类型、子任务类型匹配不同的执行脚本
- """
- if request_data is not None:
- device_id = request_data.get("deviceID")
- # task_id = request_data.get("taskID")
- # task_type = request_data.get("taskType")
- # sub_task_type = request_data.get("subTaskType")
- data = request_data.get("data")
- if device_id is None or data is None:
- loggerKit.info('请求信息异常:{0}'.format(request_data))
- return_dict = {
- "data": "",
- "code": -1,
- "message": "fail, request device_id or task_pull_data is none"
- }
- return return_dict
- task = task_dict(int(data.get('taskId')), data.get('mediaChannel'), data.get('taskType'), data.get('taskDesc'),
- data.get('actionType'),
- data.get('resourceName'), data.get('subResourceName'), data.get('executeRobotAccount'),
- data.get('executeRobotName'), data.get('deviceId'), data.get('content'),
- data.get('answerType'),
- data.get('materialUri'),
- data.get('taskSubType'), data.get('taskSequenceId'), None, None, None, request_data,data.get('taskKey'))
- handler = rpa_atom_handler().set_processor(task)
- return handler.process_rpa(task)
- if __name__ == '__main__':
- app.json_encoder = JSONEncoder
- # scheduler_start()
- app.run(debug=True, host='0.0.0.0', port=80)
- print(f'API服务启动成功')
|