本帖最后由 anhualong 于 2021-8-11 08:48 编辑
云听app有些精品资源需付费才能下载,但是他的分享页面可获取到资源地址,所以可以通过分享出来的页面来下载
具体步骤
- 在云听app中打开书籍首页,点击右上角分享获取连接,如《大唐春色》地址 https://ytweb.radio.cn/share/albumDetail?columnId=16030969934410
- 浏览器中打开获取到的地址,通过调试可发现获取信息接口是
/wifimusicbox/demand/detail ,返回信息中有MP3地址如高清地址playUrlHigh
- 在资源中查找到获取资源的代码,在
app.ebab1436.js 中,在请求前打断点,刷新
- 每次请求只有20集,可修改页码
pageIndex 循环主动请求所有信息,for循环修改页码请求,然后只需获取MP3地址下载就可以了。
具体代码在下面,可复制进控制台回车执行,然后继续执行即可获取到所有信息并下载,因为浏览器并行请求有限制,所以修改为同步下载
- 为方便使用可用chrome浏览器的覆盖功能,直接把
app.ebab1436.js 修改为我们需要的代码,把代码复制到getDemandDetail 方法中,刷新打开即可下载所有资源
创建本地覆盖,随便保存个地方,把下载下来的js文件修改为我们需要的
7.之后分享链接直接chrome浏览器打开就可以等待下载所有资源了
代码
var payList = [];
async function downFile(info) {
try {
let playUrl = info.playUrlHigh || info.playUrl || info.playUrlHighEncode || info.playUrlEncode;
console.log('下载' + info.name + playUrl);
let res = await fetch(playUrl);
let blob = await res.blob();
const a = document.createElement('a');
document.body.appendChild(a)
a.style.display = 'none'
const url = window.URL.createObjectURL(blob);
a.href = url;
a.download = info.name + '.mp3';
a.click();
document.body.removeChild(a)
window.URL.revokeObjectURL(url);
} catch (e) {
console.error('下载' + info.name + '失败');
}
}
async function getMp3(index) {
t.pageIndex = index;
let result = await y({
data: k({}, t),
apiUrl: "/wifimusicbox/demand/detail",
method: "POST"
});
if (index == result.totalPage) {
console.error(payList);
}
for (let n = 0; n < result.con.length; n++) {
const info = result.con[n];
await downFile(info);
}
}
for (let index = 0; index < 100; index++) {
getMp3(index);
}
代码还有很多可以优化,现在是循环100次来获取所有,返回的信息中有总页数totalPage ,我现在是取个大的值确保请求完。
还有更好的处理方式,自己通过接口请求,不用他的请求方式,因为应该有域名和权限限制,没时间研究,有大佬可以研究下
只是学习使用,提供破解思路与方法,请勿用于商业用途。
|