Auto Tweet Publish

Automation

Post, search, like, retweet, bookmark, and manage a Twitter/X account via a local twikit-based API server on port 19816. Use when the user asks to tweet, search tweets, check timeline, like/retweet posts, or manage their X account. Replaces openclaw-x with fully auditable open-source Python code.

Install

openclaw skills install auto-tweet

Auto-Tweet Agent — OpenClaw Skill

Safe, open-source Twitter/X automation via twikit. Replaces openclaw-x with fully auditable Python code.

Overview

This skill lets you control a Twitter/X account through natural language. The local API runs on http://localhost:19816 and wraps the open-source twikit library (4.1K+ ⭐, MIT license).

No closed-source binaries. No cookie theft risk. Fully transparent.

Prerequisites

The Auto-Tweet server must be running:

cd ~/.openclaw/skills/auto-tweet
python main.py

Available Actions

Post a tweet

curl -X POST http://localhost:19816/tweet \
  -H "Content-Type: application/json" \
  -d '{"text": "Hello from OpenClaw!"}'

Post a tweet with media

curl -X POST http://localhost:19816/tweet \
  -H "Content-Type: application/json" \
  -d '{"text": "Check this out!", "media_paths": ["/path/to/image.jpg"]}'

Reply to a tweet

curl -X POST http://localhost:19816/tweet \
  -H "Content-Type: application/json" \
  -d '{"text": "Great point!", "reply_to": "TWEET_ID"}'

Quote tweet

curl -X POST http://localhost:19816/tweet \
  -H "Content-Type: application/json" \
  -d '{"text": "This is amazing!", "quote_url": "https://x.com/user/status/TWEET_ID"}'

Search tweets

curl "http://localhost:19816/search?q=AI+Agent&type=Latest&count=10"

Search users

curl "http://localhost:19816/search/users?q=openai&count=5"

Get timeline (For You)

curl "http://localhost:19816/timeline?count=20"

Get timeline (Following)

curl "http://localhost:19816/timeline/following?count=20"

Like a tweet

curl -X POST http://localhost:19816/like \
  -H "Content-Type: application/json" \
  -d '{"tweet_id": "TWEET_ID"}'

Unlike a tweet

curl -X POST http://localhost:19816/unlike \
  -H "Content-Type: application/json" \
  -d '{"tweet_id": "TWEET_ID"}'

Retweet

curl -X POST http://localhost:19816/retweet \
  -H "Content-Type: application/json" \
  -d '{"tweet_id": "TWEET_ID"}'

Undo retweet

curl -X POST http://localhost:19816/unretweet \
  -H "Content-Type: application/json" \
  -d '{"tweet_id": "TWEET_ID"}'

Bookmark a tweet

curl -X POST http://localhost:19816/bookmark \
  -H "Content-Type: application/json" \
  -d '{"tweet_id": "TWEET_ID"}'

Get bookmarks

curl "http://localhost:19816/bookmarks?count=20"

Get user profile

curl "http://localhost:19816/user/elonmusk"

Get user tweets

curl "http://localhost:19816/user/elonmusk/tweets?type=Tweets&count=10"

Get a specific tweet

curl "http://localhost:19816/tweet/TWEET_ID"

Delete a tweet

curl -X DELETE "http://localhost:19816/tweet/TWEET_ID"

Get trending topics

curl "http://localhost:19816/trends?category=trending"

Send a DM

curl -X POST http://localhost:19816/dm \
  -H "Content-Type: application/json" \
  -d '{"user_id": "USER_ID", "text": "Hello!"}'

Follow / Unfollow

curl -X POST "http://localhost:19816/follow/USER_ID"
curl -X POST "http://localhost:19816/unfollow/USER_ID"

Get notifications

curl "http://localhost:19816/notifications?type=Mentions&count=20"

Schedule a tweet

curl -X POST http://localhost:19816/schedule \
  -H "Content-Type: application/json" \
  -d '{"text": "Scheduled tweet!", "scheduled_at": 1735689600}'

Check rate limits

curl "http://localhost:19816/rate_limits"

Health check

curl "http://localhost:19816/"

Rate Limits (Built-in Safety)

LimitDefaultPurpose
API calls/hour30Prevent hourly burst
API calls/day200Match normal usage
Tweets/day20Conservative posting

All limits are configurable in config.json.

Error Handling

All endpoints return standard HTTP status codes:

  • 200 — Success
  • 400 — Bad request (invalid parameters)
  • 401 — Session expired (restart server)
  • 403 — Account issue (suspended/locked)
  • 409 — Duplicate tweet
  • 429 — Rate limit exceeded
  • 500 — Twitter API error

Security Notes

  • Server binds to 127.0.0.1 only (localhost) — no external access
  • Credentials stay in local config.json
  • Cookies saved locally in cookies.json
  • All code is open-source Python — fully auditable
  • No telemetry, no external callbacks
  • Rate limiter protects against accidental overuse