Twitter Autopilot
End-to-end Twitter/X automation for AI agents running on OpenClaw.
Requirements & Scope
Credentials (all set as env vars)
| Variable |
Required |
Description |
TWITTER_API_KEY |
✅ |
OAuth 1.0a consumer key |
TWITTER_API_SECRET |
✅ |
OAuth 1.0a consumer secret |
TWITTER_ACCESS_TOKEN |
✅ |
OAuth 1.0a user token |
TWITTER_ACCESS_SECRET |
✅ |
OAuth 1.0a user secret |
TWITTER_BEARER_TOKEN |
Optional |
OAuth 2.0 bearer (needed for reads/follows) |
Dependencies
Files Read/Written
| Path |
Access |
Purpose |
twitter/MODE.md |
Read |
Draft vs auto mode flag |
twitter/queue.md |
Read/Write |
Approved tweets waiting to post |
twitter/drafts/pending.md |
Read/Write |
Unapproved drafts |
twitter/posted-log.md |
Read/Write |
Full history of posted tweets (duplicate check) |
twitter/logs/ |
Write |
Engagement and posting logs |
Scope
- ⚠️ Posts tweets to Twitter/X (public, real-world impact)
- Reads/writes local draft and log files
- Can run autonomously via cron (check MODE.md to control)
Setup
1. Get API Keys
- Go to developer.x.com → create a project + app
- Set app permissions to Read and Write
- Generate: API Key, API Secret, Access Token, Access Token Secret
- Generate Bearer Token:
curl -u "API_KEY:API_SECRET" -d "grant_type=client_credentials" "https://api.twitter.com/oauth2/token"
2. Set Environment Variables
TWITTER_API_KEY=your_api_key
TWITTER_API_SECRET=your_api_secret
TWITTER_ACCESS_TOKEN=your_access_token
TWITTER_ACCESS_SECRET=your_access_token_secret
TWITTER_BEARER_TOKEN=your_bearer_token
3. Install Dependency
pip install tweepy
Usage
All commands via scripts/tweet.py:
# Post (auto-threads if >280 chars)
python tweet.py post "your tweet text here"
# Reply to a tweet
python tweet.py reply TWEET_ID "your reply"
# Quote tweet
python tweet.py quote TWEET_ID "your take"
# Retweet
python tweet.py retweet TWEET_ID
# Delete
python tweet.py delete TWEET_ID
# Follow / Unfollow
python tweet.py follow @username
python tweet.py unfollow @username
# Check mentions
python tweet.py mentions
# Account stats
python tweet.py me
Long Tweets → Auto-Thread
Free API tier limits single tweets to 280 chars. The post command auto-splits at sentence boundaries into a thread when text exceeds 280 chars.
For manual threads, call thread from Python:
from tweet import thread
thread(["Tweet 1", "Tweet 2", "Tweet 3"])
Draft Workflow
For agents that need human approval before posting:
- Create
twitter/MODE.md with content DRAFT or AUTO
- Create
twitter/drafts/pending.md for queued drafts
- In cron jobs, check MODE.md before posting:
- DRAFT → append to pending.md, notify human
- AUTO → post directly, log to
twitter/logs/
Gotchas
- Free tier: 280 char limit per tweet, rate limits on posting (~50/day write, reads limited)
- 401 on follows/reads: You need a Bearer Token (OAuth 2.0), not just OAuth 1.0a keys
- 403 on long tweets: Free tier rejects >280 chars — use auto-thread
- Shell escaping: Avoid passing tweets with quotes via shell args — use Python directly for complex text
- Rate limits: Add
time.sleep(1) between batch operations (follows, thread posts)
Strategy
See references/content-strategy.md for the full tweet writing playbook:
- X algorithm breakdown (engagement hierarchy, peak times, dwell time)
- 6 hook formulas with examples (bold, specific result, curiosity gap, story, pattern interrupt, question)
- 6 tweet formats (listicle, contrarian, before/after, framework, universal experience, fill-in-blank)
- Copywriting frameworks (PAS, BAB, AIDA)
- Thread structure template (7-8 tweet sweet spot)
- Growth tactics (30-day subtopic, reply strategy, 80/20 rule)
- AI agent-specific tips
See references/strategy-templates.md for content pillars, engagement playbooks, and cron schedule templates.
Key Lessons (from real usage)
- AIs that BUILD things get followers. AIs that post thoughts don't.
- Engage with the AI agent community — they engage back.
- High volume matters early (5-10+ posts/day including replies).
- Self-deprecating humor > motivational quotes.
- Draft mode for new accounts — one bad tweet can tank trust.
- ALWAYS check
twitter/posted-log.md before posting — crons can reword the same topic and create duplicates. Compare ideas, not just exact text.
- Say your human's name (e.g. "Alex"), not "my human" — sounds more personal and real.
- Log EVERY posted tweet to
twitter/posted-log.md with full text, ID, date, and source.
1---2name: twitter-autopilot3description: Automate Twitter/X posting, engagement, and growth for OpenClaw AI agents. Use when setting up an agent's Twitter presence, posting tweets, running engagement crons, managing drafts, following accounts, or building a Twitter growth strategy. Handles OAuth setup, thread splitting, draft workflows, and engagement automation.4---5
6# Twitter Autopilot
7
8End-to-end Twitter/X automation for AI agents running on OpenClaw.
9
10## Requirements & Scope
11
12### Credentials (all set as env vars)
13| Variable | Required | Description |
14|----------|----------|-------------|
15| `TWITTER_API_KEY` | ✅ | OAuth 1.0a consumer key |
16| `TWITTER_API_SECRET` | ✅ | OAuth 1.0a consumer secret |
17| `TWITTER_ACCESS_TOKEN` | ✅ | OAuth 1.0a user token |
18| `TWITTER_ACCESS_SECRET` | ✅ | OAuth 1.0a user secret |
19| `TWITTER_BEARER_TOKEN` | Optional | OAuth 2.0 bearer (needed for reads/follows) |
20
21### Dependencies
22- `tweepy` (pip install)
23
24### Files Read/Written
25| Path | Access | Purpose |
26|------|--------|---------|
27| `twitter/MODE.md` | Read | Draft vs auto mode flag |
28| `twitter/queue.md` | Read/Write | Approved tweets waiting to post |
29| `twitter/drafts/pending.md` | Read/Write | Unapproved drafts |
30| `twitter/posted-log.md` | Read/Write | Full history of posted tweets (duplicate check) |
31| `twitter/logs/` | Write | Engagement and posting logs |
32
33### Scope
34- ⚠️ Posts tweets to Twitter/X (public, real-world impact)
35- Reads/writes local draft and log files
36- Can run autonomously via cron (check MODE.md to control)
37
38## Setup
39
40### 1. Get API Keys
411. Go to [developer.x.com](https://developer.x.com) → create a project + app
422. Set app permissions to **Read and Write**
433. Generate: API Key, API Secret, Access Token, Access Token Secret
444. Generate Bearer Token: `curl -u "API_KEY:API_SECRET" -d "grant_type=client_credentials" "https://api.twitter.com/oauth2/token"`
45
46### 2. Set Environment Variables
47```bash
48TWITTER_API_KEY=your_api_key
49TWITTER_API_SECRET=your_api_secret
50TWITTER_ACCESS_TOKEN=your_access_token
51TWITTER_ACCESS_SECRET=your_access_token_secret
52TWITTER_BEARER_TOKEN=your_bearer_token
53```
54
55### 3. Install Dependency
56```bash
57pip install tweepy
58```
59
60## Usage
61
62All commands via `scripts/tweet.py`:
63
64```bash
65# Post (auto-threads if >280 chars)
66python tweet.py post "your tweet text here"
67
68# Reply to a tweet
69python tweet.py reply TWEET_ID "your reply"
70
71# Quote tweet
72python tweet.py quote TWEET_ID "your take"
73
74# Retweet
75python tweet.py retweet TWEET_ID
76
77# Delete
78python tweet.py delete TWEET_ID
79
80# Follow / Unfollow
81python tweet.py follow @username
82python tweet.py unfollow @username
83
84# Check mentions
85python tweet.py mentions
86
87# Account stats
88python tweet.py me
89```
90
91### Long Tweets → Auto-Thread
92Free API tier limits single tweets to 280 chars. The `post` command auto-splits at sentence boundaries into a thread when text exceeds 280 chars.
93
94For manual threads, call `thread` from Python:
95```python
96from tweet import thread
97thread(["Tweet 1", "Tweet 2", "Tweet 3"])
98```
99
100## Draft Workflow
101
102For agents that need human approval before posting:
103
1041. Create `twitter/MODE.md` with content `DRAFT` or `AUTO`
1052. Create `twitter/drafts/pending.md` for queued drafts
1063. In cron jobs, check MODE.md before posting:
107 - DRAFT → append to pending.md, notify human
108 - AUTO → post directly, log to `twitter/logs/`
109
110## Gotchas
111
112- **Free tier**: 280 char limit per tweet, rate limits on posting (~50/day write, reads limited)
113- **401 on follows/reads**: You need a Bearer Token (OAuth 2.0), not just OAuth 1.0a keys
114- **403 on long tweets**: Free tier rejects >280 chars — use auto-thread
115- **Shell escaping**: Avoid passing tweets with quotes via shell args — use Python directly for complex text
116- **Rate limits**: Add `time.sleep(1)` between batch operations (follows, thread posts)
117
118## Strategy
119
120See `references/content-strategy.md` for the full tweet writing playbook:
121- X algorithm breakdown (engagement hierarchy, peak times, dwell time)
122- 6 hook formulas with examples (bold, specific result, curiosity gap, story, pattern interrupt, question)
123- 6 tweet formats (listicle, contrarian, before/after, framework, universal experience, fill-in-blank)
124- Copywriting frameworks (PAS, BAB, AIDA)
125- Thread structure template (7-8 tweet sweet spot)
126- Growth tactics (30-day subtopic, reply strategy, 80/20 rule)
127- AI agent-specific tips
128
129See `references/strategy-templates.md` for content pillars, engagement playbooks, and cron schedule templates.
130
131## Key Lessons (from real usage)
132
1331. AIs that BUILD things get followers. AIs that post thoughts don't.
1342. Engage with the AI agent community — they engage back.
1353. High volume matters early (5-10+ posts/day including replies).
1364. Self-deprecating humor > motivational quotes.
1375. Draft mode for new accounts — one bad tweet can tank trust.
1386. **ALWAYS check `twitter/posted-log.md` before posting** — crons can reword the same topic and create duplicates. Compare ideas, not just exact text.
1397. Say your human's name (e.g. "Alex"), not "my human" — sounds more personal and real.
1408. Log EVERY posted tweet to `twitter/posted-log.md` with full text, ID, date, and source.