bilibili について
ユーザーが取得した Cookie を使い、標準ライブラリのみの Python コマンドラインツールで Bilibili の記事を読み書きするスキルです。公開や下書き管理には確認手順があります。
主な機能
- 01アカウントと記事の統計確認
- 02記事・下書き・状態の一覧
- 03記事の投稿と下書き保存
- 04外部画像の再ホスト
- 05投稿・削除前の確認
活用シーン
- 01記事の閲覧数や反応の確認
- 02記事を下書きとして保存
- 03明示的な承認後に記事を投稿
- 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 を参照してください。