From oh-my-daily-skills
Reads public URLs into clean Markdown using platform-aware fallbacks for Chinese sites (WeChat, Zhihu, Bilibili), X/Twitter, and generic web pages via Jina Reader, Camoufox, WebFetch, and Playwright.
npx claudepluginhub shiqkuangsan/oh-my-daily-skillsThis skill uses the workspace's default tool permissions.
Intelligently read any URL content. Auto-detect platform, pick the best fetch strategy, output clean Markdown.
Fetches any URL or PDF as clean Markdown, handling paywalls, JS-heavy pages, Twitter/X, and Chinese platforms via proxy cascade. Saves to ~/Downloads; prefer over WebFetch.
Fetches any URL as clean markdown using OpenCLI for login platforms (Twitter/X, Reddit, Zhihu, Weibo) or Jina Reader/defuddle chain for generic pages. For JS-rendered, paywalled, or complex content.
Fetches any URL as clean Markdown via proxy cascade (r.jina.ai, defuddle.md, agent-fetch). Handles WeChat articles with Playwright and Feishu/Lark docs with API credentials.
Share bugs, ideas, or general feedback.
Intelligently read any URL content. Auto-detect platform, pick the best fetch strategy, output clean Markdown.
Activate this skill when the user:
/ink-reader <url>Four-layer fallback with platform-specific optimizations:
Layer 0: Camoufox → WeChat-specific, bypasses anti-scraping (requires pip install)
Layer 1: Jina Reader → Free, no API key, covers most public content
Layer 2: WebFetch → Claude Code built-in, direct URL reading
Layer 3: Playwright MCP → Browser automation, handles login-required sites
Match the URL domain to determine platform and strategy routing:
| Platform | Domain Contains | Needs Login | Strategy Order |
|---|---|---|---|
mp.weixin.qq.com | Yes | Camoufox → Jina → Playwright | |
| Zhihu | zhihu.com | No | Jina → WebFetch |
| Bilibili | bilibili.com, b23.tv | No | Jina → WebFetch |
| Toutiao | toutiao.com | No | Jina → WebFetch |
weibo.com, m.weibo.cn | Yes | Jina → Playwright | |
| Xiaohongshu | xiaohongshu.com | Yes | Jina → Playwright |
| Douyin | douyin.com | No | Jina → WebFetch |
| X/Twitter | x.com, twitter.com | Partial | See X/Twitter Flow |
| Generic | anything else | No | Jina → WebFetch |
Parse the URL domain and match against the platform table above.
Try Jina Reader:
https://r.jina.ai/{original_url}Try WebFetch direct:
Try Playwright MCP (if available):
mp.weixin.qq.com)WeChat articles have aggressive anti-scraping. Jina Reader and WebFetch almost always fail. Use Camoufox as the primary strategy.
Prerequisites check (run once per session):
~/.ink-reader-env/bin/python3 -c "import camoufox; print('camoufox OK')" 2>/dev/null && echo "READY" || echo "NOT_INSTALLED"
Try Camoufox (if installed):
Check if ~/.agent-reach/tools/wechat-article-for-ai/main.py exists. If yes, use it:
cd ~/.agent-reach/tools/wechat-article-for-ai && ~/.ink-reader-env/bin/python3 main.py "{url}"
If that path doesn't exist, use inline invocation:
~/.ink-reader-env/bin/python3 -c "
import asyncio
from camoufox.sync_api import Camoufox
from markdownify import markdownify
with Camoufox(headless=True) as browser:
page = browser.new_page()
page.goto('{url}', wait_until='networkidle', timeout=30000)
html = page.content()
print(markdownify(html, strip=['script','style','nav','footer','header']))
"
Validate output (Step 3). If valid, use it.
Try Jina Reader (fallback — occasionally works for WeChat):
https://r.jina.ai/{original_url}Try Playwright MCP (if available, last resort):
All failed → Show failure output with suggestion:
"WeChat articles require Camoufox to bypass anti-scraping. Install with:
pip install camoufox[geoip] markdownify beautifulsoup4 httpx"
WeChat search (bonus — when user asks to search WeChat articles, not read a URL):
Check if miku_ai is installed:
~/.ink-reader-env/bin/python3 -c "import miku_ai; print('miku_ai OK')" 2>/dev/null && echo "READY" || echo "NOT_INSTALLED"
If installed, search articles:
~/.ink-reader-env/bin/python3 -c "
import asyncio
from miku_ai import get_wexin_article
async def search():
results = await get_wexin_article('{query}', {count})
for a in results:
print(f'- [{a[\"title\"]}]({a[\"url\"]})')
asyncio.run(search())
"
Present results as a list. If user picks one, read it using the WeChat flow above.
If miku_ai is not installed, inform user: pip install miku_ai
Try Jina Reader (same as above, sometimes works even for login-required sites).
Try Playwright MCP (if available):
"This platform requires login. Install Playwright MCP to enable browser-based reading."
Extract status ID from URL:
x.com/{user}/status/{id} or twitter.com/{user}/status/{id}Try Thread Reader App via Jina:
https://r.jina.ai/https://threadreaderapp.com/thread/{status_id}.htmlTry Jina on original X URL:
https://r.jina.ai/{original_url}Try Playwright MCP (if available):
https://threadreaderapp.com/thread/{status_id}.htmlContent is valid when ALL of these are true:
If content fails validation, treat it as a failure and try the next strategy.
Use the output format specified below.
# {Title}
**Source**: {Platform Name}
**Author**: {Author name, omit if unavailable}
**Published**: {Time, omit if unavailable}
**URL**: {Original URL}
**Strategy**: {Camoufox / Jina Reader / WebFetch / Playwright MCP}
---
{Body content in Markdown}
Rules:
# Failed to read URL
**URL**: {url}
**Platform**: {detected platform}
**Attempted strategies**:
- {strategy 1}: {error reason}
- {strategy 2}: {error reason}
**Suggestions**:
- {contextual suggestions}
Contextual suggestions by scenario:
pip install camoufox[geoip] markdownify beautifulsoup4 httpx"When the user says "save", "save it", "keep this", or "save to file" AFTER a successful read:
./ink-reader-clips/ in current working directory (if not exists)../ink-reader-clips/{YYYY-MM-DD}_{sanitized_title}.md---
title: "{Title}"
source: "{Platform Name}"
url: "{Original URL}"
saved_at: "{YYYY-MM-DD HH:MM:SS}"
---
{Body content}
<>:"/\|?*, replace whitespace with -, truncate to 50 chars../ink-reader-clips/{filename}"Do NOT auto-save. Only save when explicitly asked.
The base skill (Jina Reader + WebFetch) works out of the box with zero setup. For enhanced platform support, install the following optional dependencies into a dedicated virtual environment:
# Create dedicated venv (one-time)
uv venv ~/.ink-reader-env
# Install dependencies
uv pip install --python ~/.ink-reader-env "camoufox[geoip]" markdownify beautifulsoup4 httpx
This enables reliable reading of mp.weixin.qq.com articles by bypassing WeChat's anti-scraping with a stealth browser. No API key or login required.
uv pip install --python ~/.ink-reader-env miku_ai
Enables searching WeChat public account articles by keyword via Sogou. No API key required.
~/.ink-reader-env/bin/python3 -c "import camoufox; print('camoufox OK')"
~/.ink-reader-env/bin/python3 -c "import miku_ai; print('miku_ai OK')"