diff options
Diffstat (limited to 'content/posts/写一个下载B站视频的小工具.md')
| -rw-r--r-- | content/posts/写一个下载B站视频的小工具.md | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/content/posts/写一个下载B站视频的小工具.md b/content/posts/写一个下载B站视频的小工具.md new file mode 100644 index 0000000..795acfa --- /dev/null +++ b/content/posts/写一个下载B站视频的小工具.md @@ -0,0 +1,104 @@ +--- +date: '2025-11-08T12:20:36+08:00' +draft: true +title: '写一个下载B站视频的小工具' +slug: 'download-bilibili-video-with-golang' +categories: + - 往昔 +tags: + - Golang +--- +## 前置条件 + +Bilibili的视频接口链接是这样的 + +``` +https://api.bilibili.com/x/player/playurl?fnval=80&cid=746904707&bvid=BV1pT41157it +``` + +- avid可以用bvid,也就是视频的BV号代替 +- cid的值可以通过aid获取,它是每个视频的分p编号,同个av号视频里的每p视频都有不同cid值[^1] + +json数据中,`baseUrl`就是视频下载链接,根据清晰度的不同,有多条下载链接。 + +### 构造请求 + +#### 获得 cid + +``` +https://api.bilibili.com/x/player/pagelist?bvid=填写视频的BV号 +``` + +使用这个接口也是可以得到cid的 + +``` +https://api.bilibili.com/x/web-interface/view?bvid= +``` + + +一个标准的B站视频网页PC端链接是这样的: + +``` +https://www.bilibili.com/video/BV1YUs5zVE2w/ +``` + +最后以BV开头的字符就是BV号。我们可以得到以下链接: + +``` +https://api.bilibili.com/x/player/pagelist?bvid=BV1YUs5zVE2w +``` + +对这个url发送请求,可以得到以下内容 +```json +{ + "code": 0, + "message": "0", + "ttl": 1, + "data": [ + { + "cid": 33335151537, // 我们需要的cid + "page": 1, + "from": "vupload", + "part": "防波堤にいた白猫をナデナデしたらコロコロ転がって落ちた", + "duration": 172, + "vid": "", + "weblink": "", + "dimension": { "width": 1920, "height": 1080, "rotate": 0 }, + "first_frame": "http://i2.hdslb.com/bfs/storyff/_000003dxlmk3m5bg52v8f5zbx7p5hyb_firsti.jpg", + "ctime": 1761233073 + } + ] +} + +``` + +#### 构造下载链接 + +这个结构有cid和bvid两个参数: + +``` +https://api.bilibili.com/x/player/playurl?fnval=80&cid=&bvid= +``` + +根据上面的结果,我们可以构造以下url: +``` + https://api.bilibili.com/x/player/playurl?fnval=80&cid=33335151537&bvid=BV1YUs5zVE2w +``` + +这个url返回的数据中,baseUrl即为下载链接。 + +## 写代码 + +我们需要做的事有: + +- 发送网络请求 +- json 解析 +- 文件IO +- 日志输出 + +### 网络请求 + +在go语言中,发送http请求的最简单方法就是使用`net/http` + + +[^1]: https://zhuanlan.zhihu.com/p/541308878 |
