Use when designing, reviewing, or refactoring a CLI that must serve AI agents alongside humans, or when converting an API or SDK into an agent-usable CLI interface.
日本語の概要は準備中です。原文の説明を表示しています。
Fetch and export public X (Twitter) data with a self-contained Python CLI (twikit; no API keys, uses the user's own login cookies): profiles, a user's tweets/replies/likes, threads, search, followers, timelines, JSON/JSONL/CSV/SQLite output, resumable pagination. Use to scrape, archive, monitor, or analyze tweets or accounts.
インストールする前に、エージェントに与えられる指示の中身を確認できます。
Fetch public data from X (Twitter) — profiles, tweets, threads, search, followers — using the user's own login cookies instead of the paid developer API. This skill ships a single self-contained CLI, scripts/xfetch.py, that calls X's GraphQL API directly and emits structured data an agent can parse.
How it stays working (the architecture that matters): the hard part of X scraping is that X constantly changes its site — it rotates GraphQL query IDs every few weeks, migrates endpoints between GET and POST, and reshapes response JSON. This CLI splits those concerns so a break in one place doesn't take everything down:
pip install -U twikit) — so you don't hand-maintain the fastest-rotating values.x-client-transaction-id, which X accepts for read endpoints; and (2) its response-model layer — this CLI parses the raw JSON itself. It also auto-falls-back GET↔POST on a 404, so an endpoint X migrates keeps working.Net: if a command suddenly errors for everyone, the first fix is still pip install -U twikit (refreshes query IDs). If that doesn't help, X changed a response shape — check the parser in scripts/xfetch.py.
scripts/xfetch.py is built so you can drive it in a loop without surprises. Rely on these three channels rather than scraping prose:
stdout carries the data payload only (JSON by default). Redirect or pipe it — nothing else is written there.stderr carries human status (✓ Saved…) and errors. Read it to diagnose; ignore it when parsing.0 = success, 1 = error, 2 = not authenticated, 3 = rate limited (stderr carries rate_limit_reset=<epoch>), 64 = usage error (bad flag or argument — fix the command, don't re-auth). Branch on the exit code, not on stderr text.Confirm Python and install twikit (a virtualenv is cleanest so you don't touch system packages):
python3 -m pip install -r scripts/requirements.txt # installs twikit>=2.3.3
Verify the CLI loads:
python3 scripts/xfetch.py --version # -> xfetch-skill 0.3
Invoke every command as python3 scripts/xfetch.py <command> … using this skill's own copy of the script.
Every data command needs the user's X cookies (auth_token + ct0). Without them the command prints Not authenticated. to stderr and exits 2. Auth is delegated: the human sets it up once, the CLI saves a session to ~/.config/xfetch/cookies.json, and you reuse it — you don't own the credential lifecycle, you just check it's present.
Always run this first and branch on the exit code:
python3 scripts/xfetch.py auth check
If it isn't authenticated, get the human to provide credentials, in order of preference:
Extract from a logged-in browser (most convenient — reads the x.com cookies straight from the browser's store, no copy/paste):
python3 scripts/xfetch.py auth extract --browser chrome
# supported: chrome, chromium, firefox, safari, edge, brave, arc, opera, vivaldi, librewolf
Requires browser_cookie3 (in requirements.txt). On macOS this may prompt for Keychain access — that's the OS handing over the cookie-decryption key, which is expected.
Import a cookies file (best for browsers without a reader — e.g. ChatGPT Atlas, Orion, or any Chromium fork): export cookies with a "Get cookies.txt" browser extension (Netscape cookies.txt or JSON both work), then point the CLI at the file — it extracts auth_token + ct0 for you:
python3 scripts/xfetch.py auth import --file ~/Downloads/x.com_cookies.txt
Paste cookie tokens (works for any browser): open DevTools → Application → Cookies → https://x.com, copy the auth_token and ct0 values, then:
python3 scripts/xfetch.py auth set --auth-token <token> --ct0 <token>
Environment variables (good for CI / one-off, saves nothing to disk):
XFETCH_AUTH_TOKEN=<token> XFETCH_CT0=<token> python3 scripts/xfetch.py user @handle
Username/password login (twikit performs a real login; may trip a captcha or 2FA — pass --totp for TOTP-based 2FA):
python3 scripts/xfetch.py auth login --username <user> --password <pass>
Never invent or guess cookie values. Prefer auth set/env over login so no password passes through the command line. If auth is missing and you can't obtain it, stop and ask the human — you cannot proceed without it. These read a real account, so its login is a shared, rate-limited resource: don't hammer it.
The default json is pretty-printed for a human reading one result. For anything you or a pipeline will parse, pick deliberately with --format:
| Format | Flag | Use when |
|---|---|---|
| JSON (pretty) | (default) | Inspecting a single object or a small result |
| JSONL | --format jsonl | Large / multi-page results — one record per line, appendable, stream-friendly |
| CSV | --format csv | Spreadsheets or quick tabular analysis (nested fields are JSON-encoded in-cell) |
| SQLite | --format sqlite --db out.db | Building a queryable dataset; rows go to a tweets/users table, a summary prints to stderr |
Add --plain for compact single-line JSON. Save to a file by redirecting stdout, e.g. … --format jsonl > tweets.jsonl.
# Profile (by @handle or numeric id)
python3 scripts/xfetch.py user @elonmusk
# A user's tweets (--replies for replies, --media for media-only)
python3 scripts/xfetch.py tweets @elonmusk -n 50
python3 scripts/xfetch.py tweets @elonmusk --replies --all --format jsonl > timeline.jsonl
# A user's liked tweets
python3 scripts/xfetch.py likes @handle -n 40
# Single tweet, and a tweet with its replies (thread)
python3 scripts/xfetch.py tweet https://x.com/user/status/1234567890
python3 scripts/xfetch.py thread 1234567890
# Search (--type top|latest|media)
python3 scripts/xfetch.py search "AI agents" -n 100 --type latest
python3 scripts/xfetch.py search "from:openai since:2024-01-01" --all --format csv > openai.csv
# Followers / following, paginated into a SQLite dataset
python3 scripts/xfetch.py followers @handle --all --format sqlite --db network.db
python3 scripts/xfetch.py following @handle -n 100
# Your own timelines (uses the logged-in account)
python3 scripts/xfetch.py home # "For You"
python3 scripts/xfetch.py home --following # chronological
python3 scripts/xfetch.py bookmarks -n 50
search supports X's advanced operators (from:, to:, since:, until:, filter:, min_faves:, etc.) — pass them inside the quoted query. For the full flag reference and the exact fields each command returns, read references/commands.md.
DMs, lists, and trends are not exposed as commands (to keep this CLI small), but twikit supports them (get_dm_history, get_list_tweets, get_trends) — add a command following the existing pattern in scripts/xfetch.py if the user needs one.
Listing commands (tweets, search, followers, following, likes, home, bookmarks) share these flags — single page by default, opt into more:
-n 40 # results per page
--all # every page until exhausted
--max-pages 10 # cap the pages
--cursor <c> # start from a specific pagination cursor
--delay 1.5 # seconds between pages (default 1.0 — keep it >0 for --all)
When more pages remain — or a pull is interrupted or rate limited mid-way — the CLI prints next_cursor=<value> to stderr. Capture it and pass it back via --cursor to resume exactly where the pull stopped instead of refetching from the top.
X enforces per-account rate limits (roughly a few hundred requests per 15-minute window per endpoint) and this uses the user's real account. For bulk pulls keep a real --delay, prefer --max-pages over --all when you only need a sample, and remember aggressive scraping can get the account throttled or flagged. Route through a proxy for heavier work with --proxy http://user:pass@host:port.
Check the exit code, then read stderr to classify:
Not authenticated → run the auth flow above.rate_limit_reset=<epoch>; wait until then, raise --delay, and resume from the next_cursor= value printed on stderr.pip install -U twikit) and retry.next_cursor= line on stderr instead of refetching from the top.This reads public data plus whatever the logged-in account can see (its own home, bookmarks, likes). It does not post, like, follow, or modify anything — it's read-only by design. Because it uses the user's own session, the user is responsible for staying within X's Terms of Service and rate limits. Use it for legitimate purposes — research, personal archiving, monitoring accounts the user is entitled to read — not for harassment, mass surveillance, or evading a block. Session cookies live under ~/.config/xfetch/; clear them with auth clear.
まだレビューはありません。使ってみた感想をお寄せください。
概要と使いどころ
Use when designing, reviewing, or refactoring a CLI that must serve AI agents alongside humans, or when converting an API or SDK into an agent-usable CLI interface.
日本語の概要は準備中です。原文の説明を表示しています。
Search free commercial-use creative assets across multiple online sources — photos, illustrations, icons, video footage, music, sound effects, and fonts. Use when the user needs to find assets for videos, PPTs, articles, or any content creation. Trigger on phrases like "find me a photo of", "search for icons", "I need background music", "find video footage", "search fonts", "找一张图片", "搜素材", "帮我找图标/视频/音乐/字体". Covers Pexels, Unsplash, Pixabay, Iconify, Freesound, Google Fonts and more — with API-backed search where available.
日本語の概要は準備中です。原文の説明を表示しています。
Query the Semantic Scholar academic corpus through AI2's Asta MCP server: keyword or title search with venue and date filters, who-cited-a-paper traversal, author profiles and publications, DOI/arXiv/PMID lookup, and ~500-word full-text snippets for evidence, with citation counts and h-index. Use when the user asks for papers on a topic, who cited a paper, an author's work, recent literature since a date, or a venue-scoped paper list. Requires the Asta MCP server.
日本語の概要は準備中です。原文の説明を表示しています。
Extract and organize frames from a Bilibili video (bangumi episode, UP upload, or a local file) into scenery shots and per-character image groups, using anime-specific person detection + CCIP character-identity embeddings. Two modes — cluster everyone, or pull out one (or several) named characters via reference folders. Use when the user wants to collect, extract, or organize anime frames/screenshots by character or by scenery from a Bilibili video. Read-only download for personal viewing/analysis; uploads nothing.
日本語の概要は準備中です。原文の説明を表示しています。
Fetch Bilibili (哔哩哔哩) video comments for UP主 self-analysis. Use when the user asks to collect, download, export, or analyze comments on a Bilibili video (BV号 / URL / UID). Produces JSONL + summary.json suitable for further Claude Code analysis (sentiment, keywords, audience trends). Read-only; does not post/edit/delete.
日本語の概要は準備中です。原文の説明を表示しています。
Use when user requests diagrams, flowcharts, architecture charts, or visualizations. Also use proactively when explaining systems with 3+ components, complex data flows, or relationships that benefit from visual representation. Generates .excalidraw files and exports to PNG/SVG via Kroki API or locally using excalidraw-brute-export-cli.
日本語の概要は準備中です。原文の説明を表示しています。