mcpField
W
wjs-publishing-wechat

wjs-publishing-wechat

github.com/jianshuoクリエイティブ・メディア137155 回インストール今日更新
リポジトリ

wjs-publishing-wechat について

王建碩のスタイルに沿って、WeChat公式アカウントの記事を軽く推敲し、下書きを準備するスキルです。画像生成や形式変換に対応し、公開前にユーザーがタイトルを選びます。

主な機能

  1. 01スタイルファイルに沿った軽い推敲
  2. 02カバー画像と解説画像の生成
  3. 03MarkdownからWeChat形式への変換
  4. 04WeChat下書きのアップロード
  5. 05公開前のタイトル選択

活用シーン

  1. 01元の語り口を保った記事の推敲
  2. 02記事画像の作成と形式変換
  3. 03記事をWeChatの下書きとして登録

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/jianshuo/claude-skills --skill wjs-publishing-wechat

インストール後、Claude Code で/wjs-publishing-wechatを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

.gitignore
.publish-manifest.json
LICENSE
README.md
STYLE.md
prompts/
cover-prompt.md
illustration-prompt.md
scripts/
backfill-permalinks.py
build-recent-articles.py
fetch-comments-by-cookie.sh
fetch-comments-via-gstack.sh
fetch-comments.sh
gen-cover-ai.sh
gen-illustration.sh
mass-send.sh
open-draft-edit.sh
pangu.py
update-draft-via-api.py
upload-draft.sh

詳細

wjs-publishing-wechat

微信公衆號の記事作成を支援します。軽く推敲し、書き直しません。 アイキャッチ画像と解説画像を自動生成し、コマンド一行で下書きを投稿します。

⚠️ スタイルの唯一の基準:STYLE.md(執筆・推敲の前に必読)

記事を執筆または推敲する前に、同じディレクトリにある STYLE.md を読み、厳密に従ってください。 これは王建硕本人が管理するスタイル定義ファイルです。語調の DNA、長さ、太字、レイアウト、禁止事項の一覧がすべて記載されています。この SKILL.md では、仕組みとワークフロー(スクリプト、画像、HTML 変換、公開)のみを扱います。

スタイルについて STYLE.md と本ファイルが矛盾する場合は、STYLE.md を優先してください。スタイルを調整する場合は、STYLE.md を変更してください。ここでは変更せず、下書きでも変更しないでください。

以下には、仕組みに関連する執筆上の制約のみを記載します。

  • 文字数(STYLE.md で予算を定め、ここでは文字数のカウントコマンドを示します):
python3 -c "import re; t=open('article.md').read(); t=re.sub(r'\!\[.*?\]\(.*?\)','',t); print(len(re.findall(r'[一-鿿]',t)) + len(re.findall(r'[A-Za-z]+',t)))"
  • 太字を赤字にする仕組み:upload-draft.sh は **...** を赤い太字に変換します(使い方は STYLE.md「加粗加红」を参照)。
  • 盤古の空白の仕組み:upload-draft.sh は scripts/pangu.py を自動実行するため、Claude が手動で空白を挿入する必要はありません。
  • コマンド/コードを独立した段落にする書き方(ルールは STYLE.md を参照。ここではコピーして使える形式を示します):
    • 推奨——薄い背景色のコードブロック(raw HTML ブロック。ブロック全体を1行にし、中に空行を入れないでください):
      <section style="background:#f6f8fa;border-radius:6px;padding:14px 16px;overflow-x:auto;font-family:Menlo,Consolas,monospace;font-size:14px;line-height:1.8;color:#24292e;">npm install -g xxx<br>xxx run</section>
      
    • または fenced ```bash ブロック。スクリプトによって独立した <p><code>…</code></p> に変換されます。

スキルを紹介する記事:末尾にインストール方法を必ず追加

適用条件:特定の Claude Code スキルを紹介・推奨する記事。

事前確認 — スキルが公開済みであることを確認:王建硕自身の wjs-* スキルは、~/.claude/skills-publish-hook.sh によって github.com/jianshuo/claude-skills に自動で push されます。gh api repos/jianshuo/claude-skills/contents/<skill-name> で確認してください。他者のスキルは、公開されている git リポジトリにあることを先に確認してください。

末尾に以下の内容を追加してください(<SKILL_NAME> は実際の名前に置き換えます):

## 安装方法

不用复制命令。打开你用的 AI agent——Claude Code、Codex、Kimi Code、OpenClaw 都可以,对它说一句:

> 安装 https://github.com/jianshuo/claude-skills/blob/main/<SKILL_NAME>/SKILL.md

它会自己 fetch、放到 skill 目录里、提示你重启对话。

用 Hermes 的话直接命令行:

\`\`\`bash
hermes skills install https://github.com/jianshuo/claude-skills/blob/main/<SKILL_NAME>/SKILL.md
\`\`\`

装完之后,对 agent 说一句「<一句最自然的触发语,紧扣这个 skill 的入口>」,就能用。

ルール:

  1. この内容は 800–1000 字の予算に含めません
  2. URL は github.com/<owner>/<repo>/blob/main/<path> を使ってください。ブラウザーで直接確認でき、LLM エージェントも blob URL から markdown を抽出できます
  3. Hermes はチャットエージェントではなく registry CLI なので、コマンドラインとして別に記載してください
  4. 最後の呼びかけ文は、現在のスキルの実際の入口に合わせてください。省略しないでください
  5. 通常は末尾に置きます。## 后注 がある場合は、その前に置きます

ワークフロー

Step 0: 入力を受け取る

入力形式:完成した下書き/散らかったアイデア/段落分けされていない長文/音声の文字起こし(誤字が含まれる場合があります)。あまりにもまとまりがない場合は、質問を1つだけしてください:「記事にしますか、それとも独立したアイデアをいくつかにしますか?」——質問はこの1回だけです。

Step 1: 軽く推敲する
  • 誤字を修正します(「的得地」、同音異字、「我我」のような重複など)
  • 1〜3文ごとに段落を分けます
  • 読みにくい箇所は最小限の変更にとどめます。変更によって語調が変わるなら、修正しないでください
  • 句読点:中国語は全角、英語/数字との間にはスペースを入れます
  • 元の書き出しと結びを維持します
Step 1.5: プライバシースキャン(最終稿前の必須チェック)

実施時点:推敲後、文章を最終稿にする直前。毎回必ず実施します。一文ずつ、個人のプライバシー情報を確認してください——具体的な人名、レストラン/店舗/施設名、正確な場所/住所、電話番号/メールアドレス/WeChat ID などは、最終公開版に含めてはいけません。一般化するか削除してください。判定基準、置き換え例、都市名は残してよいことなどの詳細は、STYLE.md「10. 隐私红线」を参照してください。

該当項目は納品時の変更一覧に「プライバシー」と明記して含めてください。該当がない場合も「プライバシースキャン:該当なし」と伝えてください。判断に迷う場合はユーザーに確認し、意図的に含められた詳細を勝手に削除しないでください。

Step 2: タイトル候補

3つの候補を提示します:A) 率直なタイプ、B) ストーリータイプ、C) 原文で最も味わいのある一文。釣りタイトル、誇張、「衝撃」「必見」は使いません。

Step 3: 要約(50–80 字)

読者の興味を引き、クリックを促すため、「好奇心の空白」を使います。記事の中で最も意外性や緊張感のある点(結論、代償、転換、数字)を提示しつつ、答えは少し残して本文に取っておき、クリックせずにはいられないようにします。王建硕らしい語調(具体的で誠実、言い切らない控えめさ)を保ち、フックは形容詞ではなく実際の内容から作ります。釣りタイトル、誇張、マーケティング調は絶対に避けてください。第1段落のコピーにはしません。ルールと例は STYLE.md「6. 标题与摘要」を参照してください。

Step 4: 画像を用意する(各記事2枚、自動生成。ユーザーへの確認は不要)
  • アイキャッチ画像 cover.png — 厳密に 2.35:1(900×383)。力強いフォントと構図を使い、文字を主役にします
  • 解説画像 illustration.png — 比率は内容に合わせて選択(モデルが決定)。フラットなカートゥーン調で、ラベルとフローを含めます
~/.claude/skills/wjs-publishing-wechat/scripts/gen-cover-ai.sh <article-folder> ["目标字词"]
~/.claude/skills/wjs-publishing-wechat/scripts/gen-illustration.sh <article-folder>

第2引数を指定しない場合は meta.json から title を取得します。中心となる概念を表す字句(1〜4字)を選ぶのがおすすめです。

  • 内部では gpt-image-2-skill の --provider codex を使用します。~/.codex/auth.json が必要です
  • アイキャッチ画像は自動的に 900×383 にトリミングされます。解説画像はトリミングされません

解説画像は markdown 内で参照してください——article.md に ![](./illustration.png) という行がないと、下書きに表示されません。

⚠️ 本文中の cover.png/illustration.png 以外の画像は、自動で CDN にアップロードされません。 ユーザー提供のローカルスクリーンショット(例:img-xxx.png)は、1枚ずつ md2wechat upload_image img-xxx.png --json を実行して data.wechat_url を取得し、article.md 内のローカルパスを置き換えてください。検証方法:grep -c mmbiz content.html で本文中の画像数を確認し、grep -c 'img-' content.html が 0 であることを確認します。

デフォルトの挿入位置:本文の最後の落としどころの後(## 后注 がある場合は後注の前、## 安装方法 がある場合はインストール方法の前)。

解説画像の導入文は絶対に書かないでください——「全体を図にするとこうなります」「図をご覧ください」などは書かず、画像に語らせます。詳しくは [[no-illustration-caption]] を参照してください。

セーフティネット:illustration.png が存在するのに article.md で参照されていない場合、upload-draft.sh が自動で挿入して書き換えます。この処理は冪等です。

Step 5: ファイル一式を出力する

作業ディレクトリ(デフォルトは ~/wechat-publish/articles/)に作成します:

articles/2026-05-09-{slug}/
├── article.md           # 润色后的 markdown
├── cover.png            # 题图 900×383
├── illustration.png     # 解释图
├── meta.json            # { title, summary, author, date, slug }
└── original.md          # 用户原始输入

{slug}:ピンインの頭文字+キーワード。30文字以内です。

Step 5.5: 公開前にタイトルを選ぶ(必須チェック。必ずユーザーの返答を待つ)

実施時点:ファイル一式の準備ができてから、upload-draft.sh を実行する直前です。この手順は省略できず、独断で選んではいけません——必ず停止してタイトル候補をユーザーに送り、ユーザーが1文字で回答してから続行してください。

見やすいリスト形式で、4つの候補を提示します。

  • A) 元のタイトル——meta.json に現在設定されている title を、そのまま掲載します(ユーザーが「変更しない」場合の内容を確認できるようにします)
  • B/C/D) よりインパクトのある3つの候補——元のタイトルより人を引きつけ、緊張感があるものにします。ただし、王建硕の禁止事項は守ります:釣りタイトル、誇張、「衝撃/必見/覆す」、マーケティング調は避けます。インパクトは実際の内容(意外な結論、具体的な数字、鋭い対比、あえて言い切らないフック)から生み出し、形容詞を並べて作らないでください。

候補を送った後、次のように伝えてください:「A なら元のタイトル、B/C/D なら新しいタイトルを使います。ご自身で候補を提示していただいても構いません。」その後、停止してください。

ユーザーが選んだ後:

  1. B/C/D またはユーザー独自の案が選ばれた場合 → python3 で meta.json の title を選択された内容に変更します(cover.png は生成済みなので、タイトルが変わってもアイキャッチ画像を作り直す必要はありません。ユーザーが希望した場合を除きます)
  2. A が選ばれた場合、または返信がない場合 → タイトルは変更しません
  3. その後、Step 6 の公開に進みます
Step 6: 公開(upload-draft.sh)
~/.claude/skills/wjs-publishing-wechat/scripts/upload-draft.sh <workspace>/articles/YYYY-MM-DD-{slug}

スクリプトの処理内容:

  1. pangu.py を実行して、パングーのスペースを追加します
  2. md2wechat upload_image cover.png → thumb_media_id を取得します
  3. illustration.png が存在し、参照されていない場合は自動で挿入してアップロードし、CDN URL を取得します(冪等性を保つ安全策)
  4. 「最近の記事」リンク一覧を挿入します(build-recent-articles.py、デフォルトで有効。次のセクションを参照)
  5. article.md から content.html を生成します(変換ルールは以下を参照)
  6. draft.json を作成し、create_draft を呼び出します。または(publish.json に draft_media_id がある場合)、draft/update で同じ場所に更新します
  7. 下書きを自動で開きます:macOS では scripts/open-draft-edit.sh を実行し、ログイン済みブラウザーの session token を読み取り、タイトルから appmsgid を検索して、該当記事の編集ページを直接開きます(未ログインの場合はホームページを開きます)。Linux では mp.weixin.qq.com のホームページを開きます。WECHAT_PUBLISH_NO_OPEN=1 で無効にできます
  8. 記事のディレクトリを自動で git add / commit / push して origin に送信します
記事末尾の「最近の記事」一覧(自動)

公開のたびに、upload-draft.sh は記事の末尾に最近公開された記事のリンク一覧(デフォルトで 5 件)を自動で追加します。WeChat エディター標準の記事ハイパーリンク形式(mp_article_text_link + data-linktype="2"。同じアカウントの /s/ リンクのみクリックできます)を使用します。

仕組みはローカル台帳 + オフラインレンダリングです。公開時にネットワークアクセスは不要で、結果は決定的であり、オフラインで実行できます。

  • 台帳:各記事の publish.json にある permalink(https://mp.weixin.qq.com/s/…)と published_at。
  • レンダリング:build-recent-articles.py <article-folder> は、同じ階層にある */publish.json のうち permalink がある記事をスキャンし、published_at の降順で新しいものから N 件(現在の記事を除く)を取得します。article.md の `` マーカー内を書き換え可能な形で更新し、raw-HTML ブロックを出力します(content.html ビルダーはそのまま出力し、WeChat はコメントを無視します)。台帳が空の場合は何も追加しません。エラーを出したり、公開を妨げたりすることはありません。
  • 単独で実行/プレビューする場合:build-recent-articles.py <folder> --print(出力のみで、書き込みません)。--count N で件数を変更できます。
  • 無効にする場合:WECHAT_PUBLISH_NO_RECENT=1。件数を変更する場合:WECHAT_RECENT_COUNT=8。

台帳の作成方法 — backfill-permalinks.py(必要に応じて実行):permalink は記事の正式公開後に、公式アカウントの管理画面からしか取得できません(下書きから公開への切り替えは手動で行うため、情報は自動で戻りません)。このスクリプトは Web 管理画面の appmsgpublish(公開済み一覧)を呼び出してアカウント全体を取得し、タイトルを完全一致で照合して permalink/published_at を各 publish.json に書き戻します。完全一致のみを使用します。公開時のタイトルが meta.title と異なることが多く、あいまい一致では誤ったリンクを書き込むためです。一致しないものは一覧表示し、手動で処理できるようにします。

~/.claude/skills/wjs-publishing-wechat/scripts/backfill-permalinks.py [articles根目录] [--dry-run]

認証にはWeb セッションを使います(公開 API の access_token ではありません)。Cookie は数時間で期限切れになるため、毎回の公開時ではなく「必要に応じてメンテナンス」します。次のいずれかで 3 つの値を指定します。① 環境変数 WECHAT_MP_COOKIE/WECHAT_MP_TOKEN/WECHAT_MP_FAKEID。② セッションファイル(デフォルトは ~/.config/wjs-wechat/mp-session.env。同名の 3 つの変数を export 形式で記述)。取得方法:mp.weixin.qq.com にログイン → コンテンツ管理 → 公開済み → DevTools の Network で appmsgpublish リクエストを探す → Copy as cURL。token/fakeid は URL 内に、Cookie はリクエストヘッダー内にあります。

upload-draft.sh は公開時に上記の認証情報またはセッションファイルを検出すると、台帳の更新を先に試みてからリンクを挿入します(致命的な処理ではなく、期限切れの場合はスキップします)。設定がない場合は、既存のローカル台帳をそのまま使います。セッションファイルを設定すれば、公開時に「自動で台帳を更新 + 最近の記事を自動で追加」できます。

article.md の作成ルール(Claude の文章作成に影響します。その他の HTML の詳細はスクリプトが処理します):

  • <p>/<h2>/<h3>/<img>/<strong>/<em>/<code>/<ul>/<ol>/<li>/パイプテーブルに対応します
  • Raw HTML ブロックはそのまま出力されます:< で始まるブロックはそのまま出力されます。ブロック全体をひとまとまりにし、内部に空行を入れないでください
  • 段落内の複数行は <br> で改行します(対句/並列する短文に使用):厳守ルール:行末を読点「,」にしてはいけません。改行位置は文末の句読点(。?!)の後に限ります

環境変数:

  • WECHAT_PUBLISH_FORCE_NEW=1 — 新しい下書きを強制作成します(draft_media_id を再利用しません)
  • WECHAT_PUBLISH_NO_OPEN=1 — ブラウザーを自動で開きません
  • WECHAT_PUBLISH_NO_PUSH=1 — push を自動で実行しません
  • WECHAT_PUBLISH_NO_RECENT=1 — 記事末尾に「最近の記事」一覧を挿入しません
  • WECHAT_RECENT_COUNT=N — 「最近の記事」に表示する件数(デフォルトは 5)
  • WECHAT_MP_COOKIE/WECHAT_MP_TOKEN/WECHAT_MP_FAKEID または WECHAT_MP_SESSION(セッションファイルのパス。デフォルトは ~/.config/wjs-wechat/mp-session.env)— 設定すると、公開時に permalink の台帳を自動で更新します

前提条件:

  • md2wechat CLI がインストール済みで、WECHAT_APPID + WECHAT_SECRET が設定されていること(md2wechat config show)
  • 現在のパブリック IP が公式アカウント管理画面の許可リストに登録されていること:mp.weixin.qq.com → 設定と開発 → 基本設定 → IP 許可リスト。登録されていない場合は errcode=40164 になります

よくある errcode:40164 IP が許可リストに登録されていない | 45004 summary が空/短すぎる | 40007 古い draft_media_id が削除されている(スクリプトが自動で新規作成に切り替えます)。

成功したら、下書きボックス → スマートフォンでプレビュー → 公開の順に進みます。

推敲のヒント/段落分け/禁止事項/変更一覧

すべて STYLE.md に移動しました——誤字のパターン、段落分けのルール、禁止事項の一覧、納品前に変更一覧を提示することなどは、すべてそこにあります。推敲前に STYLE.md を読み、その指示に従ってください。

外部スキルに依存します:gpt-image-2-skill(カバー/イラスト生成)+ /md2wechat(アップロード + 下書き)。

完了条件

  • articles/YYYY-MM-DD-{slug}/ フォルダーが存在する
  • article.md、cover.png、illustration.png、meta.json、original.md が含まれている
  • meta.json の必須フィールドがすべて揃っている
  • 最終原稿の完成前にプライバシーを確認済み(Step 1.5)——人名/レストラン/場所などの個人情報は一般化または削除され、該当項目は変更一覧に記載されている
  • 公開前に A(元のタイトル)+ よりインパクトのある候補 3 件を提示し、ユーザーの選択に基づいてタイトルを決定済み(Step 5.5)
  • 下書きが mp.weixin.qq.com の管理画面で確認できる
  • ユーザーから「もう少し直して」と言われていない

コメント