# coding=utf-8 """ T4_Text_StaticTest.py - 纯文本消息识别与合并测试 (Text Message Static Test) 【核心功能】 - 静态文本分析:专门针对文字消息进行 OCR 识别。 - 消息合并逻辑:模拟机器人将同一发送者、在短时间内发送的多行文字合并为一条消息的逻辑。 - 视觉验证:生成标记了识别结果的调试图片 (T4_Debug.jpg)。 【使用场景】 - 验证多行长文字消息是否能被正确合并。 - 调试文字消息的发送者判定(特别是长文本换行后的判定)。 - 在不干扰手机交互的情况下,快速验证文本 OCR 的准确性。 """ import os import sys import logging import cv2 # Add project root 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 # Setup Logger logger = logging.getLogger("T4_Text") # Configure Root Logger to ensure all logs (including WxUtil) go to file root_logger = logging.getLogger() root_logger.setLevel(logging.INFO) # Ensure Log Directory exists if hasattr(WxUtil, 'LOG_DIR'): log_dir = WxUtil.LOG_DIR else: log_dir = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "Logs") if not os.path.exists(log_dir): os.makedirs(log_dir) # File Handler log_file = os.path.join(log_dir, "T4_Text.log") fh = logging.FileHandler(log_file, mode='w', encoding='utf-8') formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') fh.setFormatter(formatter) root_logger.addHandler(fh) # Console Handler (if not already added by WxUtil) if not any(isinstance(h, logging.StreamHandler) for h in root_logger.handlers): ch = logging.StreamHandler() ch.setFormatter(formatter) root_logger.addHandler(ch) def main(): logger.info("--- T4: Text Processing Test ---") # 1. Connect d = WxUtil.connect_device() if not d: logger.error("Device connection failed.") return # 2. Screenshot screenshot_path = os.path.join(WxUtil.OUTPUT_DIR, "T4_Screenshot.jpg") logger.info("Taking screenshot...") d.screenshot(screenshot_path) # 3. Scan logger.info("Scanning image...") messages, debug_img, _ = WxUtil._scan_chat_messages(screenshot_path) # 4. Filter and Output logger.info("--- Raw Text Messages ---") text_msgs = [m for m in messages if m['type'] == 'text'] if not text_msgs: logger.info("No text messages found.") else: for i, msg in enumerate(text_msgs): logger.info(f"Text [{i}] Sender: {msg['sender']} | y={msg['y']} | Content: {msg['content']}") # 5. Merging Logic (Same as T2) logger.info("--- Merged Text Dialogues ---") merged_msgs = [] if text_msgs: current_msg = text_msgs[0].copy() last_y = current_msg['y'] for i in range(1, len(text_msgs)): next_msg = text_msgs[i] is_same_sender = (current_msg['sender'] == next_msg['sender']) y_diff = next_msg['y'] - last_y is_close = (y_diff < 120) if is_same_sender and is_close: current_msg['content'] += " " + next_msg['content'] last_y = next_msg['y'] else: merged_msgs.append(current_msg) current_msg = next_msg.copy() last_y = current_msg['y'] merged_msgs.append(current_msg) for i, msg in enumerate(merged_msgs): logger.info(f"[{i}] {msg['sender']}: {msg['content']}") # Save debug debug_path = os.path.join(WxUtil.OUTPUT_DIR, "T4_Debug.jpg") cv2.imwrite(debug_path, debug_img) logger.info(f"Debug image saved to: {debug_path}") if __name__ == "__main__": main()