X CDP Automation

Automate X (Twitter) via Chromium CDP: post tweets, reply, quote-retweet, publish articles. Uses real browser sessions with existing login, no API keys neede...

Jason Chai

@stwith

What This Skill Does

Browser automation tool for X (Twitter) that posts tweets, replies, quote-retweets, and publishes articles by driving a real Chromium session via CDP. Requires a one-time login in the browser; no API keys needed.

Replaces reliance on X's official API by using real browser sessions with existing login credentials, avoiding API rate limits and key management.

When to Use It

  • Post a tweet with optional image attachment from a script
  • Reply to a specific tweet with text and optional image
  • Quote-retweet a tweet with your own commentary
  • Publish an X Premium article with title, body, and cover image
  • Automate multi-account X posting using separate Chromium profiles and ports
  • Dry-run test tweet or reply content before sending

Install

$ openclaw skills install @stwith/x-cdp

X CDP Skill — Browser Automation for X (Twitter)

First-Time Setup

Run the setup wizard. It checks everything and auto-fixes what it can:

node scripts/setup.js [--port 18802] [--profile ~/chromium-profiles/x-cdp]

The wizard does 4 things:

  1. Finds Chromium/Chrome on your system (or tells you how to install it)
  2. Checks puppeteer-core (auto-installs to /tmp/node_modules if missing)
  3. Launches Chromium with CDP enabled on the specified port
  4. Verifies X login (tells you to log in manually if needed)

Manual setup (if you prefer)

Install Chromium (recommended over Chrome for version stability):

# macOS
brew install --cask chromium

# Linux
sudo apt install chromium-browser

Install puppeteer-core:

cd /tmp && npm init -y && npm install puppeteer-core

Launch Chromium with CDP:

chromium --remote-debugging-port=18802 --user-data-dir=~/chromium-profiles/x-cdp --no-first-run

Log in to X: Open x.com in the Chromium window and log in once. The session persists in the profile directory.

Why Chromium, not Chrome?

Chrome auto-updates silently. One update can change DOM selectors and break all automation overnight. Chromium lets you pin a known-good version. That said, Chrome works fine too if you don't mind occasional breakage.

Architecture

All scripts connect to a running Chromium instance via CDP (Chrome DevTools Protocol). This is not API-based. It drives the real browser UI, identical to a human clicking.

Multi-account isolation

Each X account gets its own Chromium instance with a separate port and profile:

  • Port 18800, profile chromium-profiles/main: @your_main_account
  • Port 18801, profile chromium-profiles/second: @your_second_account
  • Port 18802, profile chromium-profiles/third: @your_third_account

Launch multiple instances for multi-account use. All scripts accept --port to target a specific account.

Commands

Post a tweet

NODE_PATH=/tmp/node_modules node scripts/post-tweet.js "Hello world" [--image /path/to/img.png] [--port 18802] [--dry-run]

Reply to a tweet

NODE_PATH=/tmp/node_modules node scripts/reply-tweet.js <tweet_url> "Nice post!" [--image /path/to/img.png] [--port 18802] [--dry-run]

Quote retweet

NODE_PATH=/tmp/node_modules node scripts/quote-tweet.js <tweet_url> "My thoughts" [--port 18802] [--dry-run]

Publish an article (X Premium)

NODE_PATH=/tmp/node_modules node scripts/post-article.js --title "Title" --body "Body text" [--body-file /path/to/content.md] [--cover /path/to/cover.jpg] [--port 18800] [--dry-run]

All scripts support --dry-run to fill content without sending. A screenshot is saved to /tmp/.

Agent Integration

When the user asks to interact with X:

Pre-flight check

Before running any script, verify the environment:

  1. Check if Chromium is running on the target port: curl -s http://localhost:<port>/json/version
  2. If not running, run node scripts/setup.js --port <port> to launch and configure
  3. If setup fails, report the specific step that failed

Compose flow

  1. User provides intent (e.g., "reply to this tweet saying thanks")
  2. Agent drafts the text, shows it to user for approval
  3. On confirmation, run the script via exec
  4. Report success/failure

Error recovery

If a script fails with "not found" errors, X may have changed its DOM. Check and update:

  • references/selectors.md for the latest selectors
  • scripts/lib/cdp-utils.js SELECTORS object

Risk Notes

  • Rate limiting: Space out actions. No more than ~10 tweets/hour.
  • Detection: CDP automation looks like real browser usage. Much harder to detect than API abuse.
  • Account safety: Human-like delays are built into all scripts. Avoid bulk operations.
  • vs API tools (bird etc.): API wrappers get DMCA'd or break on API changes. CDP works as long as the website works.

Top skills in this category

Agent Browser

@matrixy

Headless browser automation CLI optimized for AI agents with accessibility tree snapshots and ref-based element selection

459156k

Browser Use

@shawnpana

Automates browser interactions for web testing, form filling, screenshots, and data extraction. Use when the user needs to navigate websites, interact with w...

11575k

Playwright MCP

@spiceman161

Browser automation via Playwright MCP server. Navigate websites, click elements, fill forms, extract data, take screenshots, and perform full browser automation workflows.

15946k

Playwright (Automation + MCP + Scraper)

@ivangdavila

Automates, tests, and debugs browsers with Playwright: locators, auto-waiting, traces, CI runs, and MCP browser control. Use when a test is flaky, times out, or fails only in CI or headless; when a locator matches multiple elements or the wrong one (strict mode violation); when clicks need force, waits become sleeps, or networkidle never settles; for storageState and login setup, request mocking and HAR replay, uploads and downloads, iframes and shadow DOM, popups and dialogs, screenshot diffs that change per machine, trace and report artifacts, sharding a slow suite, device and permission emulation, accessibility checks, driving a real browser through Playwright MCP, extracting data from JS-rendered pages, or porting a Cypress, Puppeteer, or Selenium suite to Playwright. Not for maintaining an existing Cypress or Puppeteer suite (cypress, puppeteer) or for work a plain HTTP request answers (http).

12941k

Browser Automation

@peytoncasper

Automate web browser interactions using natural language via CLI commands. Use when the user asks to browse websites, navigate web pages, extract data from websites, take screenshots, fill forms, click buttons, or interact with web applications.

6548k