A comprehensive Bilibili toolkit that integrates hot trending monitoring, video downloading, video watching/playback, subtitle downloading, and video publishing capabilities into a single unified skill.
⚠️ Optional Environment Variables:
BILIBILI_SESSDATA,BILIBILI_BILI_JCT(optional),BILIBILI_BUVID3(optional),BILIBILI_PERSIST(optional) These are sensitive Bilibili session cookies needed only for publishing and high-quality (1080p+/4K) downloads. Most features work WITHOUT any credentials: hot monitoring, standard-quality downloads, subtitle listing, danmaku, stats viewing.📦 Install:
pip install -r requirements.txt(all standard PyPI packages: httpx, aiohttp, beautifulsoup4, lxml, requests)🔗 Source: github.com/wscats/bilibili-all-in-one
当用户 明确请求 以下 Bilibili 相关操作时,本 Skill 可被激活:
触发场景匹配的模块典型触发词查看B站热门、热搜、排行榜、必看榜🔥 Hot Monitor"热门"、"热搜"、"排行"、"趋势"、"必看"、"流行"、"榜单"下载B站视频、提取音频、批量下载⬇️ Downloader"下载"、"保存视频"、"提取音频"、"导出MP4"、"批量下载"查看视频播放量、点赞数、数据追踪、对比👀 Watcher"播放量"、"点赞"、"数据"、"统计"、"对比"、"监控"、"追踪"、"观看量"下载字幕、转换字幕格式、合并字幕📝 Subtitle"字幕"、"CC"、"SRT"、"ASS"、"字幕下载"、"字幕转换"、"翻译"播放视频、获取弹幕、播放列表▶️ Player"播放"、"弹幕"、"播放地址"、"分P"、"播放列表"、"danmaku"上传视频、发布、定时发布、草稿、编辑📤 Publisher"上传"、"发布"、"投稿"、"定时发布"、"草稿"、"编辑视频"
⚠️ 注意:本 Skill 不会仅因消息中出现 Bilibili 链接或 BV 号就自动激活。只有当用户明确表达了操作意图(如"下载这个视频"、"查看热门"等)时才会被调用。涉及写操作(发布/编辑)时,需要用户显式提供凭证。
ModuleDescription🔥 Hot MonitorMonitor Bilibili hot/trending videos and topics in real-time⬇️ DownloaderDownload Bilibili videos with multiple quality and format options👀 WatcherWatch and track video engagement metrics (supports Bilibili)📝 SubtitleDownload and process subtitles in multiple formats and languages▶️ PlayerGet playback URLs, danmaku (bullet comments), and playlist info📤 PublisherUpload, schedule, edit, and manage videos on Bilibili
bash
pip install -r requirements.txt
httpx >= 0.24.0aiohttp >= 3.8.0beautifulsoup4 >= 4.12.0lxml >= 4.9.0requests >= 2.31.0faster-whisper >= 1.0.0 (optional, for speech recognition subtitle fallback)Some features (downloading high-quality videos, publishing, etc.) require Bilibili authentication. You can provide credentials in three ways:
bash
export BILIBILI_SESSDATA="your_sessdata"
export BILIBILI_BILI_JCT="your_bili_jct"
export BILIBILI_BUVID3="your_buvid3"
Create a JSON file (e.g., credentials.json):
json
{
"sessdata": "your_sessdata",
"bili_jct": "your_bili_jct",
"buvid3": "your_buvid3"
}
Pass credentials directly when initializing:
python
from main import BilibiliAllInOne
app = BilibiliAllInOne(
sessdata="your_sessdata",
bili_jct="your_bili_jct",
buvid3="your_buvid3",
)
By default, credentials are kept in-memory only and are not saved to disk. To enable automatic persistence across sessions:
bash
# Via environment variable
export BILIBILI_PERSIST=1
python
# Or via code
app = BilibiliAllInOne(persist=True)
When persistence is enabled:
.credentials.json (with 0600 permissions) after initializationapp.auth.persist = True / app.auth.persist = Falseapp.auth.clear_persisted()How to get cookies: Log in to bilibili.com, open browser DevTools (F12) → Application → Cookies, and copy the values of
SESSDATA,bili_jct, andbuvid3.
This skill handles sensitive Bilibili session cookies. Please read the following carefully:
ConcernDetailWhat credentials are needed?SESSDATA, bili_jct, buvid3 — Bilibili full browser session cookies (not limited API keys). Providing them grants broad access to your Bilibili account.**Which features require authentication?Publishing (upload/edit/schedule/draft), downloading 1080p+/4K quality videosWhich features work WITHOUT credentials?Hot monitoring, standard-quality downloads, subtitle listing, danmaku fetching, stats viewingWhere are credentials sent?To official Bilibili API endpoints ( api.bilibili.com, member.bilibili.com) over HTTPS onlyAre credentials persisted to disk?**NO by default — credentials stay in memory. Set persist=True or BILIBILI_PERSIST=1 to opt-in to automatic persistence (saved to .credentials.json with 0600 permissions). You can also manually call auth.save_to_file()File permissions for saved credentials0600 (owner read/write only) — restrictive by default
persist=True if you need credentials to survive across sessions.0600 permissions. Use auth.clear_persisted() or auth.persist = False to remove the file when no longer needed.SESSDATA and bili_jct are full session cookies. They are NOT scoped/limited API keys. Treat them with the same care as your account password.DomainPurposeapi.bilibili.comVideo info, stats, hot lists, subtitles, danmaku, playback URLsmember.bilibili.comVideo publishing (upload, edit)upos-sz-upcdnbda2.bilivideo.comVideo file upload CDNwww.bilibili.comWeb page scraping fallback
ModuleAuth Required?Notes🔥 Hot Monitor❌ NoAll public APIs⬇️ Downloader⚠️ OptionalRequired only for 1080p+ / 4K quality👀 Watcher❌ NoPublic stats APIs📝 Subtitle❌ NoPublic subtitle APIs▶️ Player⚠️ OptionalRequired for high-quality playback URLs📤 Publisher✅ RequiredAll operations need SESSDATA + bili_jct
bash
python main.py <skill_name> <action> [params_json]
python
import asyncio
from main import BilibiliAllInOne
app = BilibiliAllInOne()
async def demo():
result = await app.execute("hot_monitor", "get_hot", limit=5)
print(result)
asyncio.run(demo())
bilibili_hot_monitor)#Monitor Bilibili hot/trending videos and topics in real-time. Supports filtering by category, tracking rank changes.
ActionDescriptionParametersget_hotGet popular/hot videospage, page_size``get_trendingGet trending series/topicslimit``get_weeklyGet weekly must-watch listnumber (week number, optional)get_rankGet category ranking videoscategory, limit
all, anime, music, dance, game, tech, life, food, car, fashion, entertainment, movie, tv
bash
# Get top 10 hot videos
python main.py hot_monitor get_hot '{"page_size": 10}'
# Get trending topics
python main.py hot_monitor get_trending '{"limit": 5}'
# Get this week's must-watch
python main.py hot_monitor get_weekly
# Get game category rankings
python main.py hot_monitor get_rank '{"category": "game", "limit": 10}'
python
# Python API
result = await app.execute("hot_monitor", "get_hot", page_size=10)
result = await app.execute("hot_monitor", "get_rank", category="game", limit=10)
bilibili_downloader)#Download Bilibili videos with support for multiple quality options, batch downloading, and format selection.
ActionDescriptionParametersget_infoGet video informationurl``get_formatsList available qualities/formatsurl``downloadDownload a single videourl, quality, output_dir, format, page``batch_downloadDownload multiple videosurls, quality, output_dir, format
360p, 480p, 720p, 1080p (default), 1080p+, 4k
mp4 (default), flv, mp3 (audio only)
bash
# Get video info
python main.py downloader get_info '{"url": "BV1xx411c7mD"}'
# List available formats
python main.py downloader get_formats '{"url": "BV1xx411c7mD"}'
# Download in 1080p MP4
python main.py downloader download '{"url": "BV1xx411c7mD", "quality": "1080p", "format": "mp4"}'
# Extract audio only
python main.py downloader download '{"url": "BV1xx411c7mD", "format": "mp3"}'
# Batch download
python main.py downloader batch_download '{"urls": ["BV1xx411c7mD", "BV1yy411c8nE"], "quality": "720p"}'
python
# Python API
info = await app.execute("downloader", "get_info", url="BV1xx411c7mD")
result = await app.execute("downloader", "download", url="BV1xx411c7mD", quality="1080p")
bilibili_watcher)#Watch and monitor Bilibili videos. Track view counts, comments, likes, and other engagement metrics over time.
ActionDescriptionParameterswatchGet detailed video informationurl``get_statsGet current engagement statisticsurl``trackTrack metrics over timeurl, interval (minutes), duration (hours)compareCompare multiple videosurls
https://www.bilibili.com/video/BVxxxxxx or BVxxxxxxbash
# Get video details
python main.py watcher watch '{"url": "BV1xx411c7mD"}'
# Get current stats
python main.py watcher get_stats '{"url": "BV1xx411c7mD"}'
# Track views every 30 minutes for 12 hours
python main.py watcher track '{"url": "BV1xx411c7mD", "interval": 30, "duration": 12}'
# Compare multiple videos
python main.py watcher compare '{"urls": ["BV1xx411c7mD", "BV1yy411c8nE"]}'
python
# Python API
comparison = await app.execute("watcher", "compare", urls=["BV1xx411c7mD", "BV1yy411c8nE"])
bilibili_subtitle)#Download and process subtitles/CC from Bilibili videos. Supports multiple subtitle formats and languages.
When no CC subtitles are available, the module automatically falls back to:
faster-whisper (requires pip install faster-whisper)Both fallback results are returned together when triggered.
ActionDescriptionParameterslistList available subtitlesurl``downloadDownload subtitles (with auto-fallback)url, language, format, output_dir``convertConvert subtitle formatinput_path, output_format, output_dir``mergeMerge multiple subtitle filesinput_paths, output_path, output_format
srt (default), ass, vtt, txt, json
zh-CN (default), en, ja, and other language codes available on the video.
When download is called and no CC subtitles exist:
text
CC Subtitle Available? ──Yes──▶ Download CC subtitle
│
No
│
▼
┌─────────────────────────────────────┐
│ Fallback 1: Speech Recognition │
│ Download audio → faster-whisper │
│ Output: {title}_transcribed.srt │
├─────────────────────────────────────┤
│ Fallback 2: Danmaku Extraction │
│ Fetch bullet comments → SRT │
│ Output: {title}_danmaku.srt │
└─────────────────────────────────────┘
bash
# List available subtitles
python main.py subtitle list '{"url": "BV1xx411c7mD"}'
# Download Chinese subtitles in SRT format (auto-fallback if no CC)
python main.py subtitle download '{"url": "BV1xx411c7mD", "language": "zh-CN", "format": "srt"}'
# Download English subtitles in ASS format
python main.py subtitle download '{"url": "BV1xx411c7mD", "language": "en", "format": "ass"}'
# Convert SRT to VTT
python main.py subtitle convert '{"input_path": "./subtitles/video.srt", "output_format": "vtt"}'
# Merge subtitle files
python main.py subtitle merge '{"input_paths": ["part1.srt", "part2.srt"], "output_path": "merged.srt"}'
python
# Python API
subs = await app.execute("subtitle", "list", url="BV1xx411c7mD")
result = await app.execute("subtitle", "download", url="BV1xx411c7mD", language="zh-CN", format="srt")
# When no CC subtitles, result includes both fallback outputs:
# result["transcription"]["filepath"] → speech recognition SRT
# result["danmaku"]["filepath"] → danmaku SRT
bilibili_player)#Play Bilibili videos with support for playback control, playlist management, and danmaku (bullet comments) display.
ActionDescriptionParametersplayGet complete playback infourl, quality, page``get_playurlGet direct play URLsurl, quality, page``get_danmakuGet danmaku/bullet commentsurl, page, segment``get_playlistGet playlist/multi-part infourl
ModeDescription1Scroll (right to left)4Bottom fixed5Top fixed
bash
# Get playback info
python main.py player play '{"url": "BV1xx411c7mD", "quality": "1080p"}'
# Get direct play URLs
python main.py player get_playurl '{"url": "BV1xx411c7mD", "quality": "720p"}'
# Get danmaku
python main.py player get_danmaku '{"url": "BV1xx411c7mD"}'
# Get playlist for multi-part video
python main.py player get_playlist '{"url": "BV1xx411c7mD"}'
# Get page 3 of a multi-part video
python main.py player play '{"url": "BV1xx411c7mD", "quality": "1080p", "page": 3}'
python
# Python API
play_info = await app.execute("player", "play", url="BV1xx411c7mD", quality="1080p")
danmaku = await app.execute("player", "get_danmaku", url="BV1xx411c7mD")
playlist = await app.execute("player", "get_playlist", url="BV1xx411c7mD")
bilibili_publisher)#Publish videos to Bilibili. Supports uploading videos, setting metadata, scheduling publications, and managing drafts.
⚠️ Authentication Required: All publisher actions require valid Bilibili credentials.
ActionDescriptionParametersuploadUpload and publish a videofile_path, title, description, tags, category, cover_path, dynamic, no_reprint, open_elec``draftSave as draftfile_path, title, description, tags, category, cover_path``scheduleSchedule future publicationfile_path, title, schedule_time, description, tags, category, cover_path``editEdit existing video metadatabvid, file_path, title, description, tags, cover_path
ParameterTypeDefaultDescriptionfile_pathstring_required_Path to the video filetitlestring_required_Video title (max 80 chars)descriptionstring""Video description (max 2000 chars)tagsstring[]["bilibili"]Tags (max 12, each max 20 chars)categorystring"171"Category TIDcover_pathstringnullPath to cover image (JPG/PNG)no_reprintint11 = original content, 0 = repostopen_elecint01 = enable charging, 0 = disable
bash
# Upload and publish
python main.py publisher upload '{"file_path": "./video.mp4", "title": "My Video", "description": "Hello World", "tags": ["test", "demo"], "category": "171"}'
# Save as draft
python main.py publisher draft '{"file_path": "./video.mp4", "title": "Draft Video"}'
# Schedule publication
python main.py publisher schedule '{"file_path": "./video.mp4", "title": "Scheduled Video", "schedule_time": "2025-12-31T20:00:00+08:00"}'
# Edit video metadata (requires re-uploading the video file)
python main.py publisher edit '{"bvid": "BV1xx411c7mD", "file_path": "./video.mp4", "title": "New Title", "tags": ["updated"]}'
python
# Python API (authentication required)
app = BilibiliAllInOne(sessdata="xxx", bili_jct="xxx", buvid3="xxx")
result = await app.execute("publisher", "upload",
file_path="./video.mp4",
title="My Video",
description="Published via bilibili-all-in-one",
tags=["python", "bilibili"],
)
# Edit video (requires file_path for re-upload)
result = await app.execute("publisher", "edit",
bvid="BV1xx411c7mD",
file_path="./video.mp4",
title="New Title",
tags=["updated"],
)
text
bilibili-all-in-one/
├── skill.json # Skill configuration & parameter schema
├── skill.md # This documentation file
├── README.md # Project README (Chinese)
├── LICENSE # MIT License
├── requirements.txt # Python dependencies
├── .gitignore # Git ignore rules
├── main.py # Entry point & unified BilibiliAllInOne class
└── src/
├── __init__.py # Package exports
├── auth.py # Authentication & credential management
├── utils.py # Shared utilities, API constants, helpers
├── hot_monitor.py # Hot/trending video monitoring
├── downloader.py # Video downloading
├── watcher.py # Video watching & stats tracking
├── subtitle.py # Subtitle downloading & processing
├── player.py # Video playback & danmaku
└── publisher.py # Video uploading & publishing
All skill actions return a JSON object with a unified structure:
json
{
"success": true,
"...": "action-specific fields"
}
On error:
json
{
"success": false,
"message": "Error description"
}
MIT