ホーム / 全スキル / コンテンツ制作 / baoyu-post-to-wechat
コンテンツ制作 · JimLiu/baoyu-skills

baoyu-post-to-wechat

APIまたはChrome CDPを介してWeChat公式アカウント(微信公众号)にコンテンツを投稿します。HTML、Markdown、プレーンテキスト入力による記事投稿(文章)および複数画像による画像テキスト投稿(贴图、旧・图文)をサポートします。Markdown記事ワークフローでは、WeChat向け出力として通常の外部リンクをデフォルトで文末の引用文献に変換します。ユーザーが「发布公众号」、「post to wechat」、「微信公众号」、または「贴图/图文/文章」に言及した際に使用します。

L5 厳格管理 · 隔離環境と厳格な監査V2 人間監査済リバースAPI規約/コンプライアンス認証情報/セッションコマンド実行ネットワーク通信ファイル書き込みDual-pass Audit
Author JimLiuGitHub JimLiu/baoyu-skills ↗Stars 25926License MIT(仓库根 LICENSE,Copyright (c) 2026 Jim Liu;GitHub API spdx_id=MIT)Commit 1567581c26
管理レベルは Skill の能力と推奨統制措置を示すものであり、品質や安全性の認証、利用可否の判定ではありません。使用の可否はユーザーおよび管理者が決定します。Agent 環境によって制約が異なるため、自動保護を仮定しないでください。第三者製 Skill の著作権は原著作者に帰属し、利用リスクは利用者が負います。

1仕組みと動作原理

3系統の投稿ルートが共存:公式API(高速・認証情報必須)、ブラウザCDP(低速・ログインセッションを再利用)、remote-api(ローカルレンダリング + ホワイトリスト登録サーバーIPから送信するためのSSH SOCKS5トンネル)。

skills/baoyu-post-to-wechat/SKILL.md
| `scripts/wechat-api.ts` | Article posting via API (文章) |
SKILL.mdのStep 2の表に、3つのルートの要件(API認証情報がIPホワイトリスト内にあるか、Chromeが必要か、SSH接続可能なサーバーが必要か)が記載されています。

認証情報の解決チェーンは明示的な複数ソースの優先順位を採用:EXTEND.mdのアカウントブロック → プレフィックス付き環境変数 → WECHAT_APP_ID/WECHAT_APP_SECRET(process.env、<cwd>/.baoyu-skills/.env、~/.baoyu-skills/.env)。

skills/baoyu-post-to-wechat/scripts/wechat-extend-config.ts
buildCredentialSource("process.env", process.env, "WECHAT_APP_ID", "WECHAT_APP_SECRET"),
不足している場合はエラーをスローして3種類の設定方法(EXTEND.md account / 環境変数 / .baoyu-skills/.env)を提示します。プレフィックス形式は複数アカウント用(accountsブロックでアカウントごとにapp_id/app_secretのセットを保持)です。

APIルートはWeChat公式の4ステップ手順に準拠:access_token取得 → uploadimg(本文画像) → material/add_material(カバー素材) → draft/add(下書き作成)。

skills/baoyu-post-to-wechat/scripts/wechat-api.ts
const DRAFT_URL = "https://api.weixin.qq.com/cgi-bin/draft/add";
SKILL.mdのdraft/add payload rulesに必須フィールド(article_type news/newspic、thumb_media_id、need_open_comment、only_fans_can_comment、任意のcontent_source_url)が明記されています。

本文画像にはWeChat側の厳格な制限があるため、スクリプトが事前にトランスコード/圧縮した上でアップロードし、マジックバイトを用いて宣言フォーマットと実際のフォーマットの不一致を補正します。

skills/baoyu-post-to-wechat/scripts/wechat-image-processor.ts
export const WECHAT_BODY_IMAGE_MAX_SIZE = 1024 * 1024; // 1MB
jimpおよび@jsquash/webp(wasmデコード)を使用。wechat-image-loader.tsにて、contentTypeが不一致の場合は実際の内容に基づいてファイル名とMIMEを修正します。

remote-apiの仕組みは、レンダリング、画像処理、下書きの組み立てをローカルで完結させ、api.weixin.qq.comへの送信HTTPSリクエストのみをSSHダイナミックポート転送(SOCKS5)経由で行います。

skills/baoyu-post-to-wechat/SKILL.md
are tunneled through an SSH SOCKS5 dynamic port forward (`ssh -N -D`)
実装面:wechat-remote-publish.tsが`-N -T -D 127.0.0.1:<port>`などのssh引数(-i 秘密鍵、KnownHosts、StrictHostKeyChecking、ConnectTimeout、-J 踏み台に対応)を組み立て、wechat-socks-http.tsがsocksパッケージ + tlsで送信リクエストを構築。SKILL.mdには`No files are written to the remote host; `AppSecret` never leaves the local process.`と記載されています。

ブラウザルートのログインセッションは永続化された共有Chromeプロファイルから取得され、起動引数でChromeの自動化検出フラグを強制的に無効化(--disable-blink-features=AutomationControlled)します(技術的なアンチ自動化検出回避の典型的な手法)。

skills/baoyu-post-to-wechat/scripts/cdp.ts
extraArgs: ['--disable-blink-features=AutomationControlled', '--start-maximized'],
launchChromeBaseは--remote-debugging-portおよび--user-data-dir(プロファイルのデフォルトはbaoyu-skills/chrome-profile、EXTEND.mdのchrome_profile_pathで上書き可能)も付与し、一度ログインすれば長期的な再利用が可能です。

同一ディレクトリに「実キー入力貼り付け」ヘルパーも同梱されており、Webサイトが検知可能な合成イベントの回避を目的とすることが明記されています。

skills/baoyu-post-to-wechat/scripts/paste-from-clipboard.ts
This bypasses CDP's synthetic events which websites can detect and ignore.
範囲の説明:本コミットでは、wechat-browser.ts / wechat-article.tsの実処理はCDPのInput.dispatchKeyEventを用いて貼り付けキーを送信しています(wechat-article.tsのpasteInEditor/sendPaste)。このOSレベルのヘルパースクリプトはメインフローから直接呼び出されていませんが、その存在と意図はcdp.tsの起動引数と同じ目的を指しています。

ログインセッション取得のための外部送信チャネルが存在:未ログイン時にログイン用QRコードを取得し、オプションでTelegram Bot経由で指定のチャットに送信できます。

skills/baoyu-post-to-wechat/scripts/wechat-article.ts
const tgResp = await fetch(`https://api.telegram.org/bot${botToken}/sendPhoto`, {
TELEGRAM_BOT_TOKENとTELEGRAM_CHAT_IDの両方が設定されている場合にトリガーされます(前提条件 `if (!botToken || !chatId) return;`)。QRコードはDOMからdata:/canvasを優先して取得し、失敗時はページ全体のスクリーンショットにフォールバックします。

エンジニアリング対応:EXTEND.mdの複数アカウントブロックおよびアカウント解決に加え、事前の環境・権限セルフチェック用スクリプトを完備。

skills/baoyu-post-to-wechat/SKILL.md
EXTEND.md supports an `accounts:` block for managing multiple Official Accounts.
check-permissions.tsがChrome、プロファイル分離、Bun、macOSアクセシビリティ権限、クリップボード、貼り付けキー(osascript / xdotool / ydotool / PowerShell SendKeys)、API認証情報、Chromeプロセスの競合を順次チェックします。

2コア機能

01公式APIによる公式アカウント下書きボックスへの記事投稿(access_token → uploadimg/add_material → draft/add)
02ブラウザCDPによる記事投稿(ログインセッションの再利用、HTML/Markdown/プレーンテキストの3入力に対応)
03画像テキスト(贴图)のショートコンテンツ投稿(最大9枚)
04Markdown → WeChat向けHTML変換(デフォルトで通常の外部リンクを文末引用に変換、--no-cite可能)
05WeChatのアップロード制限を満たすための本文画像の自動圧縮/トランスコード(jimp + wasm webpデコード + 形式スニッフィング)
06remote-api:WeChat宛てのアウトバウンドトラフィックのみをSSH SOCKS5トンネル経由でホワイトリスト登録済みIPサーバーへ転送
07複数アカウント対応(EXTEND.md accountsブロック + --account切り替え + アカウントごとの独立Chromeプロファイル)
08事前の環境・権限セルフチェック(Chrome、プロファイル、Bun、アクセシビリティ、クリップボード、貼り付けキー、API認証情報、Chrome競合)

3外部依存関係

KindDependency / Endpoint
api微信公众平台 access_token
api正文图片上传(uploadimg)
api永久素材/封面上传(add_material)
api建草稿(draft/add,含 need_open_comment / only_fans_can_comment 等字段)
apiTelegram Bot API(可选:把登录二维码发到指定聊天)
network浏览器访问 mp.weixin.qq.com(公众号后台登录与发文界面)
clissh(-N -D SOCKS5 动态端口转发;仅密钥认证)
cli本地 Chrome/Chromium(--remote-debugging-port 启动,带 AutomationControlled 关闭参数)
cli系统剪贴板工具(macOS: swift/osascript;Linux: wl-copy 或 xclip;Windows: powershell.exe)
cli粘贴按键工具(macOS osascript System Events;Linux xdotool/ydotool;Windows PowerShell SendKeys)
packagejimp / @jsquash/webp / socks / baoyu-md / baoyu-chrome-cdp
clibun(内部以 npx -y bun 调起同目录脚本)

4推奨統制措置と判定根拠

安全運用のための推奨統制措置
Agent 向け
隔離環境で実行、都度明示的な認可
管理者向け
厳格な認可、全量監査、コンプライアンス確認
判定根拠(ファイルパスと抜粋)
  • SKILL.md / 脚本: 未公開またはリバースエンジニアリングされたプライベートAPIの呼び出し / クライアント識別子の偽装
  • SKILL.md / 脚本参数: 自動化検出の回避、ホストサンドボックスの無効化、またはSSL証明書検証のスキップを含む
  • SKILL.md / 会话存储: ブラウザユーザーのログインセッションおよびセッションCookieの読み取りまたは再利用
  • scripts/: ローカルスクリプトまたはコマンドの実行: bun {baseDir}/scripts/wechat-api.ts <file> --theme … [--remote …](APIルート)
  • 网络端点: 外部ネットワークアクセスの宣言: https://api.weixin.qq.com(token / uploadimg / add_material / draft/add)— 利用可能
  • 本地工作目录: ファイルの読み書きおよびアーティファクト出力: ローカルでレンダリングされた貼り付け対象HTMLおよび本文画像処理成果物(WeChat側アップロード用)
監査ノート: レッド判定は「機能/ポリシーレベル」に該当し、レッドラインは本スキルディレクトリ内に存在します:①【技術的なアンチ自動化検出回避】scripts/cdp.tsでChrome起動時に強制的に`extraArgs: ['--disable-blink-features=AutomationControlled', '--start-maximized'],`を渡しており(125行目、すべてのブラウザ処理の起動パス)、同ディレクトリのscripts/paste-from-clipboard.tsには`This bypasses CDP's synthetic events which websites can detect and ignore.`と明記されています(範囲の説明:本コミット内のwechat-browser/wechat-articleメインフローは実際にはCDPのInput.dispatchKeyEventを使用して貼り付けキーを送信しており、このOSレベルのヘルパーはメインフローから参照されていません)。過去の事例との対比:notebooklm-skillも同様の`--disable-blink-features=AutomationControlled`によりレッド判定されています。②【認証情報面】公表された用途のためにアカウント認証情報WECHAT_APP_ID/WECHAT_APP_SECRET(EXTEND.md/env/.envの複数ソース)、任意のSSH秘密鍵、Telegram bot tokenを読み取り、ログインセッションを含む共有Chromeプロファイルを再利用します。③【外部副作用】draft/addにより公式アカウント管理画面に下書きを作成し、ブラウザ/画像テキストルートでは--submitによる投稿が可能で、未ログイン時はログインQRコードをTelegramに外部送信できます。総括:TLSのダウングレードなし、サンドボックスのダウングレードなし、エスケープなしの変数展開なし、クライアントの偽装なし。レッドラインはアンチ自動化検出の回避そのものに起因します。

5二重目の独立検証

  • [ok] 反自动化检测绕过(判红主因) — scripts/cdp.ts:125 `extraArgs: ['--disable-blink-features=AutomationControlled', '--start-maximized'],` 由 launchChromeBase 传给 Chrome(浏览器脚本共用);scripts/paste-from-clipboard.ts:5-7 明写 'This bypasses CDP's synthetic events which websites can detect and ignore.'
  • [ok] 该绕过是否真的在发布路径上 — cdp.ts 的 Chrome 启动函数是 wechat-browser.ts 与 wechat-article.ts 的入口(两者都从 cdp.ts 导入并把自动化参数交给 launchChromeBase);paste 助手本身在本 commit 未被这两个主流程引用,已在 reason/injection_surface 如实标注程度。
  • [ok] 凭证读取链 — wechat-extend-config.ts 的 loadCredentials 依次尝试 EXTEND.md account → 前缀 env/.env → WECHAT_APP_ID/WECHAT_APP_SECRET(process.env、cwd .env、home .env),与 SKILL.md 描述一致。
  • [ok] 微信 API 端点与 payload 规则 — wechat-api.ts 常量区四个 URL 与 SKILL.md 的 draft/add payload rules(article_type/thumb_media_id/need_open_comment/only_fans_can_comment/content_source_url)逐项对应。
  • [ok] remote-api 的隧道实现与承诺 — wechat-remote-publish.ts 组装 `-N -T -D 127.0.0.1:<port>` 等参数且仅用密钥(`if (config.identityFile) args.push("-i", …)`);SKILL.md 承诺不在远端落文件、AppSecret 不出本机——源码内确无远端文件写入路径(只建隧道与本地 SOCKS 出站)。
  • [ok] Telegram 二维码外发为可选 — wechat-article.ts sendQrToTelegram 在 `if (!botToken || !chatId) return;` 之后才发请求;未配置即完全不走该路径。
  • [ok] 依赖与剪贴板工具链 — package.json/bun.lock 声明 jimp、@jsquash/webp、socks、baoyu-md、baoyu-chrome-cdp;copy-to-clipboard.ts 分别用 swift/osascript、wl-copy/xclip、powershell.exe,与 check-permissions.ts 的检查项一致。
  • [ok] 无其他安全降级 — 全目录 grep no-sandbox / rejectUnauthorized / insecure / NODE_TLS_REJECT_UNAUTHORIZED 零命中;Chrome 启动参数仅常规项 + AutomationControlled。

6結論

  • 現実の制約をカバーする3系統のルート:認証情報があれば高速なAPI、IPがホワイトリスト外ならremote-apiトンネル、認証情報がなければログインセッションを利用したブラウザ。
  • 節度あるremote-api設計:ローカルレンダリング + WeChat向け送信のみSOCKS5を経由、AppSecretはローカルを離れずリモート側にもファイルを残さない。
  • プラットフォーム制約に特化したエンジニアリング:本文画像の1MB/形式制限に対する自動トランスコード、カバー画像欠落時のフォールバックチェーン、外部リンクのデフォルト文末引用化。
  • 充実した入力形態とメタデータ検証:HTML/Markdown/プレーンテキストの個別処理、タイトル/概要/著者/出典欠落時の自動生成ルールの明確化。
  • 整った運用管理ツール:権限セルフチェック、初回設定ガイド、複数アカウント手順書、リモート投稿トラブルシューティング表(40164ホワイトリストのヒントを含む)。
  • 最適な用途: 作成済みの記事や画像テキストを自己の公式アカウントへ安定して投稿する必要がある個人メディアやチームに最適:IPホワイトリスト登録済みサーバーがある場合はremote-api、認証情報がない場合はブラウザルートを使用。Markdown執筆者はmarkdown-to-htmlの出力を直接連携でき、複数アカウント運用者はaccountsブロックで切り替え可能です。
    不向きな用途: AppSecretをローカルに保存したくない場合や、ブラウザのログインセッションを再利用したくないシナリオには不適。他人のアカウントへの代理投稿やプラットフォームのリスク制御への対抗には不適(本スキルはアンチ自動化検出回避を含み、レッド判定)。投稿アクションを完全にエージェントへ自律委任するコンプライアンス重視のシナリオには不適(APIによる下書き作成パスのみを使用し、ブラウザルートの--submitは避けることを推奨)。
    Install Agent-Ready
    ① Verified Mirror 2026-09-15
    Option A · Direct DownloadDownload baoyu-post-to-wechat.tar.gz
    sha256: 1f149b01778641d8…
    Option B · Copy Guide for Agent
    install.json
    Agent はこの JSON ガイドから自動的にダウンロードして検証します。
    ② Upstream GitHub
    GitHub Repo ↗
    Pinned to commit 1567581c26.