问题描述:
最近自己写个Android软件玩玩,试着获取Bilibili的弹幕xml文件,使用OkHttp下载下来后发现是压缩文件需要解压,而且返回的response中的Content-Type = deflate
,指该文件使用了deflate
压缩算法而不是常见的gzip
(gzip
压缩文件OkHttp支持自动解压),于是就要想办法解压获得原文件。
解决方案
先说下b站弹幕api。
b站每个视频都有av号作为标识,而对应的弹幕文件则是用cid(chatid)进行标识,两者之间没有换算关系。
要根据av号获得对应的cid,需要先获取视频网页,再利用正则表达式从网页源码中寻找cid。
代码如下:
public void getCID(int avNumber) {
OkHttpClient client = new OkHttpClient();
final Request request = new Request.Builder()
.get()
.url("https://www.bilibili.com/video/av" + String.valueOf(avNumber))
.build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
html = response.body().string();
Pattern pattern = Pattern.compile("cid=(.*?)&aid=");
Matcher matcher = pattern.matcher(html);
if (matcher.find()) {
cid = matcher.group(1);
} else {
cid = " ";
}
Log.d(