diff --git a/Module/FlaskService.py b/Module/FlaskService.py index 550dfc5..42063ff 100644 --- a/Module/FlaskService.py +++ b/Module/FlaskService.py @@ -347,6 +347,8 @@ def passAnchorData(): # 获取打招呼数据 ev.prologueList = data.get("prologueList", []) + needTranslate = data.get("needTranslate", False) + # 添加主播数据 addModelToAnchorList(acList) # 启动线程,执行脚本 @@ -355,7 +357,7 @@ def passAnchorData(): event = threading.Event() # 启动脚本 thread = threading.Thread(target=manager.safe_greetNewFollowers, - args=(udid, needReply, isComment, event,)) + args=(udid, needReply, isComment, needTranslate, event,)) # 添加到线程管理 ThreadManager.add(udid, thread, event) return ResultData(data="").toJson() @@ -379,6 +381,9 @@ def followAndGreetUnion(): # 是否需要回复 needReply = data.get("needReply", True) + needTranslate = data.get("needTranslate", False) + + # 获取打招呼数据 @@ -392,7 +397,7 @@ def followAndGreetUnion(): event = threading.Event() # 启动脚本 thread = threading.Thread(target=manager.safe_followAndGreetUnion, - args=(udid, needReply, event)) + args=(udid, needReply, needTranslate, event)) # 添加到线程管理 ThreadManager.add(udid, thread, event) return ResultData(data="").toJson() diff --git a/Utils/ThreadManager.py b/Utils/ThreadManager.py index a074efa..081ec27 100644 --- a/Utils/ThreadManager.py +++ b/Utils/ThreadManager.py @@ -254,21 +254,53 @@ class ThreadManager: } return o + # @classmethod + # def batch_stop(cls, ids: List[str]) -> Tuple[int, str]: + # failed = [] + # with ThreadPoolExecutor(max_workers=4) as executor: + # futures = {executor.submit(cls.stop, udid): udid for udid in ids} + # for future in as_completed(futures): + # udid = futures[future] + # try: + # code, msg = future.result() + # except Exception as e: + # LogManager.method_error(f"[{udid}] stop 调用异常: {e}", "task") + # failed.append(udid) + # continue + # if code != 200: + # failed.append(udid) + # if failed: + # return 207, f"部分任务停止失败: {failed}" + # return 200, "全部停止请求已提交" + @classmethod def batch_stop(cls, ids: List[str]) -> Tuple[int, str]: failed = [] + results = [] + with ThreadPoolExecutor(max_workers=4) as executor: futures = {executor.submit(cls.stop, udid): udid for udid in ids} for future in as_completed(futures): udid = futures[future] try: code, msg = future.result() + results.append((udid, code, msg)) except Exception as e: LogManager.method_error(f"[{udid}] stop 调用异常: {e}", "task") failed.append(udid) continue if code != 200: failed.append(udid) + + # 等待所有线程完全停止 + for udid, code, msg in results: + if code == 200: + obj = cls._tasks.get(udid) + if obj: + thread = obj["thread"] + while thread.is_alive(): + time.sleep(0.1) + if failed: return 207, f"部分任务停止失败: {failed}" - return 200, "全部停止请求已提交" \ No newline at end of file + return 200, "全部任务已成功停止" \ No newline at end of file diff --git a/resources/03cb0d61638ab919e9c9c5e016b969ff40925b0c/bgv.png b/resources/03cb0d61638ab919e9c9c5e016b969ff40925b0c/bgv.png deleted file mode 100644 index 911a2bf..0000000 Binary files a/resources/03cb0d61638ab919e9c9c5e016b969ff40925b0c/bgv.png and /dev/null differ diff --git a/script/ScriptManager.py b/script/ScriptManager.py index f1dd960..2315df6 100644 --- a/script/ScriptManager.py +++ b/script/ScriptManager.py @@ -20,6 +20,7 @@ from Utils.Requester import Requester import Entity.Variables as ev from Utils.TencentOCRUtils import TencentOCR + # 脚本管理类 class ScriptManager(): # 单利对象 @@ -106,10 +107,15 @@ class ScriptManager(): tap_x = int(recomend_cx) if recomend_cx else 100 tap_y = int(recomend_cy) if recomend_cy else 100 if click_count: + print("点击一次") + LogManager.method_info("点击一次", "养号", udid) + session.tap(tap_x, tap_y) else: print("点击两次") + LogManager.method_info("点击两次", "养号", udid) + session.tap(tap_x, tap_y) time.sleep(1) session.tap(tap_x, tap_y) @@ -117,6 +123,7 @@ class ScriptManager(): # 养号 def growAccount(self, udid, isComment, event, is_monitoring=False): LogManager.method_info(f"调用刷视频", "养号", udid) + # ========= 初始化 ========= client = wda.USBClient(udid, ev.wdaFunctionPort) session = client.session() @@ -125,6 +132,7 @@ class ScriptManager(): while not event.is_set(): try: if not is_monitoring: + LogManager.method_info(f"开始养号,重启tiktok", "养号", udid) ControlUtils.closeTikTok(session, udid) event.wait(timeout=1) ControlUtils.openTikTok(session, udid) @@ -248,12 +256,12 @@ class ScriptManager(): continue except Exception as e: - print("刷视频脚本有错误:错误内容:",e) + print("刷视频脚本有错误:错误内容:", e) LogManager.method_error(f"刷视频过程出现错误,重试", "养号", udid) raise e # 抛出给上层,触发重生机制 except Exception as e: - print("刷视频遇到错误了。错误内容:",e) + print("刷视频遇到错误了。错误内容:", e) LogManager.method_error(f"[{udid}] 养号出现异常,将重启流程: {e}", "养号", udid) event.wait(timeout=3) @@ -400,13 +408,11 @@ class ScriptManager(): 关注打招呼以及回复主播消息 """ - def safe_greetNewFollowers(self, udid, needReply, isComment, event): + def safe_greetNewFollowers(self, udid, needReply, isComment, needTranslate, event): retries = 0 while not event.is_set(): try: - - self.greetNewFollowers(udid, needReply, isComment, event) - + self.greetNewFollowers(udid, needReply, isComment, needTranslate, event) except Exception as e: retries += 1 LogManager.method_error(f"greetNewFollowers 出现异常: {e},准备第 {retries} 次重试", "关注打招呼", udid) @@ -419,7 +425,7 @@ class ScriptManager(): LogManager.method_error("greetNewFollowers 重试次数耗尽,任务终止", "关注打招呼", udid) # 关注打招呼 - def greetNewFollowers(self, udid, needReply, isComment, event): + def greetNewFollowers(self, udid, needReply, isComment, needTranslate, event): client = wda.USBClient(udid, ev.wdaFunctionPort) session = client.session() @@ -449,7 +455,7 @@ class ScriptManager(): LogManager.method_info(f"返回上一步", "关注打招呼", udid) session.appium_settings({"snapshotMaxDepth": 15}) source = session.source() - LogManager.method_info(f"返回按钮的节点:{source}","返回节点", udid) + LogManager.method_info(f"返回按钮的节点:{source}", "返回节点", udid) ControlUtils.clickBack(session) event.wait(timeout=2) @@ -651,15 +657,12 @@ class ScriptManager(): # LogManager.method_info(f"传递的打招呼的数据:{ev.prologueList}", "关注打招呼", udid) - # 取出国家进行对应国家语言代码 anchorCountry_code = CountryLanguageMapper.get_language_code(anchorCountry) + LogManager.method_info(f"获取的语言代码是:{ev.prologueList}", "关注打招呼", udid) - - LogManager.method_info(f"获取的语言代码是:{ev.prologueList}","关注打招呼",udid) - - LogManager.method_info(f"存储的打招呼语句是:{ev.prologueList}","关注打招呼",udid) + LogManager.method_info(f"存储的打招呼语句是:{ev.prologueList}", "关注打招呼", udid) # 判断对应的语言代码是否在传入的字典中 if anchorCountry_code in ev.prologueList: @@ -668,33 +671,29 @@ class ScriptManager(): # 进行原本的进行传入 privateMessageList = ev.prologueList[anchorCountry_code] + text = random.choice(privateMessageList) - - needTranslate = False + msg = text else: LogManager.method_info(f"不在存储的字典中 打招呼语句是:{ev.prologueList}", "关注打招呼", udid) # 需要翻译 privateMessageList = ev.prologueList['yolo'] - needTranslate = True # 使用yolo必须翻译 + # 准备打招呼的文案 + text = random.choice(privateMessageList) + LogManager.method_info(f"取出打招呼的数据,{text}", "关注打招呼", + udid) - # 准备打招呼的文案 - text = random.choice(privateMessageList) - # text = "hello" - - LogManager.method_info(f"取出打招呼的数据,{text}", "关注打招呼", - udid) - - if needTranslate: - LogManager.method_info(f"需要翻译:{text},参数为:国家为{anchorCountry}, 即将进行翻译", - "关注打招呼", udid) - msg = Requester.translation(text, anchorCountry) - LogManager.method_info(f"翻译成功:{msg}, ", "关注打招呼", udid) - else: - msg = text - LogManager.method_info(f"即将发送的私信内容:{msg}", "关注打招呼", udid) + if needTranslate: + LogManager.method_info(f"需要翻译:{text},参数为:国家为{anchorCountry}, 即将进行翻译", + "关注打招呼", udid) + msg = Requester.translation(text, anchorCountry) + LogManager.method_info(f"翻译成功:{msg}, ", "关注打招呼", udid) + else: + msg = text + LogManager.method_info(f"即将发送的私信内容:{msg}", "关注打招呼", udid) # 准备发送一条信息 chatInput = session.xpath("//TextView") @@ -751,7 +750,6 @@ class ScriptManager(): print("即将要回复消息") LogManager.method_info("即将要回复消息", "关注打招呼", udid) - LogManager.method_info(f"是否需要进行监控消息:{needReply}", "监控消息") if needReply: @@ -779,12 +777,12 @@ class ScriptManager(): print("greetNewFollowers方法执行完毕") - def safe_followAndGreetUnion(self, udid, needReply, event): + def safe_followAndGreetUnion(self, udid, needReply, needTranslate, event): retries = 0 while not event.is_set(): try: - self.followAndGreetUnion(udid, needReply, event) + self.followAndGreetUnion(udid, needReply, needTranslate, event) except Exception as e: retries += 1 @@ -797,7 +795,7 @@ class ScriptManager(): LogManager.method_error("greetNewFollowers 重试次数耗尽,任务终止", "关注打招呼", udid) # 关注打招呼以及回复主播消息(联盟号) - def followAndGreetUnion(self, udid, needReply, event): + def followAndGreetUnion(self, udid, needReply, needTranslate, event): client = wda.USBClient(udid, ev.wdaFunctionPort) session = client.session() @@ -888,7 +886,6 @@ class ScriptManager(): print(f"找不到输入框") raise Exception("找不到输入框") - input = session.xpath('//XCUIElementTypeSearchField') if input.exists: input.clear_text() @@ -954,30 +951,25 @@ class ScriptManager(): if anchorCountry_code in ev.prologueList: # 进行原本的进行传入 privateMessageList = ev.prologueList[anchorCountry_code] - needTranslate = False - - else: - # 需要翻译 - privateMessageList = ev.prologueList['yolo'] - needTranslate = True # 使用yolo必须翻译 - - # 准备打招呼的文案 - text = random.choice(privateMessageList) - # text = "hello" - - # sweetm_0 - if needTranslate: - # 翻译成主播国家的语言 - LogManager.method_info(f"需要翻译:{text},参数为:国家为{anchorCountry}, 即将进行翻译", - "关注打招呼(联盟号)", udid) - - msg = Requester.translation(text, anchorCountry) - - LogManager.method_info(f"翻译成功:{msg}, ", "关注打招呼(联盟号)", udid) - - else: + text = random.choice(privateMessageList) msg = text - LogManager.method_info(f"即将发送的私信内容:{msg}", "关注打招呼(联盟号)", udid) + else: + # 从yolo中拿取 + privateMessageList = ev.prologueList['yolo'] + text = random.choice(privateMessageList) + + if needTranslate: + # 翻译成主播国家的语言 + LogManager.method_info(f"需要翻译:{text},参数为:国家为{anchorCountry}, 即将进行翻译", + "关注打招呼(联盟号)", udid) + + msg = Requester.translation(text, anchorCountry) + + LogManager.method_info(f"翻译成功:{msg}, ", "关注打招呼(联盟号)", udid) + + else: + msg = text + LogManager.method_info(f"即将发送的私信内容:{msg}", "关注打招呼(联盟号)", udid) # 准备发送一条信息 chatInput = session.xpath("//TextView") @@ -1522,7 +1514,6 @@ class ScriptManager(): client = wda.USBClient(udid, ev.wdaFunctionPort) session = client.session() - count = 0 while count <= 5: try: