| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- #!/usr/bin/env python3
- """
- 用 ``workplace/ocr-pos.py``(RapidOCR)在**当前屏幕截图**中查找固定文案,
- 返回文字框中心点的**屏幕像素坐标** ``(x, y)``;入口为 ``start``。
- 保留 ``selector_search_input`` / ``SEARCH_INPUT_SELECTORS`` 供 ``input-word-by-word.py`` 等旧代码导入。
- """
- from __future__ import annotations
- import importlib.util
- import sys
- from pathlib import Path
- from typing import TYPE_CHECKING
- if TYPE_CHECKING:
- from playwright.sync_api import Page
- target_text = "搜索小红书"
- _REPO = Path(__file__).resolve().parent.parent.parent
- if str(_REPO) not in sys.path:
- sys.path.insert(0, str(_REPO))
- from workplace.screenshot import PillowImageGrabFullScreenScreenshotCaptureSaver # noqa: E402
- SEARCH_INPUT_SELECTORS: tuple[str, ...] = (
- "#search-input",
- "input#search-input",
- "textarea#search-input",
- )
- selector_search_input = SEARCH_INPUT_SELECTORS[0]
- class SearchInputFlowResult:
- """不用 ``@dataclass``:经 ``exec_module`` 动态加载时,与 ``from __future__ import annotations`` 组合可能触发 CPython dataclasses 内部错误。"""
- __slots__ = ("ok", "message", "center_xy")
- def __init__(
- self,
- ok: bool,
- message: str = "",
- center_xy: tuple[int, int] | None = None,
- ) -> None:
- self.ok = ok
- self.message = message
- self.center_xy = center_xy
- def _load_ocr_pos():
- path = Path(__file__).resolve().parent.parent / "ocr-pos.py"
- spec = importlib.util.spec_from_file_location("workplace_ocr_pos_script", path)
- if spec is None or spec.loader is None:
- raise ImportError(f"Cannot load {path}")
- mod = importlib.util.module_from_spec(spec)
- spec.loader.exec_module(mod)
- return mod
- def start(
- page: Page,
- keyword: str = "",
- *,
- preset_center_xy: tuple[int, int] | None = None,
- ) -> SearchInputFlowResult:
- """
- 截取整屏(``capture_full_screen_and_store_in_memory`` 返回 BGR 图,并同步写入 ``workplace.screenshot`` 模块变量),
- OCR 匹配 ``target_text``(与 ``keyword`` 无关),返回中心点屏幕坐标。
- 若传入 ``preset_center_xy`` 则跳过截图与 OCR,直接返回该坐标。
- ``page`` 仅保留签名兼容。
- """
- _ = page, keyword
- if preset_center_xy is not None:
- x, y = int(preset_center_xy[0]), int(preset_center_xy[1])
- return SearchInputFlowResult(ok=True, message="", center_xy=(x, y))
- ocr_mod = _load_ocr_pos()
- saver = PillowImageGrabFullScreenScreenshotCaptureSaver()
- full_screen_screenshot_bgr_numpy = saver.capture_full_screen_and_store_in_memory()
- pt = ocr_mod.ocr_find_text_center(
- full_screen_screenshot_bgr_numpy,
- target_text,
- )
- if pt is None:
- msg = f"OCR 未在全屏截图中找到「{target_text}」。"
- print(msg, file=sys.stderr)
- return SearchInputFlowResult(ok=False, message=msg, center_xy=None)
- return SearchInputFlowResult(ok=True, message="", center_xy=pt)
|