| name | actionbook |
| description | MUST USE AUTOMATICALLY when user sends URLs from x.com, twitter.com, or any site that web_fetch fails on. Do NOT ask the user — just load this skill and use it. Browser automation and web scraping with anti-detection stealth mode. Capabilities: (1) Scrape Twitter/X content without login, (2) Extract data from anti-bot-protected websites, (3) Automate browser interactions (clicking, typing, screenshots), (4) Bypass JavaScript-rendered content that web_fetch cannot handle, (5) Access pages requiring cookies or sessions. Built on Chrome DevTools Protocol with fingerprint spoofing. |
| requires | {"bins":["actionbook"]} |
| permissions | {"network":{"allow":["*:443","*:80"]},"exec":["actionbook","sh"],"fs":{"read":["$SKILL_DIR/**"],"write":["$WORK_DIR/**"]}} |
Actionbook - Stealth Browser Automation
High-performance browser automation using your existing Chrome/Brave/Edge browser via Chrome DevTools Protocol (CDP). Zero downloads, anti-detection built-in.
⚡ Auto-Trigger Rules (READ FIRST)
You MUST automatically use this skill — do NOT ask the user for permission — in these situations:
- URL contains
x.com or twitter.com → Always use actionbook with --stealth flag. Twitter blocks all non-browser access.
web_fetch returned an error or empty/useless content → Retry with actionbook. Many sites require JavaScript rendering.
- User asks to scrape, screenshot, or interact with a website → Use actionbook directly.
- URL points to a known JavaScript-heavy SPA (e.g., React/Angular dashboards, social media) → Prefer actionbook over web_fetch.
Workflow when auto-triggering:
- Load this skill via the
skill tool (to get full command reference)
- Use
actionbook --stealth browser open "<URL>" to open the page
- Use
actionbook browser wait if needed for dynamic content
- Extract content with
actionbook browser eval or actionbook browser snapshot
- Close the browser with
actionbook browser close when done
- Present the extracted content to the user
NEVER do these:
- Do NOT ask "Should I use actionbook?" — just use it when triggers match
- Do NOT try
web_fetch first for Twitter/X links — it will always fail
- Do NOT forget
--stealth flag for Twitter/X — it will be detected as a bot without it
Core Capabilities
1. Twitter/X Scraping (No Login Required)
Extract tweets, profiles, and timelines using stealth mode to bypass anti-bot detection:
actionbook --stealth browser open "https://x.com/username/status/123456789"
actionbook browser eval 'document.body.innerText'
actionbook browser screenshot tweet.png
When to use: Twitter blocks web_fetch and requires JavaScript rendering. Actionbook's stealth mode bypasses detection.
2. JavaScript-Heavy Websites
Handle single-page apps (SPAs) and dynamic content that web_fetch cannot parse:
actionbook browser goto "https://example.com/dashboard"
actionbook browser wait '[data-loaded="true"]'
actionbook browser eval 'JSON.stringify(window.appState)'
3. Interactive Automation
Automate form filling, clicking, and multi-step workflows:
actionbook browser type 'input[name="q"]' "OpenClaw"
actionbook browser click 'button[type="submit"]'
actionbook browser wait '.results'
actionbook browser eval 'document.querySelector(".results").innerText'
4. Session & Cookie Management
Maintain login state across requests using profiles:
actionbook profile create twitter-session
actionbook --profile twitter-session browser open "https://x.com"
actionbook --profile twitter-session browser goto "https://x.com/home"
Quick Reference
Essential Commands
actionbook browser open <URL>
actionbook browser goto <URL>
actionbook browser close
actionbook browser eval <JS>
actionbook browser snapshot
actionbook browser screenshot [PATH]
actionbook browser click <SELECTOR>
actionbook browser type <SELECTOR> <TEXT>
actionbook browser wait <SELECTOR>
actionbook browser cookies list
actionbook browser cookies get <NAME>
actionbook browser cookies set <NAME> <VAL>
Global Flags
--stealth
--stealth-os <OS>
--stealth-gpu <GPU>
--profile <NAME>
--headless
Workflow Patterns
Pattern 1: Twitter Content Extraction
actionbook --stealth browser open "https://x.com/elonmusk"
actionbook browser wait '[data-testid="primaryColumn"]'
actionbook browser eval '
Array.from(document.querySelectorAll("[data-testid=\"tweetText\"]"))
.map(el => el.innerText)
.join("\n\n---\n\n")
'
actionbook browser screenshot timeline.png
actionbook browser close
Pattern 2: Form Submission with Retry
actionbook browser type '#email' "user@example.com"
actionbook browser type '#password' "secret"
actionbook browser click 'button[type="submit"]'
actionbook browser wait '.dashboard'
actionbook browser eval 'document.querySelector(".welcome-message").innerText'
Pattern 3: Persistent Session (Login Once, Reuse)
actionbook profile create my-service
actionbook --profile my-service browser open "https://service.com/login"
actionbook --profile my-service browser goto "https://service.com/dashboard"
actionbook --profile my-service browser eval 'getUserData()'
Stealth Mode Details
Stealth mode applies anti-detection measures:
- Navigator overrides (
navigator.webdriver → undefined)
- WebGL fingerprint spoofing (matches selected GPU)
- Plugin injection (fake PDF viewer, Native Client)
- Chrome flags (
--disable-blink-features=AutomationControlled)
Available OS profiles: macos-arm, macos-intel, windows, linux
Available GPU profiles: apple-m4-max, rtx4080, gtx1660, intel-uhd630
Example:
actionbook --stealth --stealth-os windows --stealth-gpu rtx4080 browser open "https://bot-check.com"
Troubleshooting
"Element not found"
Wait for page to fully load:
actionbook browser wait '[data-testid="tweet"]'
actionbook browser eval 'document.querySelector("[data-testid=\"tweet\"]").innerText'
"Connection refused" or "CDP not ready"
Browser didn't start cleanly. Restart:
actionbook browser close
actionbook browser open "https://example.com"
Twitter shows "Log in to see more"
Use --stealth flag and consider creating a logged-in profile:
actionbook --stealth browser open "https://x.com/..."
actionbook profile create twitter-main
actionbook --profile twitter-main browser open "https://x.com"
Extracting data from deeply nested elements
Use browser eval with JavaScript:
actionbook browser eval '
const tweets = document.querySelectorAll("[data-testid=\"tweetText\"]");
Array.from(tweets).map(t => ({
text: t.innerText,
author: t.closest("article")?.querySelector("[data-testid=\"User-Name\"]")?.innerText
}))
'
Installation
Ensure actionbook is in your PATH. The skill declares requires.bins: [actionbook] and will not activate if the binary is missing.
Resources
scripts/
fetch_tweet.sh - Simplified wrapper for extracting Twitter content
references/
commands.md - Complete command reference
selectors.md - Common CSS selectors for popular sites