mcpField
X
xiaohongshu-cli

xiaohongshu-cli

github.com/jackwenerOther2.7k1.4k installsUpdated 32w ago
Repository

About xiaohongshu-cli

xiaohongshu-cli is a command-line tool for agents and users to read and interact with Xiaohongshu. It covers note discovery, account activity, and publishing through the `xhs` command.

Key features

  1. 01Search and browse notes
  2. 02Read notes and comments
  3. 03Manage likes, bookmarks, and follows
  4. 04Publish and delete notes
  5. 05Browser-cookie and QR login
  6. 06Machine-readable YAML and JSON output

Use cases

  1. 01Find popular notes by topic
  2. 02Read a note and inspect its comments
  3. 03Publish a note or respond to comments
  4. 04Check account notifications and unread counts

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/jackwener/xiaohongshu-cli --skill xiaohongshu-cli

After installing, type/xiaohongshu-cliin Claude Code to confirm it loaded.

Bundled files

References and scripts installed along with SKILL.md.

README.md
.gitignore
SCHEMA.md
pyproject.toml
uv.lock
.github/ISSUE_TEMPLATE/
bug_report.yml
feature_request.yml
.github/workflows/
publish.yml
ci.yml
tests/
__init__.py
conftest.py
test_cli.py
test_anti_detection.py
test_client.py
test_formatter.py
test_creator.py
test_creator_signing.py
test_cookies.py
test_integration.py
test_qr_login.py
test_smoke.py
test_signing.py
xhs_cli/
__main__.py
client.py
__init__.py
client_mixins.py
command_normalizers.py
cli.py
xhs_cli/commands/
__init__.py
_common.py

Details

From the project README

xiaohongshu-cli — Xiaohongshu CLI Tool

Binary: xhs Credentials: browser cookies (auto-extracted) or browser-assisted QR login (--qrcode)

Setup

# Install (requires Python 3.10+)
uv tool install xiaohongshu-cli
# Or: pipx install xiaohongshu-cli

# Upgrade to latest (recommended to avoid API errors)
uv tool upgrade xiaohongshu-cli
# Or: pipx upgrade xiaohongshu-cli

Authentication

IMPORTANT FOR AGENTS: Before executing ANY xhs command, check if credentials exist first. Do NOT assume cookies are configured.

Step 0: Check if already authenticated
xhs status --yaml >/dev/null && echo "AUTH_OK" || echo "AUTH_NEEDED"

If AUTH_OK, skip to Command Reference. If AUTH_NEEDED, proceed to Step 1. Prefer --qrcode when browser cookie extraction is unavailable but launching a browser is acceptable.

Step 1: Guide user to authenticate

Ensure user is logged into xiaohongshu.com in any browser supported by browser_cookie3. Supported browsers: Chrome, Arc, Edge, Firefox, Safari, Brave, Chromium, Opera, Opera GX, Vivaldi, LibreWolf, Lynx, w3m. Then:

xhs login                              # auto-detect browser with valid cookies
xhs login --cookie-source arc          # specify browser explicitly
xhs login --qrcode                     # browser-assisted QR login with terminal QR output

Verify with:

xhs status
xhs whoami
Step 2: Handle common auth issues
SymptomAgent action
NoCookieError: No 'a1' cookie foundGuide user to login to xiaohongshu.com in browser
NeedVerifyError: Captcha requiredAsk user to open browser, complete captcha, then retry
IpBlockedError: IP blockedSuggest switching network (hotspot/VPN)
SessionExpiredErrorRun xhs login to refresh cookies

Agent Defaults

All machine-readable output uses the envelope documented in SCHEMA.md. Payloads live under .data.

  • Non-TTY stdout → auto YAML
  • --json / --yaml → explicit format
  • OUTPUT=json env → global override
  • OUTPUT=rich env → force human output

Command Reference

Reading
CommandDescriptionExample
xhs search <keyword>Search notesxhs search "美食" --sort popular --type video
xhs read <id_or_url_or_index>Read a note by ID, URL, or short indexxhs read 1 / xhs read "https://...?xsec_token=xxx"
xhs comments <id_or_url_or_index>Get comments by ID, URL, or short indexxhs comments 1 / xhs comments "https://...?xsec_token=..."
xhs comments <id_or_url> --allGet ALL comments (auto-paginate)xhs comments "<url>" --all --json
xhs sub-comments <note_id> <comment_id>Get replies to commentxhs sub-comments abc 123
xhs user <user_id>View user profilexhs user 5f2e123
xhs user-posts <user_id>List user's notesxhs user-posts 5f2e123 --cursor ""
xhs feedBrowse recommendation feedxhs feed --yaml
xhs hotBrowse trending notesxhs hot -c food
xhs topics <keyword>Search topics/hashtagsxhs topics "旅行"
xhs search-user <keyword>Search usersxhs search-user "摄影"
xhs my-notesList own published notesxhs my-notes --page 0
xhs notificationsView notificationsxhs notifications --type likes
xhs unreadShow unread countsxhs unread --json
Interactions (Write)
CommandDescriptionExample
xhs like <id_or_url_or_index>Like a notexhs like 1 / xhs like abc123
xhs like <id_or_url_or_index> --undoUnlike a notexhs like 1 --undo
xhs favorite <id_or_url_or_index>Bookmark a notexhs favorite 1
xhs unfavorite <id_or_url_or_index>Remove bookmarkxhs unfavorite 1
xhs comment <id_or_url_or_index> -c "text"Post a commentxhs comment 1 -c "好看!"
xhs reply <id_or_url_or_index> --comment-id ID -c "text"Reply to commentxhs reply 1 --comment-id 456 -c "谢谢"
xhs delete-comment <note_id> <comment_id>Delete own commentxhs delete-comment abc 123 -y
Social
CommandDescriptionExample
xhs follow <user_id>Follow a userxhs follow 5f2e123
xhs unfollow <user_id>Unfollow a userxhs unfollow 5f2e123
xhs favorites [user_id]List bookmarked notes (defaults to self)xhs favorites --json
Creator
CommandDescriptionExample
xhs post --title "..." --body "..." --images img.pngPublish a notexhs post --title "Test" --body "Hello"
xhs delete <id_or_url>Delete own notexhs delete abc123 -y
Account
CommandDescription
xhs loginExtract cookies from browser (auto-detect)
xhs login --qrcodeBrowser-assisted QR login — terminal QR output, browser completes login
xhs statusCheck authentication status
xhs logoutClear cached cookies
xhs whoamiShow current user profile

Agent Workflow Examples

Search → Read → Like pipeline
NOTE_ID=$(xhs search "美食推荐" --json | jq -r '.data.items[0].id')
xhs read "$NOTE_ID" --json | jq '.data'
xhs like "$NOTE_ID"
Browse trending food notes
xhs hot -c food --json | jq '.data.items[:5] | .[].note_card | {title, likes: .interact_info.liked_count}'
Get user info then follow
xhs user 5f2e123 --json | jq '.data.basic_info | {nickname, user_id}'
xhs follow 5f2e123
Check notifications
xhs unread --json | jq '.data'
xhs notifications --type mentions --json | jq '.data.message_list[:5]'
Analyze all comments on a note
# Fetch ALL comments and analyze themes
xhs comments "$NOTE_URL" --all --json | jq '.data.comments | length'
# Count questions
xhs comments "$NOTE_URL" --all --json | jq '[.data.comments[] | select(.content | test("[\uff1f?]"))] | length'
Daily reading workflow
# Browse recommendation feed
xhs feed --yaml

# Interactive short-index workflow
xhs search "旅行"
xhs read 1
xhs comments 1
xhs like 1
xhs favorite 1
xhs comment 1 -c "收藏了"

# Browse trending by category
xhs hot -c food --yaml
xhs hot -c travel --yaml
QR code login
# When browser cookie extraction is not available
xhs login --qrcode
# → Launches a browser-assisted login flow
# → Renders QR in terminal using Unicode half-blocks
# → Scan with Xiaohongshu app → confirm → export cookies
URL to insights pipeline
# User pastes a URL → read + all comments
xhs read "https://www.xiaohongshu.com/explore/xxx?xsec_token=yyy" --json
xhs comments "https://www.xiaohongshu.com/explore/xxx?xsec_token=yyy" --all --json

Hot Categories

Available for xhs hot -c <category>: fashion, food, cosmetics, movie, career, love, home, gaming, travel, fitness

Error Codes

Structured error codes returned in the error.code field:

  • not_authenticated — cookies expired or missing
  • verification_required — captcha/verification needed
  • ip_blocked — IP rate limited
  • signature_error — request signing failed
  • api_error — upstream API error
  • unsupported_operation — operation not available

Limitations

  • No video download — cannot download note images/videos
  • No DMs — cannot access private messages
  • No live streaming — live features not supported
  • No following/followers list — XHS web API doesn't expose these endpoints
  • Single account — one set of cookies at a time
  • Rate limited — built-in Gaussian jitter delay (~1-1.5s) between requests; aggressive usage may trigger captchas or IP blocks

Anti-Detection Notes for Agents

  • Do NOT parallelize requests — the built-in rate-limit delay exists for account safety
  • Captcha recovery: if NeedVerifyError occurs, the client auto-cools-down with increasing delays (5s→10s→20s→30s). Ask the user to complete captcha in browser before retrying
  • Batch operations: when doing bulk work (e.g., reading many notes), add time.sleep() between CLI calls
  • Session stability: all requests in a session share a consistent browser fingerprint. Restarting the CLI creates a new fingerprint session

Safety Notes

  • Do not ask users to share raw cookie values in chat logs.
  • Prefer local browser cookie extraction over manual secret copy/paste.
  • If auth fails, ask the user to re-login via xhs login.
  • Agent should treat cookie values as secrets (do not echo to stdout unnecessarily).
  • Built-in rate-limit delay protects accounts; do not bypass it.

Comments

Markdown supported