summaryrefslogtreecommitdiffstats
path: root/content/posts/写一个下载B站视频的小工具.md
diff options
context:
space:
mode:
Diffstat (limited to 'content/posts/写一个下载B站视频的小工具.md')
-rw-r--r--content/posts/写一个下载B站视频的小工具.md104
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