b漫24年底更新之后,加入了大量加密,之前写的下载工具不能用了。这次重新读了源码重写了程序,记录一下。
首先是我的各大平台解码下载图片的chrome插件项目:https://github.com/heixxxxxx/ebook_comic_download
b漫这次更新后我已经修改代码,能支持现在的下载了。
这次更新主要就是在原本基础上对图片二进制内容进行了加密。
1.生成密钥对
//生成密钥对
const keyPair = await window.crypto.subtle.generateKey(
{
name: "ECDH",
namedCurve: "P-256", // 椭圆曲线 P-256
},
true, // 是否可以导出密钥
["deriveKey", "deriveBits"] // 密钥用途
);
//导出公钥 ArrayBuffer(65)
const rawKey = await window.crypto.subtle.exportKey(
"raw", // 导出为原始格式
keyPair.publicKey
);
//导出私钥
const jwkKey = await window.crypto.subtle.exportKey(
"jwk", // 导出为 JWK 格式
keyPair. privateKey
);
2.关键api:/ImageToken 入参增加了一个nov
https://manga.bilibili.com/twirp/comic.v1.Comic/ImageToken?device=pc&platform=web&nov=25
请求参数为: urls:前一个api(https://manga.bilibili.com/twirp/comic.v1.Comic/GetImageIndex?device=pc&platform=web) 获得的图片列表
m1:公钥
{
m1: btoa(String['fromCharCode'].apply(null, new Uint8Array(rawKey))),
urls: JSON.stringify(imgList) //图片列表,从上一个api获取
}
响应返回值为携带了token等参数的图片地址。
3.从源码中获得的解密文件:https://activity.hdslb.com/blackboard/static/20241213/79521623691a9889a71defd0f4d0a43b/QXcpEfojI5.js
直接引入使用就行。这个js会在window上暴露一个方法,render_hw
该方法接收两个参数,第一个参数为上述返回的带token的图片地址,第二个参数是私钥
render_hw(url, btoa(JSON['stringify'](jwkKey)))
该方法在运行过程中返回blob链接即为图片链接。