1仕組みと動作原理
PlaywrightやPuppeteerを使用せず、実機ChromeをCDP接続で駆動することで、X側からは通常のブラウザセッションに見えるようにします。スクリプトは実際のUIへのコンテンツ入力のみを担当し、投稿アクションはユーザーの手動操作または--submitフラグに委ねます。
Uses real Chrome with CDP to bypass anti-automation.
画像添付の第一手段はCDPの合成イベントではなく、システムレベルの実際のCmd+Vキー押下です。画像をまずシステムクリップボードに書き込み、osascript/xdotool/ydotool経由でChromeウィンドウにペースト入力を送信し、CDP合成イベントはフォールバックとしてのみ使用します。
Sends real Cmd+V keystroke to Chrome, bypassing CDP's synthetic events that X can detect
通常投稿、動画、引用、長文記事の4つのルートはすべて同一のChrome層を共有します。デバッグポートの解決・再利用、共有プロファイル、execCommand('insertText')またはInput.insertTextによるテキスト注入、DOM.setFileInputFilesによる直接ファイルパス指定でのアップロードを行います。
const X_COMPOSE_URL = 'https://x.com/compose/post';
投稿はデフォルトで非自動化されています。スクリプトはコンテンツを入力した後に停止し、ユーザーに手動での投稿クリックを促します。明示的に--submitが指定された場合のみtweetButtonやpublishButtonをクリックします。
Post composed. Please review and click the publish button in the browser.
認証情報はXのセッションCookieに依存します。CDPのNetwork.getCookies経由でx.com/twitter.comのCookieを読み取り、auth_tokenとct0の存在のみをアサートします(値の出力やファイル保存は行いません)。認証ストアは共有Chromeプロファイル自体となります。
const REQUIRED_X_SESSION_COOKIES = ['auth_token', 'ct0'] as const;
既に実行中のChromeインスタンスの再利用が設計に含まれています。まずps auxをスキャンして同一プロファイルおよび--remote-debugging-portを持つプロセスを検索し、検出された場合は新規起動せずにそのインスタンスに接続します。
line.includes(options.profileDir) && line.includes("--remote-debugging-port=")
マルチプラットフォーム向けのクリップボードおよびキー押下のアダプタが組み込まれています。macOSではインラインSwift/AppKitでクリップボード書き込みを行いosascriptでキー送信、Linuxではwl-copy/xclip + xdotool/ydotool、WindowsではPowerShell STAおよびSendKeysを使用します。
await runCommand('swift', [swiftPath, 'image', imagePath]);
アクティブな事前検証スクリプトが付属しています。Chrome、プロファイル分離、bun、アクセシビリティ権限、クリップボードの往復整合性、ペーストキー送信能力、実行中Chromeとの競合をチェックし、失敗時は終了コード1で終了します。
Checks: Chrome, profile isolation, Bun, Accessibility, clipboard, paste keystroke, Chrome conflicts.
2コア機能
3外部依存関係
| Kind | Dependency / Endpoint |
|---|---|
| cli | npx -y bun(跑同目录兄弟脚本与自身) |
| cli | osascript(macOS:激活 Chrome、发送 Cmd+V) |
| cli | swift(macOS:编译内联 AppKit 剪贴板源码) |
| cli | xdotool / ydotool(Linux X11/Wayland 粘贴键) |
| cli | powershell.exe / cmd.exe / wslpath(Windows 与 WSL 路径与键击) |
| cli | ps aux / pgrep / which / where(进程与工具探测) |
| cli | 真实 Chrome/Chromium/Edge 二进制(以 CDP 参数启动) |
| network | X 发帖页与长文编辑器 |
| network | 本地 Chrome DevTools 端点(HTTP 探测 + WebSocket CDP) |
| network | markdown 里引用的任意 http(s) 图片会被下载到本地临时目录(经 baoyu-md) |
| package | baoyu-chrome-cdp / baoyu-md / front-matter / highlight.js / marked / remark-* / unified(scripts/package.json 声明) |
4推奨統制措置と判定根拠
- SKILL.md / 脚本: 未公開またはリバースエンジニアリングされたプライベートAPIの呼び出し / クライアント識別子の偽装
- SKILL.md / 脚本参数: 自動化検出の回避、ホストサンドボックスの無効化、またはSSL証明書検証のスキップ
- SKILL.md / 会话存储: ブラウザのユーザーログイン状態およびセッションCookieの読み取り・再利用
- 本地凭据 / 浏览器配置: ユーザーログインCookie/セッション/キーチェーンの読み取り: CDP Network.getCookies経由でx.com/twitter.comのセッションCookieを読み取り、auth_tokenとct0を検証
- scripts/: ローカルスクリプトまたはコマンドの実行: ${BUN_X} {baseDir}/scripts/x-browser.ts|x-video.ts|x-quote.ts|x-article.ts
- 网络端点: 外部ネットワークアクセスの宣言: https://x.com/compose/post および https://x.com/compose/articles(実ブラウザでのページ遷移)
- 本地工作目录: ファイル読み書きおよびアーティファクト出力: $TMPDIR/x-article-content.html(長文本体HTML)および $TMPDIR/x-article-images(本文画像用一時ディレクトリ)
5二重目の独立検証
- [ok] 反自动化侦测的绕过(判红主因) — README 'bypass anti-automation' + regular-posts.md 的 Cmd+V/合成事件两段 + paste-from-clipboard.ts 顶部注释互相印证;x-browser.ts 里 pasteFromClipboard('Google Chrome', 5, 500) 为首选,CDP 键事件为 fallback。
- [ok] cookie 面边界:只经 CDP 读、不落盘 — x-utils.ts 经 Network.getCookies 取 x.com/twitter.com cookie 并在内存构建 map,仅断言 auth_token/ct0 存在;全目录 grep 未发现写入 cookie 文件或读取 Cookies SQLite('Cookies' 只出现在单测字面量里)。
- [ok] 接管已运行调试会话 — packages/baoyu-chrome-cdp 通过 ps aux 匹配 profileDir + --remote-debugging-port 找端口并连接;x-utils.ts 也自行 spawnSync('ps', ['aux']) 做占用判定。
- [ok] 发布动作默认关闭 — tweetButton/publishButton 的 click 都包在 --submit 分支内;未提交时脚本打印提示让用户自己在浏览器点发布;SKILL.md 另有『必须当轮明确确认』的硬规则。
- [ok] 进程级动作(pkill) — SKILL.md 第 321 行给出 pkill -f "Chrome.*remote-debugging-port" …; sleep 2 的清理配方;该命令不在任何 TS 脚本内,需由 agent 执行——已写入 security.scripts_executed 与 risks。
- [discrepancy] 文档与实现不一致(--disable-blink-features) — references/regular-posts.md 宣称 CDP 路线会用 --disable-blink-features=AutomationControlled 启动 Chrome,但 x-utils.ts 只传 extraArgs: ['--start-maximized'];该参数仅出现在 packages/baoyu-chrome-cdp/src/mermaid.ts 的无头渲染启动里。故『绕过』的实际手段是真实键击 + 真实浏览器,而非该启动参数。
- [ok] 单测是否触碰网络/浏览器 — x-utils.test.ts 与 md-to-html.test.ts 均为纯函数/临时目录测试(锁文件判定、启动重试判定、cookie map、markdown 解析),无网络、无 Chrome 启动。
- [ok] 档位复核(批4 终裁) — 按 Main 终裁与范式红档『反反爬/绕过』字面命中判 red(撤回先前的 orange);同时保留可减轻情节的说明:无 TLS/沙箱降级、无未转义插值、cookie 不落盘、发布默认关闭。
6結論
83fb7a73416e3fe3…