twitter-x-hub
Skill584 starsChanged 59 days agoMITView on GitHub
Skill for reading and writing Twitter/X data with Python + UV, with zero third-party dependencies (pure standard library), by directly passing the auth_token + ct0 cookies for authentication. In the Minis environment, cookies can be retrieved automatically with the browser_use tool by navigating to x.com and then using the get_cookies action, with no manual copying required. Supports scraping the home timeline, following list, bookmarks (including bookmark folders), search, user profiles, user tweets, likes, tweet details (single tweet or with replies), List timelines, followers/following lists, and write operations such as posting, deleting, liking, retweeting, and bookmarking. This skill must be triggered when the user mentions "scraping Twitter data," "get X tweets," "Twitter timeline," "X bookmarks," "search tweets," "twitter-x-hub," "request Twitter with cookies," "Twitter GraphQL," or any scenario that requires programmatic reading or writing of Twitter/X data.
- Installs packages
We split this skill into the rules it gives an agent
7 rules. About 0 are common, 3 are distinctive, and 4 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈3
Distinctive · estimate
This author's own choices. Worth a look.
4
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 54
Use browser_use navigate to open https://x.com and confirm you are logged in.
- Very specific: line 55
Use browser_use get_cookies to retrieve all cookies.
- Distinctive: line 207
Write operations use a random delay of 1.5 to 4 seconds.
- Very specific: line 237
All subcommands support the --auth-token / --ct0 parameters, which can also be replaced with environment variables.
- Distinctive: line 265
Use a dedicated secondary account to reduce the risk of your main account being flagged by risk controls.
- Distinctive: line 266
Write operations, such as posting tweets and liking tweets, carry a higher risk of triggering risk controls than read operations.
- Very specific: line 269
If you encounter risk controls, you can try passing the complete cookie string through the cookie_string parameter to strengthen the …
≈ “Common” is an estimate: at least 1 in 5 of the 308,232 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
twitter-x-hub
Modified from: public-clis/twitter-cli (formerly jackwener/twitter-cli) This skill simplifies the original repository as follows: it removes the
browser-cookie3/rich/click/PyYAML/curl_cffi/xclienttransaction/beautifulsoup4dependencies and replaces them with a pure standard library implementation; authentication now uses directly supplied cookies instead of automatic browser extraction; Twitter Article rendering and image upload functionality have been removed.
File Structure
/var/minis/skills/twitter-x-hub/
├── SKILL.md
├── pyproject.toml # UV project configuration (zero third-party dependencies)
└── scripts/
├── __init__.py
├── models.py # Data models (Tweet, Author, Metrics, UserProfile, BookmarkFolder)
├── parser.py # GraphQL response parsing (split from client.py, synced from upstream v0.8.6)
├── client.py # GraphQL client (core logic)
└── cli.py # Command-line entry point (argparse)Authentication
The Twitter/X internal GraphQL API uses two cookies for authentication:
| Cookie | Description |
auth_token | User login credential (OAuth Session Token) |
ct0 | CSRF Token, also used as the X-Csrf-Token request header |
Method 1: Retrieve automatically with the browser_use tool (recommended, preferred in the Minis environment)
In Minis, you can use the browser_use tool to navigate directly to x.com, then use the get_cookies action to read cookies,
with no manual copying required. After retrieval, store them in environment variables immediately to avoid exposing plaintext values in the conversation context.
Steps:
- Use
browser_use navigateto openhttps://x.comand confirm you are logged in. - Use
browser_use get_cookiesto retrieve all cookies.- The tool returns an offload env file path, such as
/var/minis/offloads/env_cookies_xxx.sh. - Raw cookie values will not appear in the conversation.
- The tool returns an offload env file path, such as
- Load the file, then use the cookies:
. /var/minis/offloads/env_cookies_xxx.sh
export TWITTER_AUTH_TOKEN="$COOKIE_AUTH_TOKEN"
export TWITTER_CT0="$COOKIE_CT0"Method 2: Set environment variables manually
Copy auth_token and ct0 from browser DevTools -> Application -> Cookies -> https://x.com,
then store them in Minis environment variables (Settings -> Environments): TWITTER_AUTH_TOKEN + TWITTER_CT0
Passing credentials (three methods, in descending priority)
- Environment variables:
TWITTER_AUTH_TOKEN+TWITTER_CT0(recommended) - CLI parameters:
--auth-token <value> --ct0 <value> - Pass directly in code:
TwitterClient(auth_token=..., ct0=...)
Quick Start
Environment Setup
# Confirm UV is available
which uv || pip install uv
# Enter the skill directory
cd /var/minis/skills/twitter-x-hubCLI Usage
# Scrape the home For-You timeline (20 items by default)
uv run python -m scripts.cli feed
# Scrape the Following timeline, 30 items, JSON output
uv run python -m scripts.cli feed --type following --max 30 --json
# Search tweets (Top/Latest/Photos/Videos)
uv run python -m scripts.cli search "Claude Code" --tab Latest --max 20
# Bookmarks
uv run python -m scripts.cli bookmarks --max 50
# Bookmark folder list (new)
uv run python -m scripts.cli bookmark-folders
# User profile
uv run python -m scripts.cli user elonmusk
# User tweets
uv run python -m scripts.cli user-posts elonmusk --max 20
# User likes
uv run python -m scripts.cli user-likes elonmusk --max 20
# Tweet details (including reply thread)
uv run python -m scripts.cli tweet 1234567890
# Quickly retrieve a single tweet (new, faster than the tweet command)
uv run python -m scripts.cli tweet-by-id 1234567890
# List timeline
uv run python -m scripts.cli list 1539453138322673664
# Followers / following lists (first use the user command to get user_id)
uv run python -m scripts.cli followers <user_id> --max 50
uv run python -m scripts.cli following <user_id> --max 50
# Post a tweet / reply
uv run python -m scripts.cli post "Hello from twitter-x-hub!"
uv run python -m scripts.cli post "reply text" --reply-to 1234567890
# Like / retweet / bookmark
uv run python -m scripts.cli like 1234567890
uv run python -m scripts.cli retweet 1234567890
uv run python -m scripts.cli bookmark 1234567890Use environment variables to avoid passing credentials each time
export TWITTER_AUTH_TOKEN="xxxx"
export TWITTER_CT0="yyyy"
uv run python -m scripts.cli feed --max 30 --jsonCall as a Python library
import os, json, dataclasses
from scripts.client import TwitterClient
client = TwitterClient(
auth_token=os.environ["TWITTER_AUTH_TOKEN"],
ct0=os.environ["TWITTER_CT0"],
)
# Scrape the home timeline
tweets = client.fetch_home_timeline(count=20)
for t in tweets:
print(f"@{t.author.screen_name}: {t.text[:80]}")
print(f" ❤️ {t.metrics.likes} 🔁 {t.metrics.retweets} 👁 {t.metrics.views} 🔖 {t.metrics.bookmarks}")
# Search (Latest tab)
results = client.fetch_search("AI agent", count=10, product="Latest")
# Single tweet (quick, no replies)
tweet = client.fetch_tweet_by_id("1234567890")
# Bookmark folders
folders = client.fetch_bookmark_folders()
# User profile
user = client.fetch_user("elonmusk")
print(user.id, user.followers_count)
# JSON serialization
data = [dataclasses.asdict(t) for t in tweets]
print(json.dumps(data, ensure_ascii=False, indent=2))Core Implementation Principles
Authentication Mechanism
Uses browser cookies (auth_token + ct0) plus a hard-coded public Bearer Token
to impersonate a Chrome browser request to Twitter's internal GraphQL API.
Three-level QueryId resolution (automatically handles API changes)
1. In-memory cache (fastest)
2. Hard-coded FALLBACK_QUERY_IDS (constant fallback)
→ If 404, the queryId has expired; proceed to the next level
3. Fetch the latest queryId from github.com/fa0311/twitter-openapi
→ If it is still unavailable, scan the x.com JS Bundle and extract it with a regular expressionURL Optimization (synced from upstream v0.8)
- Keys with a value of
Falsein thefeaturesdictionary are not sent, avoiding overly long URLs (414 errors).
Pagination & Rate Limiting
- Each response includes a
cursor; pages are fetched automatically until thecountlimit is reached. - The default request interval is 1.5 seconds + ±30% random jitter. HTTP 429 triggers exponential backoff and retry.
- Write operations use a random delay of 1.5 to 4 seconds.
Parser Split (synced from upstream v0.7+)
parser.pywas split out fromclient.pyand includes independent functions such asparse_tweet_result,parse_timeline_response, andparse_user_result, making unit testing and reuse easier.
CLI Subcommand Quick Reference
| Subcommand | Description | Key Parameters |
feed | Home timeline | --type for-you|following, --max, --json |
bookmarks | Bookmarks | --max, --json |
bookmark-folders | Bookmark folder list ⭐ New | --json |
search | Search | query, --tab Top|Latest|Photos|Videos, --max, --json |
user | User profile | screen_name, --json |
user-posts | User tweets | screen_name, --max, --json |
user-likes | User likes | screen_name, --max, --json |
tweet | Tweet details + replies | tweet_id, --max, --json |
tweet-by-id | Single tweet (quick) ⭐ New | tweet_id, --json |
list | List timeline | list_id, --max, --json |
followers | Followers list | user_id, --max, --json |
following | Following list | user_id, --max, --json |
post | Post a tweet | text, --reply-to |
delete | Delete a tweet | tweet_id |
like / unlike | Like/unlike | tweet_id |
retweet / unretweet | Retweet/unretweet | tweet_id |
bookmark / unbookmark | Bookmark/unbookmark | tweet_id |
All subcommands support the --auth-token / --ct0 parameters, which can also be replaced with environment variables.
Change Log (synced from upstream)
v0.8.6 Sync (2026-04-08)
- Full QueryId update: Real-time scanning from the x.com JS bundle (main.0e98bc8a.js) updated all IDs, including HomeTimeline, HomeLatestTimeline, UserTweets, SearchTimeline, Likes, TweetDetail, TweetResultByRestId, ListLatestTweetsTimeline, Followers, Following, CreateTweet, and others.
- New QueryIds:
TweetResultByRestId,BookmarkFoldersSlice,BookmarkFolderTimeline - New commands:
tweet-by-id(quick single-tweet retrieval),bookmark-folders(bookmark folders) - models.py: Added the
bookmarksfield toMetrics; added thearticle_title,article_text, andis_subscriber_onlyfields toTweet; added theBookmarkFolderdataclass. - parser.py: Split from
client.pyinto an independent module; fixed the new API structure (core.name/core.screen_name);parse_tweet_resultsupports full text fromnote_tweet(long tweets with "Show more"); added_unwrap_visibilityto handleTweetWithVisibilityResults; fixedparse_user_resultso thejoineddate is read fromcore.created_at. - URL optimization:
Falsevalues infeaturesare not sent, avoiding 414 errors. - SearchTimeline restriction: Starting in late 2025, X requires the
x-client-transaction-idheader. This header is generated byxclienttransaction(a C extension), which cannot be installed in the iSH/Alpine environment. Therefore, thesearchcommand is temporarily unavailable in this environment. Alternative: usebrowser_useto navigate to the search page and extract the DOM.
Notes
- Cookies are typically valid for several weeks to several months. After they expire, they must be retrieved from the browser again.
- Use a dedicated secondary account to reduce the risk of your main account being flagged by risk controls.
- Write operations, such as posting tweets and liking tweets, carry a higher risk of triggering risk controls than read operations. Use them at your discretion.
max_counthas a hard limit of 500 to prevent accidentally sending a large number of requests.- Upstream uses
curl_cffifor TLS fingerprint spoofing. This skill uses stdliburllibinstead. If you encounter risk controls, you can try passing the complete cookie string through thecookie_stringparameter to strengthen the fingerprint.
Other versions1 project uses a version of this.
Word for word · 0
None found.
Edited · 1
- lsongdev/skills★ 098% same
Wrote their own version · 0
None found.
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository56 other files it gives its agents.
- android-devSkill
- android-ui-automationSkill
- apple-remindersSkill
- appstoreprice-hubSkill
- asc-cliSkill
- bilibili-hubSkill
- Clash 控制器Skill
- cloudflare-dnsSkill
- codex-imageSkill
- codex-on-ishSkill
- contact-vcard-extractorSkill
- coredevice-toolkitSkill
- deepseek-usageSkill
- doubao-ttsSkill
- douyin-downloaderSkill
- evidence-chain-builderSkill
- exa-searchSkill
- free-ttsSkill
- fucai3d-latestSkill
- generative-ui-minisSkill
- github-sync-helperSkill
- health-sleep-analysisSkill
- health-training-checkinSkill
- hyperframes-cliSkill
- hyperframesSkill
- ios-devSkill
- korea-stockSkill
- maimai-hubSkill
- memos-apiSkill
- nano-bananaSkill
- notion-hubSkill
- openstreetmap-markerSkill
- pdf-converterSkill
- production-agent-publicSkill
- qbt-hubSkill
- quark-hubSkill
- reverse-dcfSkill
- self-improving-agentSkill
- shortcuts-builderSkill
- shortcut-share-fileSkill
- spotify-hubSkill
- stock-fund-flowSkill
- stock-priceSkill
- tavily-searchSkill
- tg-hubSkill
- todoocardSkill
- twitter-downloaderSkill
- us-stockSkill
- web-content-extractorSkill
- web-searchSkill
- weibo-hubSkill
- whenpeakSkill
- xianyu-hubSkill
- xiaohongshu-hubSkill
- youtube-downloaderSkill
- ytmusic-hubSkill
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
Reviews can't be read right now.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

