一个基于Go + Gin + GORM的B站DASH音频解析服务,支持通过BV号获取音频资源并自动下载转换为MP3格式提供本地访问。
注意:
本项目完全使用 AI 生成,是作者对 AI 工具流的实验。
- 需求文档撰写:豆包网页版
- 开发文档撰写:Claude Sonnet 4 (忘记跟踪文件,导致文件内容丢失)
- 代码开发:Claude Sonnet 4
- 文档审查:hazuki-keatsu
- 代码审查:hazuki-keatsu
- Commit Message:Tongyi
- 🎵 音频解析: 支持B站BV号解析,获取DASH格式音频流
- 🔄 自动下载: 自动下载m4s音频文件并转换为MP3格式
- 🛠️ 格式转换: 使用FFmpeg将音频转换为通用的MP3格式
- 🔗 本地服务: 返回服务器本地MP3文件链接,避免防盗链问题
- 🔄 WBI签名: 实现B站WBI签名算法,确保请求合法性
- 💾 智能缓存: 本地文件缓存 + 数据库记录,提升响应速度
- 🛡️ 安全防护: IP限流、参数验证、错误处理
- 📊 状态监控: 服务状态查询、健康检查接口
- 🌐 跨域支持: 配置灵活的CORS策略
- Go 1.21+
- FFmpeg (用于音频格式转换)
- SQLite (默认) 或 MySQL
- 克隆项目
git clone https://github.com/hazuki-keatsu/bili-audio-parse-api.git
cd bili-audio-parse-api- 安装依赖
go mod tidy- 安装FFmpeg (如果未安装)
# Ubuntu/Debian
sudo apt update && sudo apt install ffmpeg
# CentOS/RHEL
sudo yum install epel-release && sudo yum install ffmpeg
# macOS
brew install ffmpeg
# 验证安装
ffmpeg -version- 创建配置文件
cp configs/config.example.yaml configs/config.yaml- 创建必要目录和文件
mkdir -p parse_cache logs
touch data.db- 运行服务
go run cmd/server/main.go服务将在 http://localhost:8080 启动
- 使用Docker Compose (推荐)
docker-compose up -d- 或使用Docker
docker build -t bili-parse-api .
docker run -p 8080:8080 -v $(pwd)/parse_cache:/root/parse_cache bili-parse-apicd bili-parse-api
go build ./cmd/serverGET /api/v1/parse
参数:
bv(必须): B站视频BV号,如BV1xx411c7mDquality(可选): 音质代码,如30280(192K),默认为最高音质
响应示例:
{
"success": true,
"code": 0,
"message": "success",
"data": {
"url": "/static/BV1xx411c7mD_30280_1694123456.mp3",
"original_url": "https://xy.mcdn.bilivideo.cn/path/to/audio.m4s",
"format": "mp3",
"bitrate": 192,
"duration": 180,
"quality": 30280,
"size": 4096000,
"file_name": "BV1xx411c7mD_30280_1694123456.mp3",
"expiring": 3600
}
}说明:
url: 本地MP3文件的访问路径,可直接用于播放original_url: 原始B站音频链接file_name: 本地缓存的文件名expiring: 剩余过期时间(秒),-1表示永不过期,number类型,单位是秒
GET /api/v1/status
响应示例:
{
"success": true,
"code": 0,
"message": "success",
"data": {
"alive": true,
"loginStatus": {
"anonymous": "valid"
},
"stats": {
"cache_count": 1250,
"total_requests": 5680
}
}
}GET /api/v1/health
响应示例:
{
"success": true,
"code": 0,
"message": "success",
"data": {
"status": "healthy"
}
}# 解析音频
curl "http://localhost:8080/api/v1/parse?bv=BV1xx411c7mD"
# 指定音质解析
curl "http://localhost:8080/api/v1/parse?bv=BV1xx411c7mD&quality=30280"
# 检查服务状态
curl "http://localhost:8080/api/v1/status"
# 检查健康状态
curl "http://localhost:8080/api/v1/health"
# 直接下载MP3文件
curl -o "audio.mp3" "http://localhost:8080/static/BV1xx411c7mD_30280_1694123456.mp3"// 解析音频
fetch('http://localhost:8080/api/v1/parse/audio?bvid=BV1xx411c7mD')
.then(response => response.json())
.then(data => {
if (data.success) {
console.log('本地MP3链接:', data.data.url);
// 直接使用本地链接播放,无需处理防盗链
const audio = new Audio('http://localhost:8080' + data.data.url);
audio.play();
// 或者提供下载链接
const downloadLink = document.createElement('a');
downloadLink.href = 'http://localhost:8080' + data.data.url;
downloadLink.download = data.data.file_name;
downloadLink.click();
}
});import requests
import os
# 解析音频
response = requests.get('http://localhost:8080/api/v1/parse/audio', params={
'bvid': 'BV1xx411c7mD',
'quality': 30280
})
data = response.json()
if data['success']:
local_url = data['data']['url']
file_name = data['data']['file_name']
print(f"本地MP3链接: http://localhost:8080{local_url}")
# 下载MP3文件到本地
mp3_response = requests.get(f"http://localhost:8080{local_url}")
with open(file_name, 'wb') as f:
f.write(mp3_response.content)
print(f"音频已保存为: {file_name}")配置文件位于 configs/config.yaml,主要配置项:
server:
host: "0.0.0.0" # 监听地址
port: "8080" # 监听端口
debug: false # 调试模式
cache:
dir: "./parse_cache" # 缓存目录
ttl: "24h" # 缓存过期时间
cleanup_interval: "1h" # 清理间隔
rate_limit:
enabled: true # 是否启用限流
requests_per_minute: 20 # 每分钟请求限制
ffmpeg:
path: "ffmpeg" # FFmpeg可执行文件路径 (可选)
timeout: "5m" # 转换超时时间- 接收请求: 用户通过API传入BV号
- 获取信息: 使用WBI签名算法获取视频信息和播放地址
- 解析音频: 从DASH格式中提取最佳音质的音频流URL
- 下载转换: 下载m4s格式音频文件并使用FFmpeg转换为MP3
- 缓存存储: 将转换后的MP3文件存储在本地缓存目录
- 返回链接: 返回本地MP3文件的访问链接
✅ 无防盗链问题: 音频文件存储在本地服务器,避免B站防盗链限制
✅ 格式通用性: 转换为MP3格式,兼容性更好
✅ 访问速度快: 本地文件访问,响应速度快
✅ 支持下载: 可直接下载MP3文件到本地
✅ 缓存机制: 相同内容无需重复下载转换
| 代码 | 音质 | 说明 |
|---|---|---|
| 30216 | 64K | 低音质 |
| 30232 | 132K | 中音质 |
| 30280 | 192K | 高音质 |
| 30250 | 杜比全景声 | 需要大会员 |
| 30251 | Hi-Res无损 | 需要大会员 |
- 仅供学习: 本项目仅用于技术学习和研究,请遵守B站用户协议
- 存储空间: 音频文件会占用本地存储空间,建议定期清理缓存
- FFmpeg依赖: 需要系统安装FFmpeg,确保转换功能正常
- 转换时间: 首次请求需要下载转换时间,后续访问缓存文件速度快
- 权限限制: 某些音频需要登录或大会员权限才能获取
- 请求频率: 请合理控制请求频率,避免触发B站风控
-
获取音频失败
- 检查BV号格式是否正确
- 确认视频是否存在且可访问
- 检查网络连接
-
FFmpeg转换失败
- 确认FFmpeg已正确安装:
ffmpeg -version - 检查FFmpeg路径配置
- 查看日志文件获取详细错误信息
- 确认FFmpeg已正确安装:
-
文件下载失败
- 检查网络连接稳定性
- 确认parse_cache目录有写入权限
- 检查磁盘剩余空间
-
请求被限流
- 降低请求频率
- 检查IP是否被B站风控
-
缓存目录权限错误
- 确保应用有写入权限:
chmod 755 parse_cache - 检查磁盘空间是否充足
- 确保应用有写入权限:
bili-parse-api/
├── cmd/server/ # 程序入口
├── internal/
│ ├── api/ # API层
│ │ ├── handlers/ # 请求处理器
│ │ ├── middleware/ # 中间件
│ │ └── routes/ # 路由配置
│ ├── core/ # 核心业务逻辑
│ │ ├── audio/ # 音频下载转换
│ │ ├── bilibili/ # B站API交互
│ │ ├── cache/ # 缓存管理
│ │ └── config/ # 配置管理
│ ├── models/ # 数据模型
│ └── utils/ # 工具函数
├── configs/ # 配置文件
├── parse_cache/ # 音频缓存目录
└── logs/ # 日志目录
- WBI签名模块: 实现B站WBI签名算法,保证API请求的合法性
- 音频下载器: 下载m4s格式音频并使用FFmpeg转换为MP3
- 缓存管理器: 管理本地文件缓存和数据库记录
- 静态文件服务: 提供MP3文件的HTTP访问服务
- Fork 项目
- 创建特性分支
- 提交代码
- 发起 Pull Request
本项目采用 MIT 许可证 - 详见 LICENSE 文件
如果这个项目对你有帮助,欢迎 ⭐ Star 支持!
免责声明: 本项目仅供学习交流使用,请勿用于商业用途。使用者需自行承担使用风险。