skills/ink-reader/SKILL.md
Read public or accessible URLs into clean Markdown using platform-aware fallback strategies. Covers common Chinese platforms, X/Twitter, and generic websites; login or anti-bot pages are best-effort. Trigger words: read url, read link, fetch article, extract content, clean markdown, WeChat article, 搜公众号文章, ink-reader
npx skillsauth add shiqkuangsan/oh-my-daily-skills tooyoung:ink-readerInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
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 |
| ----------- | ------------------------- | ----------- | ---------------------------- |
| WeChat | 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 | 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')"
development
Show OpenAI Codex release highlights in Chinese. Fetch GitHub release notes, summarize feature-level changes, skip bug-fix/chore noise by default, and append a mandatory highlights section. Trigger words: Codex updates, Codex features, Codex 新功能, Codex 更新, OpenAI Codex releases
development
清理当前项目的 Claude Code 会话:列出 ~/.claude/projects 下最近会话,按序号或 sessionId 选择,经二次确认后删除对应 .jsonl 与同名附件目录。Trigger words: 清理 cc 会话, 删除历史会话, cc resume 会话, clean cc sessions, cc session cleaner
development
Create simple Three.js web apps with scene setup, lighting, geometries, materials, animations, OrbitControls, particles, and responsive rendering. Use for Three.js scenes, WebGL demos, 3D showcases, and interactive 3D web content. Trigger: threejs, Three.js, 3D scene, WebGL, 三维展示, 3D showcase, interactive 3D
development
为 Claude Code 定义个性化身份风格(人设)。触发词:定义人设、创建身份、persona、角色设定、CLAUDE.local.md