疑问:请问如何解压 B 站弹幕文件?

2019-07-15 08:16:43 +08:00
 evenIfAlsoGo

这个问题困扰了两三天,目前一步一步分析出来应该是解压的问题。请问此文件到底是什么解压方式?该如何通过工具解压?

文件示例: https://api.bilibili.com/x/v1/dm/list.so?oid=71163662

部分 Header:

Content-Encoding: deflate

Content-Type: text/xml

Transfer-Encoding: chunked

Accept-Encoding: gzip, deflate, br

最初:采用 Aria2 下载时,已添加 --http-accept-gzip,但依旧报错,incorrect header check

Exception: [AbstractCommand.cc:350] errorCode=1 URI=https://api.bilibili.com/x/v1/dm/list.so?oid=71163662 -> [GZipDecodingStreamFilter.cc:110] errorCode=1 libz::inflate() failed. cause:incorrect header check

已尝试的方法:

① curl -O url --compressed,成功解压,文件正常显示!唯一成功的途径。

② bandzip 为文件损坏,gzip 为 not in gzip format

③ fs.readFile('1.gz', function(err, data){ console.log(data) })

Buffer 94 bd 5b 73 5c 49 72 26 f8 57 30 78 18 d3 8c 38 47 e1 11 ee 1e 11 36 25 68 6a ba 5b 9a b5 51 4b 6d dd db 3b ad 7d 59 4b 24 12 dd 1c 75 b1 ca ea 22 55 ...

④ node.js:Gunzip/Inflate, Error: incorrect header check

const fs = require('fs'), zlib = require('zlib') fs.createReadStream('./1.gz').pipe(zlib.createGunzip()).pipe(fs.createWriteStream('1.xml')) console.log("文件解压完成。")

希望大家可以帮忙看看,感激不尽!

4927 次点击
所在节点    程序员
34 条回复
ztcaoll222
2019-07-15 08:24:25 +08:00
这不是个 xml 文件吗, 不能直接解析吗
mystrylw
2019-07-15 08:28:37 +08:00
+1 浏览器直接打开识别为 xml 了
evenIfAlsoGo
2019-07-15 08:29:36 +08:00
@ztcaoll222 主要是想根据 URL 把文件下载下来用
evenIfAlsoGo
2019-07-15 08:30:31 +08:00
@mystrylw 不通过浏览器,比如使用 aria2 进行下载
ztcaoll222
2019-07-15 08:35:58 +08:00
@evenIfAlsoGo #3 你下载下来的文件不能当 xml 解析吗
evenIfAlsoGo
2019-07-15 08:41:38 +08:00
@ztcaoll222 直接 ctrl+s 是 xml,但是使用下载工具通过 URL 下载就不可以。忘记说明了:只通过 URL 下载下来的文件是 46K 左右,解压后可正常查看的文件是 114KB。
littlewing
2019-07-15 08:47:29 +08:00
header 不全
des
2019-07-15 08:50:20 +08:00
第一,curl 和浏览器能正常下载和打开,说明你的下载方式有问题
第二,not in gzip format 以及各种解压报错说明这个文件根本不是 gzip 文件,我不知道为啥你坚信这是个 gz 文件,不信你自己用 file 命令看看
第三,你也不熟悉 http,因为根本就不是压缩文件,那个压缩只是传输过程中的压缩,是透明的,不需要你处理。个人猜测是你把 Accept-Encoding: gzip, deflate, br 这个 header 复制进去了,然后 aria2 还不支持
littlewing
2019-07-15 08:51:29 +08:00
Accept-Encoding 头去掉
darlinghsu
2019-07-15 08:52:56 +08:00
油猴上 有关于 哔哩哔哩的脚本?/哔哩哔哩助手扩展程序 可以下载 xml 字幕 和 ass 字幕 可以看看
ztcaoll222
2019-07-15 08:52:59 +08:00
@evenIfAlsoGo #6
伪造个 ua 就可以了
des
2019-07-15 09:02:17 +08:00
@evenIfAlsoGo 抱歉,事先没有测试就妄下结论了,希望不要介意
expy
2019-07-15 09:03:22 +08:00
大概是这个:Transfer-Encoding: chunked 要先解码,在解压。

https://en.wikipedia.org/wiki/Chunked_transfer_encoding
dingyx99
2019-07-15 09:14:47 +08:00
B 站弹幕不是 xml 嘛。。而且获取弹幕不是直接通过 comment.bilibili.com/aid.xml 就能直接拖下来的吗?
zsdroid
2019-07-15 09:20:06 +08:00
php 是世界上最好的语言
```
$url = 'https://api.bilibili.com/x/v1/dm/list.so?oid=71163662';
$data = file_get_contents($url);
$data = gzinflate($data);
var_dump($data);
```
lzvezr
2019-07-15 09:20:55 +08:00
用 nodejs 了为什么不直接用 request 模块呢
evenIfAlsoGo
2019-07-15 09:22:39 +08:00
@littlewing 去掉也是的,采用 IDM 下载是相同的文件。可能是下载工具的原因,刚用其他工具下载,没有问题。可能是里面有 transfer-encoding: chunked,部分工具不支持。
evenIfAlsoGo
2019-07-15 09:58:56 +08:00
@des 你说的基本没错,我的方向有错误,问题不是解压方式而是下载工具,这个过程应该不需要我 /用户的参与。不过我没有坚信它是 gzip,要不也不会问是什么方式。此处我的思路出现了矛盾,它本身是 chunked+gzip,我还问怎么解压干啥...一直看 gzip 迷了,而且觉得应该我来处理(当然多学一些也不错)。此外又刚才测试了其他工具,成功下载。

不过目前我对 HTTP 的理解确实不够扎实,谢谢你的回复。
evenIfAlsoGo
2019-07-15 10:04:44 +08:00
@expy 对的,IDM 和 Aria2 可能不支持这种方式,所以导致这个问题的出现。并且我标题应该问如何用工具解析,而不是如何解压。
evenIfAlsoGo
2019-07-15 10:07:29 +08:00
@dingyx99 需要通过下载工具和 URL 来下载,不采用浏览器的方式。获取弹幕这两个 API 都可以,目前网站采用的是 list.so?oid=cid 这个。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/582958

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX