x 集成
- 作者仓库星标 0
- 作者仓库 nano-core
X (Twitter) Integration
Browser automation for X interactions via WhatsApp.
Compatibility: FFT_nano v1.0.0. Directory structure may change in future versions.
Features
| Action | Tool | Description |
|---|---|---|
| Post | x_post |
Publish new tweets |
| Like | x_like |
Like any tweet |
| Reply | x_reply |
Reply to tweets |
| Retweet | x_retweet |
Retweet without comment |
| Quote | x_quote |
Quote tweet with comment |
Prerequisites
Before using this skill, ensure:
- FFT_nano is installed and running - WhatsApp connected, service active
- Dependencies installed:
npm ls playwright dotenv-cli || npm install playwright dotenv-cli - CHROME_PATH configured in
.env(if Chrome is not at default location):# Find your Chrome path mdfind "kMDItemCFBundleIdentifier == 'com.google.Chrome'" 2>/dev/null | head -1 # Add to .env CHROME_PATH=/path/to/Google Chrome.app/Contents/MacOS/Google Chrome
Quick Start
# 1. Setup authentication (interactive)
npx dotenv -e .env -- npx tsx .claude/skills/x-integration/scripts/setup.ts
# Verify: data/x-auth.json should exist after successful login
# 2. Rebuild container to include skill
./container/build.sh
# Verify: Output shows "COPY .claude/skills/x-integration/agent.ts"
# 3. Rebuild host and restart service
npm run build
launchctl kickstart -k gui/$(id -u)/com.fft_nano
# Verify: launchctl list | grep fft_nano shows PID and exit code 0
Configuration
Environment Variables
| Variable | Default | Description |
|---|---|---|
CHROME_PATH |
/Applications/Google Chrome.app/Contents/MacOS/Google Chrome |
Chrome executable path |
FFT_NANO_ROOT |
process.cwd() |
Project root directory |
LOG_LEVEL |
info |
Logging level (debug, info, warn, error) |
Set in .env file (loaded via dotenv-cli at runtime):
# .env
CHROME_PATH=/Applications/Google Chrome.app/Contents/MacOS/Google Chrome
Configuration File
Edit lib/config.ts to modify defaults:
export const config = {
// Browser viewport
viewport: { width: 1280, height: 800 },
// Timeouts (milliseconds)
timeouts: {
navigation: 30000, // Page navigation
elementWait: 5000, // Wait for element
afterClick: 1000, // Delay after click
afterFill: 1000, // Delay after form fill
afterSubmit: 3000, // Delay after submit
pageLoad: 3000, // Initial page load
},
// Tweet limits
limits: {
tweetMaxLength: 280,
},
};
Data Directories
Paths relative to project root:
| Path | Purpose | Git |
|---|---|---|
data/x-browser-profile/ |
Chrome profile with X session | Ignored |
data/x-auth.json |
Auth state marker | Ignored |
logs/fft_nano.log |
Service logs (contains X operation logs) | Ignored |
Architecture
┌─────────────────────────────────────────────────────────────┐
│ Container (Linux VM) │
│ └── agent.ts → MCP tool definitions (x_post, etc.) │
│ └── Writes IPC request to /workspace/ipc/tasks/ │
└──────────────────────┬──────────────────────────────────────┘
│ IPC (file system)
▼
┌─────────────────────────────────────────────────────────────┐
│ Host (macOS) │
│ └── src/index.ts → processTaskIpc() │
│ └── host.ts → handleXIpc() │
│ └── spawn subprocess → scripts/*.ts │
│ └── Playwright → Chrome → X Website │
└─────────────────────────────────────────────────────────────┘
Why This Design?
- API is expensive - X official API requires paid subscription ($100+/month) for posting
- Bot browsers get blocked - X detects and bans headless browsers and common automation fingerprints
- Must use user's real browser - Reuses the user's actual Chrome on Host with real browser fingerprint to avoid detection
- One-time authorization - User logs in manually once, session persists in Chrome profile for future use
File Structure
.claude/skills/x-integration/
├── SKILL.md # This documentation
├── host.ts # Host-side IPC handler
├── agent.ts # Container-side MCP tool definitions
├── lib/
│ ├── config.ts # Centralized configuration
│ └── browser.ts # Playwright utilities
└── scripts/
├── setup.ts # Interactive login
├── post.ts # Post tweet
├── like.ts # Like tweet
├── reply.ts # Reply to tweet
├── retweet.ts # Retweet
└── quote.ts # Quote tweet
Integration Points
To integrate this skill into FFT_nano, make the following modifications:
1. Host side: src/index.ts
Add import after other local imports (look for import { loadJson, saveJson, acquirePidLock } from './utils.js';):
import { handleXIpc } from '../.claude/skills/x-integration/host.js';
Modify processTaskIpc function's switch statement default case:
// Find:
default:
logger.warn({ type: data.type }, 'Unknown IPC task type');
// Replace with:
default:
const handled = await handleXIpc(data, sourceGroup, isMain, DATA_DIR);
if (!handled) {
logger.warn({ type: data.type }, 'Unknown IPC task type');
}
2. Container side: container/agent-runner/src/ipc-mcp.ts
Add import after cron-parser import:
// @ts-ignore - Copied during Docker build from .claude/skills/x-integration/
import { createXTools } from './skills/x-integration/agent.js';
Add to the end of tools array (before the closing ]):
...createXTools({ groupFolder, isMain })
3. Build script: container/build.sh
Change build context from container/ to project root (required to access .claude/skills/):
# Find:
container build -t "${IMAGE_NAME}:${TAG}" .
# Replace with:
cd "$SCRIPT_DIR/.."
container build -t "${IMAGE_NAME}:${TAG}" -f container/Dockerfile .
4. Dockerfile: container/Dockerfile
First, update the build context paths (required to access .claude/skills/ from project root):
# Find:
COPY agent-runner/package*.json ./
...
COPY agent-runner/ ./
# Replace with:
COPY container/agent-runner/package*.json ./
...
COPY container/agent-runner/ ./
Then add COPY line after COPY container/agent-runner/ ./ and before RUN npm run build:
# Copy skill MCP tools
COPY .claude/skills/x-integration/agent.ts ./src/skills/x-integration/
Setup
All paths below are relative to project root (FFT_NANO_ROOT).
1. Check Chrome Path
# Check if Chrome exists at configured path
cat .env | grep CHROME_PATH
ls -la "$(grep CHROME_PATH .env | cut -d= -f2)" 2>/dev/null || \
echo "Chrome not found - update CHROME_PATH in .env"
2. Run Authentication
npx dotenv -e .env -- npx tsx .claude/skills/x-integration/scripts/setup.ts
This opens Chrome for manual X login. Session saved to data/x-browser-profile/.
Verify success:
cat data/x-auth.json # Should show {"authenticated": true, ...}
3. Rebuild Container
./container/build.sh
Verify success:
./container/build.sh 2>&1 | grep -i "agent.ts" # Should show COPY line
4. Restart Service
npm run build
launchctl kickstart -k gui/$(id -u)/com.fft_nano
Verify success:
launchctl list | grep fft_nano # Should show PID and exit code 0 or -
Usage via WhatsApp
Replace @Assistant with your configured trigger name (ASSISTANT_NAME in .env):
@Assistant post a tweet: Hello world!
@Assistant like this tweet https://x.com/user/status/123
@Assistant reply to https://x.com/user/status/123 with: Great post!
@Assistant retweet https://x.com/user/status/123
@Assistant quote https://x.com/user/status/123 with comment: Interesting
Note: Only the main group can use X tools. Other groups will receive an error.
Testing
Scripts require environment variables from .env. Use dotenv-cli to load them:
Check Authentication Status
# Check if auth file exists and is valid
cat data/x-auth.json 2>/dev/null && echo "Auth configured" || echo "Auth not configured"
# Check if browser profile exists
ls -la data/x-browser-profile/ 2>/dev/null | head -5
Re-authenticate (if expired)
npx dotenv -e .env -- npx tsx .claude/skills/x-integration/scripts/setup.ts
Test Post (will actually post)
echo '{"content":"Test tweet - please ignore"}' | npx dotenv -e .env -- npx tsx .claude/skills/x-integration/scripts/post.ts
Test Like
echo '{"tweetUrl":"https://x.com/user/status/123"}' | npx dotenv -e .env -- npx tsx .claude/skills/x-integration/scripts/like.ts
Or export CHROME_PATH manually before running:
export CHROME_PATH="/path/to/chrome"
echo '{"content":"Test"}' | npx tsx .claude/skills/x-integration/scripts/post.ts
Troubleshooting
Authentication Expired
npx dotenv -e .env -- npx tsx .claude/skills/x-integration/scripts/setup.ts
launchctl kickstart -k gui/$(id -u)/com.fft_nano
Browser Lock Files
If Chrome fails to launch:
rm -f data/x-browser-profile/SingletonLock
rm -f data/x-browser-profile/SingletonSocket
rm -f data/x-browser-profile/SingletonCookie
Check Logs
# Host logs (relative to project root)
grep -i "x_post\|x_like\|x_reply\|handleXIpc" logs/fft_nano.log | tail -20
# Script errors
grep -i "error\|failed" logs/fft_nano.log | tail -20
Script Timeout
Default timeout is 2 minutes (120s). Increase in host.ts:
const timer = setTimeout(() => {
proc.kill('SIGTERM');
resolve({ success: false, message: 'Script timed out (120s)' });
}, 120000); // ← Increase this value
X UI Selector Changes
If X updates their UI, selectors in scripts may break. Current selectors:
| Element | Selector |
|---|---|
| Tweet input | [data-testid="tweetTextarea_0"] |
| Post button | [data-testid="tweetButtonInline"] |
| Reply button | [data-testid="reply"] |
| Like | [data-testid="like"] |
| Unlike | [data-testid="unlike"] |
| Retweet | [data-testid="retweet"] |
| Unretweet | [data-testid="unretweet"] |
| Confirm retweet | [data-testid="retweetConfirm"] |
| Modal dialog | [role="dialog"][aria-modal="true"] |
| Modal submit | [data-testid="tweetButton"] |
Container Build Issues
If MCP tools not found in container:
# Verify build copies skill
./container/build.sh 2>&1 | grep -i skill
# Check container has the file
container run fft_nano-agent ls -la /app/src/skills/
Security
data/x-browser-profile/- Contains X session cookies (in.gitignore)data/x-auth.json- Auth state marker (in.gitignore)- Only main group can use X tools (enforced in
agent.tsandhost.ts) - Scripts run as subprocesses with limited environment
- 流狐分类
- 写作
- 作者声明 Agent
- 未找到明确声明;不据此推断已兼容或已测试
- 静态检查
- 88 / 100 · 启发式扫描,不代表运行安全
- 作者 / 版本 / 许可
- @0-CYBERDYNE-SYSTEMS-0 · 未声明 license
- 流狐 Token 估算
- 低消耗
- 流狐接入估算
- 需手动接入
- 是否需要外部 API Key
- 未发现要求
- 检测到的系统要求
- macOS · Linux · Docker
- 底层运行要求
- Docker
- 检测到的文件与系统行为
-
- 只读
- 允许写入 / 修改
- Shell 执行
- 读取环境变量
- 检测到的网络行为
- 仅限本地
- 安装命令数
- 无(仅作为资料)
档案由构建时根据 SKILL.md 与安装命令自动衍生,可能与作者实际意图存在差异。
需要注意: 未限定 allowed-tools,默认拥有全部工具权限。
作者没有在当前 SKILL.md 中定义固定输出样例。 Action · Tool · Description Post · xpost · Publish new tweets Like · xlike · Like any tweet
Before using this skill, ensure: FFTnano is installed and running - WhatsApp connected, service active Dependencies installed:
Quick Start
Configuration
Variable · Default · Description CHROMEPATH · /Applications/Google Chrome.app/Contents/MacOS/Google Chrome · Chrome executable path FFTNANOROOT · process.cwd() · Project root directory
Edit lib/config.ts to modify defaults:
# X (Twitter) Integration
Browser automation for X interactions via WhatsApp.
> **Compatibility:** FFT_nano v1.0.0. Directory structure may change in future versions.
## Features
| Action | Tool | Description |
|--------|------|-------------|
| Post | `x_post` | Publish new tweets |
| Like | `x_like` | Like any tweet |
| Reply | `x_reply` | Reply to tweets |
| Retweet | `x_retweet` | Retweet without comment |
| Quote | `x_quote` | Quote tweet with comment |
## Prerequisites
Before using this skill, ensure:
1. **FFT_nano is installed and running** - WhatsApp connected, service active
2. **Dependencies installed**:
```bash
npm ls playwright dotenv-cli || npm install playwright dotenv-cli
```
3. **CHROME_PATH configured** in `.env` (if Chrome is not at default location):
```bash
# Find your Chrome path
mdfind "kMDItemCFBundleIdentifier == 'com.google.Chrome'" 2>/dev/null | head -1
# Add to .env
CHROME_PATH=/path/to/Google Chrome.app/Contents/MacOS/Google Chrome
```
## Quick Start
```bash
# 1. Setup authentication (interactive)
npx dotenv -e .env -- npx tsx .claude/skills/x-integration/scripts/setup.ts
# Verify: data/x-auth.json should exist after successful login
# 2. Rebuild container to include skill
./container/build.sh
# Verify: Output shows "COPY .claude/skills/x-integration/agent.ts"
# 3. Rebuild host and restart service
npm run build
launchctl kickstart -k gui/$(id -u)/com.fft_nano
# Verify: launchctl list | grep fft_nano shows PID and exit code 0
```
## Configuration
### Environment Variables
| Variable | Default | Description |
|----------|---------|-------------|
| `CHROME_PATH` | `/Applications/Google Chrome.app/Contents/MacOS/Google Chrome` | Chrome executable path |
… 作者原文负责流程事实;流狐只索引当前章节、要点、文件与命令。
章节 -> Features → Prerequisites → Quick Start → Configuration → Environment Variables → Configuration File
要点 -> Compatibility · FFTnano is installed and running · Dependencies installed · CHROMEPATH configured · API is expensive · Bot browsers get blocked · Must use user's real browser · One-time authorization
文件/命令 -> xpost · xlike · xreply · xretweet · xquote · .env · CHROMEPATH · /Applications/Google Chrome.app/Contents/MacOS/Google Chrome
内容 SHA-256 -> e42f08fb4ade
方法与流程
适用与边界
原文中的明确线索
xpost、xlike、xreply、xretweet、xquote、.env、CHROMEPATH、/Applications/Google Chrome.app/Contents/MacOS/Google Chrome