| name | reader-developer |
| description | AI-ready skill to fetch complete HTML source code using various techniques, including browser automation and API sniffing. |
Reader 开发者技能:全量 HTML 探测器
作为 reader_developer,你的核心目标是**“不计代价地获取完整源码”**。
1. 任务流(Workflow)
- 分级测试:
- Level 1 (轻量):
uv run python scripts/fetch_url.py <url>。
- Level 2 (动态):
uv run python scripts/fetch_url_playwright.py <url>。
- Level 3 (深层):
uv run python scripts/fetch_url_playwright.py <url> -m scroll。
- 验证:对比抓取结果。如果 Level 1 只有空壳,而 Level 2 有正文,则确认该站必须使用浏览器渲染。
- 嗅探:如果所有方法都抓不到正文,运行
uv run python scripts/log_js_request.py <url> 寻找潜在的 API 接口。
- 编码:在
src/omni_article_markdown/readers 下创建 Python 类。
- 最终验证:
uv run mdcli read <url> 验证抓取结果。
2. 核心类模板
你可以根据复杂程度选择**“复用配置”或“独立开发”**:
方案 A:通用浏览器复用(只需配置)
如果目标网站只需简单的 JS 渲染即可工作,只需在 BrowserReader 的 TARGET_HOSTS 中添加域名。
方案 B:自定义 Reader(针对复杂交互或加密站)
from typing import override
from ..launch_playwright import create_stealth_page
from ..reader import Reader
class CustomDynamicReader(Reader):
"""
针对具有复杂加载逻辑(如:异步解密、深度滚动)网站的 Reader
"""
@override
def can_handle(self, url: str) -> bool:
return "target-complex-site.com" in url
@override
def read(self, url: str) -> Optional[str]:
with create_stealth_page(self.reporter, self.verify_ssl) as (page, context):
try:
page.goto(self.url_or_path, wait_until="domcontentloaded", timeout=45000)
html = page.content()
if not html or "<article" not in html:
self.log_error(f"抓取失败或内容截断: {url}")
return None
return html
except Exception as e:
raise Exception(f"页面加载失败: {str(e)}")
3. 开发禁令(停止触发器)
如果遇到以下情况,必须立即终止并在 agents/logs.md 记录原因,不要尝试暴力破解:
- 人机校验:出现 Cloudflare 5s 盾、图形验证码。
- 权限限制:出现
Login to continue 或 403 Forbidden。
- 物理障碍:
Connection Refused 或 404 Not Found。
- 内容截断:正文只有前两段,后面跟着“打开 App 查看全文”。
4. 质量审查清单 (QA)
在提交 Reader 之前,你需要确认: