A CLI for Twitter/X — feed, bookmarks, and user timeline in terminal
Project description
twitter-cli
A terminal-first CLI for Twitter/X: read timelines, bookmarks, and user profiles without API keys.
More Tools
- xhs-cli — Xiaohongshu (小红书) CLI for notes and account workflows
- bilibili-cli — Bilibili CLI for videos, users, search, and feeds
English
Features
Read:
- Timeline: fetch
for-youandfollowingfeeds - Bookmarks: list saved tweets from your account
- Search: find tweets by keyword with Top/Latest/Photos/Videos tabs
- Tweet detail: view a tweet and its replies
- List timeline: fetch tweets from a Twitter List
- User lookup: fetch user profile, tweets, likes, followers, and following
- JSON output: export any data for scripting
- Optional scoring filter: rank tweets by engagement weights
Write:
- Post: create new tweets and replies
- Delete: remove your own tweets
- Like / Unlike: manage tweet likes
- Retweet / Unretweet: manage retweets
- Bookmark: favorite/unfavorite
Auth:
- Cookie auth: use browser cookies or environment variables
Installation
# Recommended: uv tool (fast, isolated)
uv tool install twitter-cli
# Alternative: pipx
pipx install twitter-cli
Install from source:
git clone git@github.com:jackwener/twitter-cli.git
cd twitter-cli
uv sync
Quick Start
# Fetch home timeline (For You)
twitter feed
# Fetch Following timeline
twitter feed -t following
# Enable ranking filter explicitly
twitter feed --filter
Usage
# Feed
twitter feed --max 50
twitter feed --json > tweets.json
twitter feed --input tweets.json
# Bookmarks
twitter favorites
twitter favorites --max 30 --json
# Search
twitter search "Claude Code"
twitter search "AI agent" -t Latest --max 50
twitter search "机器学习" --json
# Tweet detail (view tweet + replies)
twitter tweet 1234567890
twitter tweet https://x.com/user/status/1234567890
# List timeline
twitter list 1539453138322673664
# User
twitter user elonmusk
twitter user-posts elonmusk --max 20
twitter likes elonmusk --max 30
twitter followers elonmusk --max 50
twitter following elonmusk --max 50
# Write operations
twitter post "Hello from twitter-cli!"
twitter post "reply text" --reply-to 1234567890
twitter delete 1234567890
twitter like 1234567890
twitter unlike 1234567890
twitter retweet 1234567890
twitter unretweet 1234567890
twitter favorite 1234567890
twitter unfavorite 1234567890
Authentication
twitter-cli uses this auth priority:
- Environment variables:
TWITTER_AUTH_TOKEN+TWITTER_CT0 - Browser cookies: auto-extract from Chrome/Edge/Firefox/Brave
After loading cookies, the CLI performs lightweight verification. Commands that require account access fail fast on clear auth errors (401/403).
Configuration
Create config.yaml in your working directory:
fetch:
count: 50
filter:
mode: "topN" # "topN" | "score" | "all"
topN: 20
minScore: 50
lang: []
excludeRetweets: false
weights:
likes: 1.0
retweets: 3.0
replies: 2.0
bookmarks: 5.0
views_log: 0.5
rateLimit:
requestDelay: 1.5 # seconds between paginated requests
maxRetries: 3 # retry count on rate limit (429)
retryBaseDelay: 5.0 # base delay for exponential backoff
maxCount: 200 # hard cap on fetched items
Filter behavior:
- Default behavior: no ranking filter unless
--filteris passed - With
--filter: tweets are scored/sorted usingconfig.filter
Scoring formula:
score = likes_w * likes
+ retweets_w * retweets
+ replies_w * replies
+ bookmarks_w * bookmarks
+ views_log_w * log10(max(views, 1))
Mode behavior:
mode: "topN"keeps the highesttopNtweets by scoremode: "score"keeps tweets wherescore >= minScoremode: "all"returns all tweets after sorting by score
Troubleshooting
-
No Twitter cookies found- Ensure you are logged in to
x.comin a supported browser. - Or set
TWITTER_AUTH_TOKENandTWITTER_CT0manually.
- Ensure you are logged in to
-
Cookie expired or invalid (HTTP 401/403)- Re-login to
x.comand retry.
- Re-login to
-
Twitter API error 404- This can happen when upstream GraphQL query IDs rotate.
- Retry the command; the client attempts a live queryId fallback.
-
Invalid tweet JSON file- Regenerate input using
twitter feed --json > tweets.json.
- Regenerate input using
Development
# Install dev dependencies
uv sync --extra dev
# Lint + tests
uv run ruff check .
uv run pytest -q
Project Structure
twitter_cli/
├── __init__.py
├── cli.py
├── client.py
├── auth.py
├── config.py
├── constants.py
├── filter.py
├── formatter.py
├── serialization.py
└── models.py
Use as AI Agent Skill
twitter-cli ships with a SKILL.md so AI agents can execute common X/Twitter workflows.
Claude Code / Antigravity
# Clone into your project's skills directory
mkdir -p .agents/skills
git clone git@github.com:jackwener/twitter-cli.git .agents/skills/twitter-cli
# Or copy SKILL.md only
curl -o .agents/skills/twitter-cli/SKILL.md \
https://raw.githubusercontent.com/jackwener/twitter-cli/main/SKILL.md
OpenClaw / ClawHub
Install from ClawHub:
clawhub install twitter-cli
After installation, OpenClaw can call twitter-cli commands directly.
中文
功能概览
读取:
- 时间线读取:支持
for-you和following - 收藏读取:查看账号书签推文
- 搜索:按关键词搜索推文,支持 Top/Latest/Photos/Videos
- 推文详情:查看推文及其回复
- 列表时间线:获取 Twitter List 的推文
- 用户查询:查看用户资料、推文、点赞、粉丝和关注
- JSON 输出:便于脚本处理
写入:
-
发推:发布新推文和回复
-
删除:删除自己的推文
-
点赞 / 取消点赞
-
转推 / 取消转推
-
收藏 / 取消收藏:favorite/unfavorite
-
可选筛选:按 engagement score 排序
-
Cookie 认证:支持环境变量和浏览器自动提取
安装
# 推荐:uv tool
uv tool install twitter-cli
使用指南
# 时间线
twitter feed
twitter feed -t following
twitter feed --filter
# 收藏
twitter favorites
# 搜索
twitter search "Claude Code"
twitter search "AI agent" -t Latest --max 50
# 推文详情
twitter tweet 1234567890
# 列表时间线
twitter list 1539453138322673664
# 用户
twitter user elonmusk
twitter user-posts elonmusk --max 20
twitter likes elonmusk --max 30
twitter followers elonmusk
twitter following elonmusk
# 写操作
twitter post "你好,世界!"
twitter post "回复内容" --reply-to 1234567890
twitter delete 1234567890
twitter like 1234567890
twitter unlike 1234567890
twitter retweet 1234567890
twitter unretweet 1234567890
twitter favorite 1234567890
twitter unfavorite 1234567890
认证说明
认证优先级:
TWITTER_AUTH_TOKEN+TWITTER_CT0- 浏览器 Cookie 自动提取(Chrome/Edge/Firefox/Brave)
筛选算法
只有在传入 --filter 时才会启用筛选评分;默认不筛选。
评分公式:
score = likes_w * likes
+ retweets_w * retweets
+ replies_w * replies
+ bookmarks_w * bookmarks
+ views_log_w * log10(max(views, 1))
模式说明:
mode: "topN":按分数排序后保留前topN条mode: "score":仅保留score >= minScore的推文mode: "all":按分数排序后全部保留
常见问题
- 报错
No Twitter cookies found:请先登录x.com或手动设置环境变量。 - 报错
Cookie expired or invalid:Cookie 过期,重新登录后重试。 - 报错
Twitter API error 404:通常是 queryId 轮换,重试即可。
注意事项
- Cookie 登录有平台风控风险,建议使用专用账号。
- Cookie 仅在本地使用,不会被本工具上传。
作为 AI Agent Skill 使用
twitter-cli 提供了 SKILL.md,可让 AI Agent 更稳定地调用本工具。
Claude Code / Antigravity
# 克隆到项目 skills 目录
mkdir -p .agents/skills
git clone git@github.com:jackwener/twitter-cli.git .agents/skills/twitter-cli
# 或仅下载 SKILL.md
curl -o .agents/skills/twitter-cli/SKILL.md \
https://raw.githubusercontent.com/jackwener/twitter-cli/main/SKILL.md
OpenClaw / ClawHub
通过 ClawHub 安装:
clawhub install twitter-cli
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file twitter_cli-0.1.1.tar.gz.
File metadata
- Download URL: twitter_cli-0.1.1.tar.gz
- Upload date:
- Size: 80.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7ae2a29d0c6d7f31faec0762dff2e2e0511e9f51003f78d7592ec12c71e9baa2
|
|
| MD5 |
81e4bd3c300f6995cf24b10deebf59e7
|
|
| BLAKE2b-256 |
04dfeea0e01e191b29bdd6691da717aafbd739e10fe53a936bda5c7d7859afb9
|
Provenance
The following attestation bundles were made for twitter_cli-0.1.1.tar.gz:
Publisher:
publish.yml on jackwener/twitter-cli
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
twitter_cli-0.1.1.tar.gz -
Subject digest:
7ae2a29d0c6d7f31faec0762dff2e2e0511e9f51003f78d7592ec12c71e9baa2 - Sigstore transparency entry: 1064666057
- Sigstore integration time:
-
Permalink:
jackwener/twitter-cli@3e13ed374966f563dd1d51d8045c7cc3b4a8143f -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/jackwener
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@3e13ed374966f563dd1d51d8045c7cc3b4a8143f -
Trigger Event:
push
-
Statement type:
File details
Details for the file twitter_cli-0.1.1-py3-none-any.whl.
File metadata
- Download URL: twitter_cli-0.1.1-py3-none-any.whl
- Upload date:
- Size: 29.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9d735ddd04d72fb7ee1765745cd783ba74251a7d8221e48c6c49622b83ef9491
|
|
| MD5 |
26e56b1f4e063ae90075b0e1dc4c7215
|
|
| BLAKE2b-256 |
558d8a3f442b35b2f1153a6a8b175a803fc28e7b8e63a70f7d2131a5b56b47f3
|
Provenance
The following attestation bundles were made for twitter_cli-0.1.1-py3-none-any.whl:
Publisher:
publish.yml on jackwener/twitter-cli
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
twitter_cli-0.1.1-py3-none-any.whl -
Subject digest:
9d735ddd04d72fb7ee1765745cd783ba74251a7d8221e48c6c49622b83ef9491 - Sigstore transparency entry: 1064666073
- Sigstore integration time:
-
Permalink:
jackwener/twitter-cli@3e13ed374966f563dd1d51d8045c7cc3b4a8143f -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/jackwener
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@3e13ed374966f563dd1d51d8045c7cc3b4a8143f -
Trigger Event:
push
-
Statement type: