baoyu-post-to-wechat について
baoyu-post-to-wechatは、公式アカウント向けの投稿スキルです。APIまたはブラウザーで記事を投稿し、複数画像の投稿、テーマ、メタデータ、複数アカウントを扱えます。
主な機能
- 01APIまたはブラウザーで記事を投稿
- 02最大9枚の画像を含む投稿
- 03MarkdownをWeChat向けに変換
- 04テーマ、色、メタデータの設定
- 05複数の公式アカウントを管理
活用シーン
- 01Markdownの記事をWeChatに投稿
- 02複数画像から画像付き投稿を作成
- 03ブラウザーセッションで記事を投稿
- 04許可済みIPからリモートAPIを利用
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ jimliu/ baoyu-skills --skill baoyu-post-to-wechatインストール後、Claude Code で/baoyu-post-to-wechatを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/api-setup.mdarticle-posting.mdimage-text-posting.mdmulti-account.mdreferences/config/first-time-setup.mdscripts/bun.lockcdp.tscheck-permissions.tscopy-to-clipboard-mac.test.tscopy-to-clipboard.tsmd-to-wechat.tspackage.jsonpaste-from-clipboard.tswechat-agent-browser.tswechat-api.tswechat-article-focus.test.tswechat-article.tswechat-browser.tswechat-extend-config.test.tswechat-extend-config.tswechat-http.test.tswechat-http.tswechat-image-loader.tswechat-image-processor.tswechat-remote-publish.test.tswechat-remote-publish.tswechat-socks-http.test.tswechat-socks-http.ts詳細
WeChat 公式アカウントに投稿する
ユーザー入力ツール
このスキルがユーザーに入力を求める場合は、次の優先順位に従ってツールを選択します。
- 組み込みのユーザー入力ツールを優先する — 現在のエージェントランタイムが公開している
AskUserQuestion、request_user_input、clarify、ask_userなど、または同等のツールを使用します。 - フォールバック:そのようなツールがない場合は、番号付きのプレーンテキストメッセージを出力し、各質問について選んだ番号または回答をユーザーに返信してもらいます。
- まとめて質問する:複数の質問を1回の呼び出しで処理できるツールであれば、該当する質問をまとめて一度に尋ねます。1回に1つの質問しかできない場合は、優先順位に従って1つずつ尋ねます。
以下の AskUserQuestion の具体例は参考です。他のランタイムでは、環境に応じたツールに置き換えてください。
言語
ユーザーの言語で応答します。中国語で書かれている場合は中国語で、英語の場合は英語で返信します。技術的なトークン(パス、フラグ、フィールド名)は英語のままにします。
スクリプトディレクトリ
{baseDir} = この SKILL.md があるディレクトリです。${BUN_X} は、bun を優先し、なければ npx -y bun を使用します。それもなければ brew install oven-sh/bun/bun を提案します。
| スクリプト | 目的 |
|---|---|
scripts/wechat-browser.ts | 画像・テキスト投稿(图文) |
scripts/wechat-article.ts | ブラウザー経由で記事を投稿(文章) |
scripts/wechat-api.ts | API 経由で記事を投稿(文章) |
scripts/md-to-wechat.ts | Markdown → 画像プレースホルダー付きの WeChat 対応 HTML |
scripts/check-permissions.ts | 環境と権限を確認 |
設定(EXTEND.md)
以下のパスを順に確認し、最初に見つかったものを使用します。
| パス | 範囲 |
|---|---|
.baoyu-skills/baoyu-post-to-wechat/EXTEND.md | プロジェクト |
${XDG_CONFIG_HOME:-$HOME/.config}/baoyu-skills/baoyu-post-to-wechat/EXTEND.md | XDG |
$HOME/.baoyu-skills/baoyu-post-to-wechat/EXTEND.md | ユーザーホーム |
見つかった場合 → 読み込み、解析して適用します。見つからない場合 → ほかの処理を行う前に、初回セットアップ(references/config/first-time-setup.md)を実行します。
必須キー(大文字と小文字は区別せず、1/0 または true/false を受け付けます):
| キー | デフォルト | 対応先 |
|---|---|---|
default_author | 空 | CLI/frontmatter で指定されていない場合の author のフォールバック |
need_open_comment | 1 | draft/add の articles[].need_open_comment |
only_fans_can_comment | 0 | draft/add の articles[].only_fans_can_comment |
推奨する EXTEND.md:
default_theme: default
default_color: blue
default_publish_method: browser
default_author: 宝玉
need_open_comment: 1
only_fans_can_comment: 0
chrome_profile_path: /path/to/chrome/profile
# Remote API publishing (optional) — only set if WeChat's IP allowlist
# excludes your local machine. See "Remote API Method" below.
# remote_publish_host: server.example.com
# remote_publish_user: deploy
# remote_publish_port: 22
# remote_publish_identity_file: ~/.ssh/id_ed25519
# remote_publish_known_hosts_file: ~/.ssh/known_hosts
# remote_publish_strict_host_key_checking: accept-new
# remote_publish_connect_timeout: 10
# remote_publish_proxy_jump: bastion.example.com
ssh / scp の生のオプションには意図的に対応していません。上記の型指定されたキーのみが適用されます。認証は SSH キーのみで、パスワードは使用できません。
テーマの選択肢:default、grace、simple、modern。カラーのプリセット:blue、green、vermilion、yellow、purple、sky、rose、olive、black、gray、pink、red、orange(または hex)。
値の優先順位:CLI 引数 → frontmatter → EXTEND.md(アカウントレベル → グローバル)→ スキルのデフォルト。
複数アカウントのサポート
EXTEND.md では、複数の公式アカウントを管理するための accounts: ブロックをサポートしています。エントリが2つ以上ある場合、ワークフローにアカウント選択を求めるステップ 0.5 が挿入されます(または、default: true や --account <alias> に基づいて自動選択されます)。
互換性ルール、アカウントごとのキー、認証情報の解決、アカウントごとの Chrome プロファイル、CLI の使用方法などの詳細は、references/multi-account.md を参照してください。
事前チェック(任意)
初回使用前に、環境チェックを提案します(ユーザーはスキップできます)。
${BUN_X} {baseDir}/scripts/check-permissions.ts
確認項目:Chrome、プロファイルの分離、Bun、アクセシビリティ、クリップボード、貼り付けのキーストローク、API 認証情報、Chrome の競合。
| チェックに失敗した項目 | 対処方法 |
|---|---|
| Chrome | Chrome をインストールするか、WECHAT_BROWSER_CHROME_PATH を設定します |
| プロファイルディレクトリ | baoyu-skills/chrome-profile に共有プロファイルがあります |
| Bun ランタイム | brew install oven-sh/bun/bun または npm install -g bun |
| アクセシビリティ(macOS) | システム設定 → プライバシーとセキュリティ → アクセシビリティ → ターミナルアプリを有効にします |
| クリップボードへのコピー | Swift/AppKit が利用できることを確認します(macOS:xcode-select --install) |
| 貼り付けのキーストローク(Linux) | xdotool(X11)または ydotool(Wayland)をインストールします |
| API 認証情報 | Step 2 のガイド付きセットアップに従うか、.baoyu-skills/.env に設定します |
画像付き投稿(画像とテキスト)
複数の画像を含む短い投稿(最大9枚):
${BUN_X} {baseDir}/scripts/wechat-browser.ts --markdown article.md --images ./images/
${BUN_X} {baseDir}/scripts/wechat-browser.ts --title "标题" --content "内容" --image img.png --submit
詳細:references/image-text-posting.md。
記事投稿ワークフロー(記事)
- [ ] Step 0: Load preferences (EXTEND.md)
- [ ] Step 0.5: Resolve account (multi-account only — see references/multi-account.md)
- [ ] Step 1: Determine input type
- [ ] Step 2: Select method and configure credentials
- [ ] Step 3: Resolve theme/color and validate metadata
- [ ] Step 4: Publish to WeChat
- [ ] Step 5: Report completion
ステップ 0:設定を読み込む
EXTEND.md を確認して読み込みます(上記の「設定」を参照)。見つからない場合は、ほかの質問をする前に初回セットアップを完了してください。以降のステップで使用する default_theme、default_color、default_author、need_open_comment、only_fans_can_comment を解決してキャッシュします。
ステップ 1:入力タイプを判定する
| 入力 | 判定 | 次のステップ |
|---|---|---|
| HTML ファイル | パスが .html で終わり、ファイルが存在する | ステップ 3 に進む |
| Markdown ファイル | パスが .md で終わり、ファイルが存在する | ステップ 2 |
| プレーンテキスト | ファイルパスではない、またはファイルが存在しない | Markdown に保存してから、ステップ 2 |
プレーンテキストの処理:
- スラッグを生成します(意味のある最初の2~4語をケバブケースにします。スラッグでは中国語を英語に翻訳します)。
post-to-wechat/YYYY-MM-DD/<slug>.mdに保存します(必要に応じてディレクトリを作成します)。- Markdown ファイルとして処理を続けます。
ステップ 2:公開方法を選択して設定する
EXTEND.md または CLI で指定されていない場合は、方法を確認します。
| 方法 | 速度 | 必要なもの |
|---|---|---|
api(推奨) | 高速 | API 認証情報(ローカル IP が許可リストに登録されていること) |
browser | 低速 | Chrome + ログイン済みセッション |
remote-api | 高速 | API 認証情報 + SSH で接続でき、IP が WeChat の許可リストに登録されているサーバー |
API を選択して認証情報が不足している場合 → references/api-setup.md に従ってガイド付きセットアップを実行します(.baoyu-skills/.env に書き込みます)。
remote-api 方法:WeChat の「公众号设置 → IP 白名单」では、API アクセスが固定 IP 1~2件に制限されていることがよくあります。ローカルマシンの IP がそのリストにない一方で、クラウドサーバーの IP が登録されている場合は、remote-api を使用します。Markdown のレンダリング、画像処理、下書きの組み立て、HTML の書き換えはすべて引き続きローカルで行われ、api.weixin.qq.com への送信 HTTPS 呼び出し(token、uploadimg、add_material、draft/add)のみが、SSH SOCKS5 動的ポートフォワード(ssh -N -D)を経由します。これにより、WeChat にはリモートサーバーが送信元 IP として認識されます。リモートホストにはファイルを書き込みません。AppSecret がローカルプロセスの外に出ることもありません。必要なのはリモートホスト上の sshd と外部ネットワーク接続のみで、Python もエージェントプロセスも不要です。詳細は以下の「リモート API 方法」を参照してください。
ステップ 3:テーマと色を解決し、メタデータを検証する
- テーマ:CLI
--theme→ EXTEND.mddefault_theme→default(最初に一致したものを使用します。解決できた場合は確認しません)。 - 色:CLI
--color→ EXTEND.mddefault_color→ 省略(テーマのデフォルトが適用されます)。 - メタデータを検証する(Markdown の場合はフロントマター、HTML の場合は meta タグ)。
| フィールド | 不足している場合 → |
|---|---|
| タイトル | 確認するか、Enter キーを押してコンテンツから自動生成します |
| 概要 | フロントマターの description → summary → 確認または自動生成 |
| 作者 | CLI --author → フロントマターの author → EXTEND.md default_author |
| 参照元 URL | CLI --source-url → フロントマターの sourceUrl/contentSourceUrl/content_source_url |
自動生成:タイトル = 最初の H1/H2 または最初の文。概要 = 最初の段落を120文字に切り詰めたもの。
- カバー画像(API の
article_type=newsでは必須):CLI--cover→ フロントマター(coverImage/featureImage/cover/image)→imgs/cover.png→ 最初のインライン画像 → それでも見つからない場合は停止して画像を要求します。
Step 4: 公開
重要 — Markdown を事前に HTML に変換しないでください。 公開スクリプトが内部で変換を処理します。また、2 つの方法では画像のレンダリング方法が異なります。API ではアップロード用に <img> タグが生成され、ブラウザーでは貼り付けて置き換えるためのプレースホルダーが使われます。事前に変換した HTML を渡すと、どちらかの方法で問題が発生します。
Markdown の引用の既定動作:Markdown 入力の場合、通常の外部リンクは既定で末尾の引用に変換されます。ユーザーがインラインリンクを残すことを明示的に希望する場合に限り、--no-cite を使ってください。既存の HTML 入力はそのまま使用されます。
API 方式(.md または .html を受け付けます):
${BUN_X} {baseDir}/scripts/wechat-api.ts <file> --theme <theme> [--color <color>] [--title <title>] [--summary <summary>] [--author <author>] [--cover <cover_path>] [--source-url <url>] [--no-cite]
default の場合でも、必ず --theme を指定してください。--color は、ユーザーまたは EXTEND.md で明示的に設定されている場合に限り指定してください。
リモート API 方式(同じスクリプトに --remote を追加します):
${BUN_X} {baseDir}/scripts/wechat-api.ts <file> --theme <theme> --remote [--remote-host <host>] [--remote-user <user>] [--remote-port <port>] [--remote-identity-file <path>] [--remote-known-hosts-file <path>] [--remote-strict-host-key-checking yes|no|accept-new] [--remote-connect-timeout <s>] [--remote-proxy-jump <spec>]
--remote-* フラグを指定すると、自動的に --remote も有効になります。CLI の値は、EXTEND.md のアカウントレベル、次にグローバルの remote_publish_* キーより優先されます。default_publish_method: remote-api を設定すると、--remote を指定しなくてもリモートモードが有効になります。
draft/add のペイロード規則:
- エンドポイント:
POST https://api.weixin.qq.com/cgi-bin/draft/add?access_token=ACCESS_TOKEN article_type:news(既定値)またはnewspicnewsの場合、thumb_media_idを含めてください(カバー画像は必須です)- CLI で指定できない場合でも、リクエストボディには必ず
need_open_comment(既定値1)とonly_fans_can_comment(既定値0)を含めてください newsの場合、任意でcontent_source_urlを含められます(元記事の URL。「阅读原文」リンクとして表示され、最大 1KB)。CLI フラグ--source-urlまたは frontmatter のsourceUrl/contentSourceUrl/content_source_urlで指定してください
ブラウザー方式(--markdown または --html を受け付けます):
${BUN_X} {baseDir}/scripts/wechat-article.ts --markdown <markdown_file> --theme <theme> [--color <color>] [--no-cite]
${BUN_X} {baseDir}/scripts/wechat-article.ts --html <html_file>
Step 5: 完了レポート
WeChat Publishing Complete!
Input: [type] - [path]
Method: [API | Browser]
Theme: [theme] [color if set]
Article:
• Title: [title]
• Summary: [summary]
• Images: [N] inline
• Comments: [open/closed], [fans-only/all] ← API method only
Result:
✓ Draft saved to WeChat Official Account
• media_id: [media_id] ← API method only
Next Steps (API):
→ Manage drafts: https://mp.weixin.qq.com (登录后进入「内容管理」→「草稿箱」)
Files created:
[• post-to-wechat/YYYY-MM-DD/slug.md (if plain text input)]
[• slug.html (converted)]
機能の比較
| 機能 | 画像とテキスト | 記事(API) | 記事(リモート API) | 記事(ブラウザー) |
|---|---|---|---|---|
| プレーンテキスト入力 | ✗ | ✓ | ✓ | ✓ |
| HTML 入力 | ✗ | ✓ | ✓ | ✓ |
| Markdown 入力 | タイトル/本文 | ✓ | ✓ | ✓ |
| 複数の画像 | ✓(最大 9 枚) | ✓(本文内) | ✓(本文内) | ✓(本文内) |
| テーマ | ✗ | ✓ | ✓ | ✓ |
| メタデータの自動生成 | ✗ | ✓ | ✓ | ✓ |
既定のカバー画像の代替(imgs/cover.png) | ✗ | ✓ | ✓ | ✗ |
| コメントの制御 | ✗ | ✓ | ✓ | ✗ |
| Chrome が必要 | ✓ | ✗ | ✗ | ✓ |
| API 認証情報が必要 | ✗ | ✓ | ✓ | ✗ |
| SSH 接続可能で、許可リストに登録された IP を持つサーバーが必要 | ✗ | ✗ | ✓ | ✗ |
| 速度 | 中 | 高速 | 高速 | 低速 |
トラブルシューティング
| 問題 | 対処法 |
|---|---|
| API 認証情報がない | Step 2 のセットアップガイドに従ってください |
| アクセストークンエラー | 認証情報が有効で、期限切れでないことを確認してください |
| ログインしていない(ブラウザー) | 初回実行時にブラウザーが開きます。QR コードをスキャンしてログインしてください。QR 画像を Telegram で受け取るには、TELEGRAM_BOT_TOKEN と TELEGRAM_CHAT_ID を設定してください |
| Chrome が見つからない | WECHAT_BROWSER_CHROME_PATH を設定してください |
| タイトル/要約がない | 自動生成を使うか、手動で入力してください |
| カバー画像がない | frontmatter にカバー画像を追加するか、記事ディレクトリに imgs/cover.png を配置してください |
| コメントの既定値が違う | EXTEND.md の need_open_comment/only_fans_can_comment を確認してください |
| 貼り付けに失敗する | システムのクリップボード権限を確認してください |
Remote publish host is required | --remote-host または EXTEND.md の remote_publish_host を設定してください |
SOCKS proxy on 127.0.0.1:… not ready | SSH トンネルを開始できませんでした。キー、ホスト、StrictHostKeyChecking を確認するか、--remote-connect-timeout を使用してください |
リモート公開中に ssh exited early が発生する | サーバーに対してユーザーが非対話で ssh 接続できることを確認してください。接続が遅い場合は --remote-connect-timeout を増やしてください |
リモート API 呼び出しが errcode 40164(無効な IP)を返す | リモートサーバーの外向き IP が WeChat の許可リストに登録されていません。公众号设置 → IP 白名单 で追加してください |
参考資料
| ファイル | 内容 |
|---|---|
references/image-text-posting.md | 画像付きテキストのパラメーター、自動圧縮 |
references/article-posting.md | 記事のテーマ、画像の処理 |
references/multi-account.md | 複数アカウントの互換性、認証情報、Chrome プロファイル、CLI |
references/api-setup.md | 認証情報のセットアップガイド |
references/config/first-time-setup.md | 初回のEXTEND.mdセットアップ |
拡張機能のサポート
EXTEND.mdによるカスタム設定に対応しています。パスとサポート対象のオプションについては「環境設定」を参照してください。