mcpField
B
bilibili

bilibili

github.com/acedatacloudマーケティング・グロース17167 回インストール今日更新
リポジトリ

bilibili について

ユーザーが取得した Cookie を使い、標準ライブラリのみの Python コマンドラインツールで Bilibili の記事を読み書きするスキルです。公開や下書き管理には確認手順があります。

主な機能

  1. 01アカウントと記事の統計確認
  2. 02記事・下書き・状態の一覧
  3. 03記事の投稿と下書き保存
  4. 04外部画像の再ホスト
  5. 05投稿・削除前の確認

活用シーン

  1. 01記事の閲覧数や反応の確認
  2. 02記事を下書きとして保存
  3. 03明示的な承認後に記事を投稿
  4. 04審査中または却下された投稿の確認

インストール

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

$npx skills add https://github.com/acedatacloud/skills --skill bilibili

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

同梱ファイルscripts/bilibili.py

詳細

bilibili — 自分の Cookie を使って専栏を閲覧・公開

ACE 拡張機能で取得したログイン Cookie を使い、サイトと同じ api.bilibili.com のウェブエンドポイント経由で、ユーザー本人の実際の Bilibili 専栏(記事)アカウントを操作します。ブラウザーもサードパーティー依存関係も不要です — urllib と hashlib を使用します(記事一覧の読み取りエンドポイントには WBI 署名が必要ですが、標準ライブラリで処理します)。

コネクターは Cookie jar を環境変数として渡します。

  • BILIBILI_COOKIES — Cookie の JSON 配列です。秘密情報です — 決してエコーしたり出力したりしないでください。 SESSDATA(認証用)と、書き込みに使う CSRF トークン bili_jct が含まれています。

CLI

このスキルには scripts/bilibili.py が含まれています — 標準ライブラリのみで完結しています。

# $SKILL_DIR can point at another skill loaded this turn — anchor on our own
# script, and re-run this at the top of every Bash block (fresh shell each time).
BILI="$SKILL_DIR/scripts/bilibili.py"; [ -f "$BILI" ] || BILI=$(find /tmp -maxdepth 8 -path '*/skills/*/scripts/bilibili.py' 2>/dev/null | head -1)
[ -f "$BILI" ] || { echo "bilibili script not found (SKILL_DIR=$SKILL_DIR)" >&2; exit 1; }
python3 "$BILI" whoami                     # who is logged in (mid, name)
python3 "$BILI" articles --limit 20        # my 专栏 articles + stats
python3 "$BILI" article <cvid>             # one article's stats (cv id)
python3 "$BILI" drafts --limit 50          # list saved drafts (aid + title)
python3 "$BILI" status --limit 10          # review state of recent submissions
python3 "$BILI" categories                 # 分类 names accepted by --category

統計情報は Bilibili から直接取得します。view(閲覧)、like(いいね)、reply(コメント)、 favorite(お気に入り)、coin(コイン)です。

まず接続を確認する

BILI="$SKILL_DIR/scripts/bilibili.py"; [ -f "$BILI" ] || BILI=$(find /tmp -maxdepth 8 -path '*/skills/*/scripts/bilibili.py' 2>/dev/null | head -1)
python3 "$BILI" whoami
# → {"mid": 10000000, "name": "...", "level": 4}

未ログインまたは認証エラーの場合、Cookie の有効期限が切れています。ユーザーに https://studio.acedata.cloud/console/connectors で再接続してもらってください。再試行を繰り返さないでください。

公開 — 承認必須(末尾に --confirm がない限りドライラン)

publish はユーザー本人の実際のアカウントに書き込みます。専栏のコンテンツはHTMLです。末尾に --confirm がない場合はドライランになります。--confirm が有効になるのは最後の引数として指定された場合のみです。必ずドライランの結果を表示し、明示的な「はい」を得てから、再実行してください。

BILI="$SKILL_DIR/scripts/bilibili.py"; [ -f "$BILI" ] || BILI=$(find /tmp -maxdepth 8 -path '*/skills/*/scripts/bilibili.py' 2>/dev/null | head -1)
python3 "$BILI" publish --title "标题" --content-file a.html                       # dry-run
python3 "$BILI" publish --title "标题" --content-file a.html --draft-only --confirm   # save a draft
python3 "$BILI" publish --title "标题" --content-file a.html --confirm                # save draft + submit (publish)
python3 "$BILI" publish --title "标题" --content-file a.html --category 数码 --confirm  # pick the 分类
  • --draft-only は下書きを保存します(送信はしません)— 安全です。編集画面で仕上げて公開してください。ユーザーが公開を明確に依頼していない場合は、こちらを優先してください。送信された記事は審査キューに入ると、この CLI では取り下げられません。
  • 送信(公開)手順は、Bilibili のリスク管理により頻繁にレート制限されます(HTTP 412)。その場合、CLI は保存された下書きと編集 URL を報告します。ユーザーはウェブの編集画面から公開できます。
  • --category は分類を選びます(デフォルトは技術系の投稿に適したデジタル製品です)。使用可能な名前は categories で確認してください。結果には実際に使用された分類が category / category_id として含まれます。ユーザーの選択と異なる場合は、その旨を伝えてください。
公開は即時ではありません — 審査キューに入ります

submit が成功すると、state: -2(審査待ち)および pending_review: true が返されます。 返された url は、Bilibili が承認するまで(通常は数分から数時間)、誰がアクセスしても 404 になります。審査待ちであることをユーザーに伝えてください。公開済みだと伝えたり、再送信したりしないでください。後で status を使って確認してください。審査待ちまたは却下された記事を表示できるのはこれだけです(公開一覧には表示されません)。

python3 "$BILI" status --limit 5    # state_desc: 待审核 / 已发布 / 未通过 (+ reason)

その他の状態は審査待ちではなく、そのまま公開されることもありません — CLI は ok: false および published: false とともに返します(-1 不合格、-3 ロック済み、-4 削除済み)。state_desc を読み、ユーザーに率直に伝えてください。再送信するのではなく、status で reason を確認してください。

公開結果の id は記事 IDです(cv<id> を使用します)。draft_aid とは異なる番号です。共有するのは必ず url フィールドだけにしてください。Bilibili が記事 ID を返さなかった場合、url と id は null になり、id_unverified: true が設定されます — まだ共有できるものはありません。draft_aid からリンクを作るのではなく、status で記事を探してください。

下書きの管理(上限 999 件)

Bilibili の専栏下書きは999 件までです。上限に達すると、新しい下書きの保存は code 37106 草稿数已达最大上限 というエラーで失敗します。下書きを一覧表示し、不要なものを削除してください。

BILI="$SKILL_DIR/scripts/bilibili.py"; [ -f "$BILI" ] || BILI=$(find /tmp -maxdepth 8 -path '*/skills/*/scripts/bilibili.py' 2>/dev/null | head -1)
python3 "$BILI" drafts --limit 50                       # list (aid + title)
python3 "$BILI" delete-draft <aid> <aid2> ...           # dry-run (shows what would delete)
python3 "$BILI" delete-draft <aid> <aid2> ... --confirm # PERMANENTLY delete those drafts
  • delete-draft は承認必須(末尾に --confirm がない限りドライラン)で、削除は取り消せません — 必ずドライランの結果とタイトルを表示し、明示的な「はい」を得てから --confirm を指定してください。複数の aid を渡して、1 回の呼び出しでいくつかまとめて処理できます。
  • むやみに一括削除しないでください。最初に一覧表示し、タイトルが不要なものまたは重複であることを確認してください。

画像

publish は、保存する前に外部画像(<img src> と Markdown の両方)を自動的に Bilibili の CDN(i0.hdslb.com / article.biliimg.com)へ再ホストします。Bilibili は外部画像へのホットリンクをブロックし、外部リンクが残っている場合は記事全体を拒否します(37130)。upcover が拒否する webp 形式のソースは、可能であれば CDN 経由で png にトランスコードされます。それでもアップロードできない画像は、投稿を失敗させるのではなく、記事から削除されます。--no-rehost-images を指定すると、この処理をスキップします。

注意事項

  • これはユーザー本人の実際の Bilibili アカウントです。 公開する前に確認してください。
  • 下書きが問題なく保存されていても、submit は 412(ボット対策)になることがあります。 下書きが信頼できる結果です。submit を繰り返し再試行しないでください。
  • アカウントから投稿できない分类を指定すると -17 が返されます。--category を指定しない場合、CLI はフォールバックリストを使って自動的に再試行します。
  • BILIBILI_COOKIES は絶対に出力しないでください。 アカウントへの完全なアクセス権が含まれています。
  • 利用規約:ユーザー自身が取得した Cookie を使って、ユーザー自身のアカウントに対してのみ操作します。

出力を記録する

公開が正常に完了し、公開済みの結果 URL を取得したら、ユーザーが My Outputs でこの成果物を追跡できるよう、組み込みの publish_artifact ツールを1回呼び出してください。

publish_artifact(kind="article", channel="bilibili", title="<title>", url="<the REAL returned URL>", status="delivered")

実際に返された URL を使用してください。決して捏造してはいけません。これは公開結果の url フィールド(記事の id から生成されたもので、draft_aid ではありません)です。公開済みの各項目につき1回のみ、納品が確認された後に呼び出してください。

  • state: 0 または 1(已发布、公開済み)→ status="delivered"。
  • pending_review: true(待审核、審査待ち)→ status="draft"。この URL はまだ公開されていません。 ユーザーから status による再確認を依頼された場合は、後で納品済みとして再記録してください。
  • 拒否/ロック状態、412 によってブロックされた submit、id_unverified: true、または state_unknown: true → status="failed"(または記録をスキップします)。

_shared/artifacts.md を参照してください。

コメント