From oh-my-daily-skills
Reads public URLs into clean Markdown with platform-aware fallback strategies for WeChat, Zhihu, Bilibili, X/Twitter, and generic sites using Jina Reader, WebFetch, Playwright.
How this skill is triggered — by the user, by Claude, or both
Slash command
/oh-my-daily-skills:ink-readerThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Intelligently read any URL content. Auto-detect platform, pick the best fetch strategy, output clean Markdown.
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')"
npx claudepluginhub shiqkuangsan/oh-my-daily-skillsFetches any URL as clean markdown, using OpenCLI for login-walled platforms (Twitter, zhihu, reddit, etc.) and Jina Reader/defuddle.md for generic pages.
Extracts article content from WeChat public accounts, Toutiao, Netease, Sohu, and Tencent News sites into JSON and Markdown formats via Python CLI. Useful for scraping news articles or converting to structured data.
Fetches any URL and converts to clean markdown using baoyu-fetch CLI (Chrome CDP with site-specific adapters). Built-in support for X/Twitter, YouTube transcripts, Hacker News, and generic pages. Handles login/CAPTCHA via interaction wait modes.