134 lines
4.4 KiB
Python
134 lines
4.4 KiB
Python
# coding=utf-8
|
||
import os
|
||
import sys
|
||
import time
|
||
import logging
|
||
import asyncio
|
||
|
||
# 添加项目根目录到 sys.path
|
||
project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||
if project_root not in sys.path:
|
||
sys.path.append(project_root)
|
||
|
||
from WeiXin import WxUtil
|
||
|
||
# 配置日志
|
||
log_dir = WxUtil.LOG_DIR
|
||
if not os.path.exists(log_dir):
|
||
os.makedirs(log_dir)
|
||
|
||
logging.basicConfig(
|
||
level=logging.INFO,
|
||
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
|
||
handlers=[
|
||
logging.FileHandler(os.path.join(log_dir, "T2_ChatMonitor.log"), encoding='utf-8'),
|
||
logging.StreamHandler()
|
||
]
|
||
)
|
||
logger = logging.getLogger("T2_ChatMonitor")
|
||
|
||
class CVDebugTask:
|
||
"""
|
||
结构化的 CV 语音调试任务,支持分步执行和单元测试
|
||
"""
|
||
def __init__(self):
|
||
self.device = None
|
||
self.screenshot_path = os.path.join(WxUtil.OUTPUT_DIR, "T2_ChatMonitor_live_shot.jpg")
|
||
self.debug_view_path = os.path.join(WxUtil.OUTPUT_DIR, "T2_ChatMonitor_debug_view.jpg")
|
||
self.dialogue_log = []
|
||
self.input_pos = None
|
||
|
||
def step_1_prepare_env(self):
|
||
"""步骤1: 环境准备"""
|
||
logger.info("--- [Step 1] 环境准备 ---")
|
||
WxUtil.setup_script_environment()
|
||
return True
|
||
|
||
def step_2_connect_device(self):
|
||
"""步骤2: 连接设备"""
|
||
logger.info("--- [Step 2] 连接设备 ---")
|
||
self.device = WxUtil.connect_device()
|
||
if not self.device:
|
||
logger.error("❌ 设备连接失败,请检查手机是否连接且开启了调试模式")
|
||
return False
|
||
return True
|
||
|
||
def step_3_capture_screen(self):
|
||
"""步骤3: 捕获屏幕截图"""
|
||
logger.info("--- [Step 3] 捕获屏幕截图 ---")
|
||
try:
|
||
if not self.device:
|
||
logger.error("❌ 未连接设备,无法截图")
|
||
return False
|
||
self.device.screenshot(self.screenshot_path)
|
||
logger.info(f"✅ 截图已保存: {self.screenshot_path}")
|
||
return True
|
||
except Exception as e:
|
||
logger.error(f"❌ 截图失败: {e}")
|
||
return False
|
||
|
||
async def step_4_analyze_and_process(self, use_existing_image=False):
|
||
"""
|
||
步骤4: 分析图片并处理语音转换
|
||
:param use_existing_image: 是否使用已有的图片进行离线测试
|
||
"""
|
||
logger.info("--- [Step 4] 分析图片与语音处理 ---")
|
||
|
||
target_img = self.screenshot_path
|
||
if use_existing_image:
|
||
if not os.path.exists(target_img):
|
||
logger.error(f"❌ 找不到指定的离线图片: {target_img}")
|
||
return False
|
||
logger.info(f"📂 正在使用离线图片进行测试: {target_img}")
|
||
|
||
# 调用核心分析逻辑
|
||
# 注意:即使是离线分析,WxUtil 内部也会尝试连接设备以进行长按操作
|
||
self.dialogue_log, self.input_pos = await WxUtil.analyze_chat_image(
|
||
target_img,
|
||
self.debug_view_path,
|
||
device=self.device
|
||
)
|
||
|
||
if self.dialogue_log:
|
||
logger.info("✅ 任务处理完成,已生成对话日志")
|
||
return True
|
||
else:
|
||
logger.warning("⚠️ 未识别到任何有效的聊天内容")
|
||
return False
|
||
|
||
def step_5_report_results(self):
|
||
"""步骤5: 输出最终报告"""
|
||
logger.info("--- [Step 5] 结果汇总 ---")
|
||
if self.input_pos:
|
||
logger.info(f"📍 识别到输入框位置: {self.input_pos}")
|
||
|
||
if self.dialogue_log:
|
||
logger.info("📋 最终对话内容提取结果已输出到控制台 (见上方横线区域)")
|
||
else:
|
||
logger.warning("❌ 无对话内容输出")
|
||
return True
|
||
|
||
async def run_structured_debug():
|
||
"""
|
||
按步骤运行完整的调试任务
|
||
"""
|
||
task = CVDebugTask()
|
||
|
||
# 顺序执行各步骤
|
||
if not task.step_1_prepare_env(): return
|
||
if not task.step_2_connect_device(): return
|
||
if not task.step_3_capture_screen(): return
|
||
|
||
# 执行耗时的分析和处理步骤
|
||
success = await task.step_4_analyze_and_process()
|
||
|
||
if success:
|
||
task.step_5_report_results()
|
||
logger.info("✨ 调试任务全部顺利完成!")
|
||
else:
|
||
logger.error("❌ 调试任务在处理阶段失败")
|
||
|
||
if __name__ == "__main__":
|
||
# 运行结构化的调试流程
|
||
asyncio.run(run_structured_debug())
|