1仕組みと動作原理
実装アプローチはローカルの実 Chrome を操作することです:Chrome 実行ファイルを探索 → デバッグポート付きインスタンス(独立プロファイル)を起動 → デバッグポートの待機完了を確認 → CDP WebSocket に接続 → 対象ページへアタッチ。
export async function launchChrome(url: string, profileDir: string, chromePathOverride?: string): Promise<number> {
自動化検知の回避はこの skill の明示的な設計事項です:SKILL.md の冒頭でセールスポイントとして記載されており、コード上でも Chrome の自動化特徴フラグが無効化されています。
extraArgs: ['--disable-blink-features=AutomationControlled', '--start-maximized'],
コンテンツ注入の第一手段は合成イベントではなく「実キーストロークによる貼り付け」であり、スクリプトの用途説明にもその理由が明記されています:Web サイトは CDP 合成イベントを検知して無視することがあるためです。
This bypasses CDP's synthetic events which websites can detect and ignore.
通常 Weibo のテキスト入力には CDP Input.insertText を使用し、失敗時は execCommand へフォールバックします。メディアアップロードはページの file input にファイルパスを直接渡し、blob:/data: のカウントで検証します。
await cdp.send('Input.insertText', { text }, { sessionId });
ヘッドライン記事は card.weibo.com の ProseMirror エディタを経由します:タイトル/導入文の入力 → HTML の貼り付け → 画像ごとに「画像コピー + 実貼り付けキー」でプレースホルダーを置換 → 残余プレースホルダーと画像数の検証。
// Method 1: Copy HTML to system clipboard, then real paste keystroke
プラットフォームの文字数制限はハードコードされており自動処理されます:タイトル 32 文字、導入文 44 文字で、超過時は句読点境界で切り詰めるか本文から再生成されます。
const TITLE_MAX_LENGTH = 32;
起動済みのデバッグ用 Chrome を引き継ぎ/再利用可能です:プロファイルディレクトリ + --remote-debugging-port でプロセス一覧と照合し、必要な場合のみ自身のプロファイルのインスタンスを終了します。
if (!line.includes(profileDir) || !line.includes('--remote-debugging-port=')) continue;
ログイン状態は永続化された Chrome プロファイルに保持され、初回に手動ログインを行えば長期的に再利用されます。スクリプトはページへの入力のみを担当し、投稿はユーザーが手動で確定します。
All scripts only fill content into the browser, user must review and publish manually
2コア機能
3外部依存関係
| Kind | Dependency / Endpoint |
|---|---|
| network | 浏览器访问 weibo.com 与 card.weibo.com(发帖与头条文章编辑器) |
| network | 头条文章编辑器入口 |
| cli | 本地 Chrome/Chromium(--remote-debugging-port + --user-data-dir,带 AutomationControlled 关闭参数) |
| cli | 粘贴按键注入工具(macOS osascript / Linux xdotool 或 ydotool / Windows powershell.exe) |
| cli | 剪贴板工具(macOS swift 临时脚本 / Linux wl-copy 或 xclip / Windows PowerShell) |
| cli | ps(进程枚举,用于复用/清理调试 Chrome) |
| package | baoyu-chrome-cdp(npm,仓库 packages/ 内共享包:CDP 连接、Chrome 查找与启动、按键/剪贴板基础件) |
| package | baoyu-md(npm,仓库 packages/ 内共享包:Markdown → HTML,供头条文章使用) |
| cli | bun(内部以 npx -y bun 调起同目录辅助脚本) |
4推奨統制措置と判定根拠
- SKILL.md / 脚本: 未公開またはリバースエンジニアリングされた非公開 API の呼び出し / クライアント識別子の偽装
- SKILL.md / 脚本参数: 自動化検知の回避、ホストサンドボックスの無効化、または SSL 証明書検証のスキップを含む
- SKILL.md / 会话存储: ブラウザのユーザーログイン状態およびセッション Cookie の読み取りまたは再利用
- scripts/: ローカルスクリプトまたはコマンドの実行: bun {baseDir}/scripts/weibo-post.ts <text> --image/--video …
- 外部 API: 外部プラットフォームに対する投稿、リソース作成または変更の書き込み
- 本地工作目录: ファイルの読み書きおよびアーティファクトの出力: Chrome プロファイルディレクトリ(デフォルトの baoyu-skills/chrome-profile 構成、ログイン状態およびブラウザデータの永続化)
5二重目の独立検証
- [ok] 反自动化检测绕过(判红主因) — 三处证据互相印证:SKILL.md 'bypasses anti-bot detection';weibo-utils.ts `extraArgs: ['--disable-blink-features=AutomationControlled', '--start-maximized'],`(launchChrome 传给 launchChromeBase);paste-from-clipboard.ts 'This bypasses CDP's synthetic events which websites can detect and ignore.'
- [ok] 真实按键是第一手段而非兜底 — weibo-article.ts 注释排序为 '// Method 1: Copy HTML to system clipboard, then real paste keystroke',失败后才走 DataTransfer paste 事件;图片替换循环直接 pasteFromClipboard('Google Chrome', 5, 1000)。
- [ok] 凭证面确认(无密钥读取,靠 profile 会话) — 全目录 process.env/API_KEY/TOKEN/SECRET/.env 扫描零命中;SKILL.md 说明登录态由 Chrome profile 持久化(First run: log in to Weibo manually (session saved)),EXTEND.md 仅支持默认 profile 一项。
- [ok] 外部端点仅微博自家域名 — grep https:// 命中 WEIBO_HOME_URL=https://weibo.com/ 与 WEIBO_ARTICLE_URL=https://card.weibo.com/article/v3/editor,另有一处仅作日志措辞的 'src: https://...';无第三方 API/CDN。
- [ok] 平台限制与自检 — MAX_FILES=18、TITLE_MAX_LENGTH=32、SUMMARY_MAX_LENGTH=44 均在源码;SKILL.md 的 Post-Composition Check(剩余 WBIMGPH_ 占位符、预期 vs 实际图片数)与代码校验逻辑一致。
- [ok] 进程清理不会误杀用户浏览器 — killChromeByProfile 只对同时包含 profileDir 与 '--remote-debugging-port=' 的行取 pid 并 SIGTERM;SKILL.md 用 CRITICAL 明确禁止 `pkill -f "Google Chrome"`。
- [ok] 无其他安全降级 — grep no-sandbox / rejectUnauthorized / --insecure / NODE_TLS_REJECT / disable-web-security 零命中;Chrome 参数仅为调试端口、profile、AutomationControlled 与最大化窗口。
- [ok] 元数据(license/stars/commit) — git HEAD=1567581c26ec29f4216c6e6835415bf30343b0e3;仓库根 LICENSE=MIT(Copyright (c) 2026 Jim Liu);GitHub API stars=25926、pushed_at=2026-09-10T15:13:43Z。
6結論
5673e558aeace4cc…