x-publish
32
总安装量
24
周安装量
#11465
全站排名
安装命令
npx skills add https://github.com/kangarooking/x-skills --skill x-publish
Agent 安装分布
opencode
18
gemini-cli
17
claude-code
17
antigravity
16
codex
13
cursor
11
Skill 文档
X Publish
Publish tweets and threads to X draft using Playwright browser automation.
Prerequisites
- Playwright MCP for browser automation
- User logged into X (Twitter)
- Python 3.9+ with dependencies:
- macOS:
pip install Pillow pyobjc-framework-Cocoa - Windows:
pip install Pillow pywin32
- macOS:
Critical Rules
- NEVER auto-publish – Only save to draft
- User must be logged in – Prompt to login if not
- Verify content before saving – Double-check tweet text
Content Types
Short Tweet
Single tweet â¤280 characters
Thread
Multiple tweets connected (3-10 tweets)
Scripts
copy_to_clipboard.py
Copy text to system clipboard for paste operation:
# Copy text to clipboard
python scripts/copy_to_clipboard.py text "Tweet content here"
# Copy from file
python scripts/copy_to_clipboard.py text --file /tmp/tweet.txt
Workflow
Short Tweet
Step 1: Prepare Content
# Save tweet to temp file
echo "Tweet content" > /tmp/tweet.txt
# Copy to clipboard
python scripts/copy_to_clipboard.py text --file /tmp/tweet.txt
Step 2: Open Compose
browser_navigate: https://x.com/compose/post
Step 3: Paste Content
browser_snapshot â Find tweet textbox
browser_click: textbox
browser_press_key: Meta+v
Step 4: Save Draft
browser_click: X (close button)
browser_click: "Save" or "ä¿å" in dialog
Step 5: Verify
Report: "Draft saved. Please review at https://x.com/compose/drafts"
Thread
Step 1: Prepare Content Parse thread into individual tweets:
### 1/5
First tweet content...
### 2/5
Second tweet content...
Step 2: Open Compose
browser_navigate: https://x.com/compose/post
Step 3: Add First Tweet
python scripts/copy_to_clipboard.py text "First tweet content"
browser_click: textbox
browser_press_key: Meta+v
Step 4: Add More Tweets For each additional tweet:
browser_click: "Add another post" / "æ·»å " button
browser_press_key: Meta+v (after copying next tweet)
Step 5: Save Draft
browser_click: X (close button)
browser_click: "Save" in dialog
Step 6: Verify
Report: "Thread draft saved ({n} tweets). Review at https://x.com/compose/drafts"
Efficiency Guidelines
Avoid Unnecessary Waits
â browser_snapshot after every action
â
Use action return values for next step
Parallel Preparation
â
Prepare all tweet content before browser operations
â
Copy to clipboard while navigating
Sequential Execution
Navigate â Paste first tweet â Add tweet â Paste â ... â Save
Element References
Common elements in X compose:
| Element | Description | Typical ref pattern |
|---|---|---|
| Tweet textbox | Main input area | textbox with “What’s happening” |
| Add tweet button | “+” or “æ·»å “ | button near compose area |
| Close button | X icon | button top-left |
| Save draft | In close dialog | “Save” / “ä¿å” button |
| Drafts link | View saved drafts | link to /compose/drafts |
Example Flows
Short Tweet Example
User: /x-publish "Claude 4.5åå¸äºï¼extended thinkingæ¯çæ£ç游æè§åæ¹åè
ã"
# 1. Copy to clipboard
python scripts/copy_to_clipboard.py text "Claude 4.5åå¸äºï¼extended thinkingæ¯çæ£ç游æè§åæ¹åè
ã"
# 2. Navigate and paste
browser_navigate: https://x.com/compose/post
browser_snapshot â find textbox
browser_click: textbox
browser_press_key: Meta+v
# 3. Close and save
browser_click: close button (X)
browser_click: "Save" button
# 4. Report
"Draft saved! Review at: https://x.com/compose/drafts"
Thread Example
User: /x-publish (with thread content from x-create)
Thread:
### 1/3
First point about AI...
### 2/3
Second point...
### 3/3
Conclusion...
Execution:
# Prepare all tweets
tweet1="First point about AI..."
tweet2="Second point..."
tweet3="Conclusion..."
# Navigate
browser_navigate: https://x.com/compose/post
# Tweet 1
python copy_to_clipboard.py text "$tweet1"
browser_click: textbox
browser_press_key: Meta+v
# Tweet 2
python copy_to_clipboard.py text "$tweet2"
browser_click: "Add another post" button
browser_press_key: Meta+v
# Tweet 3
python copy_to_clipboard.py text "$tweet3"
browser_click: "Add another post" button
browser_press_key: Meta+v
# Save
browser_click: close button
browser_click: "Save"
# Report
"Thread draft saved (3 tweets). Review at: https://x.com/compose/drafts"
Error Handling
Not Logged In
If login page detected:
â "Please log in to X first, then run /x-publish again"
Character Limit
If tweet > 280 chars:
â Split into thread or truncate with warning
Network Error
If page fails to load:
â Retry once, then report error
Integration
After publishing:
æ¨æå·²ä¿åå°è稿箱ï¼
- ç±»å: {short/thread}
- æ¡æ°: {n}
- èç¨¿é¾æ¥: https://x.com/compose/drafts
请æå¨å®¡æ ¸ååå¸ã