某道公开课,免费的课,只能在线看,不能下载
弄到视频地址
http://stream.youdao.com/private/xuetang/201911/44cd5c9a5c47/44cd5c9a5c47_screen--20191127201006__merge_a7fd4367.mp4
直接访问 403,查看一下http请求
普通的get请求,带了一个 r
参数,粗看应该是时间戳,是js的时间戳
用postman 简单模拟了一下, 失败
?
参数全都搬过来,User-Agent,Referer...
再次 postman..
可以,成功通过验证,但是postman不能下载文件,于是我打算前端写一下模拟请求(此时我并不知道到底是搬过来的哪个参数起了作用)
// 网上找到的不错的函数, 收藏备用
function downLoadByUrl(url){
var xhr = new XMLHttpRequest();
// GET , url , async(是否异步)
xhr.open('GET', url, true);
//设置请求头参数
xhr.setRequestHeader("Accept", '*/*');
//设置响应类型为 blob
xhr.responseType = 'blob';
//关键部分
xhr.onload = function (e) {
if (this.status == 200) {
//创键临时url blob对象
var blob = this.response;
var filename = "666.mp4";
blob.type = "application/octet-stream";
var url = URL.createObjectURL(blob);
location.href = url
//释放之前创建的URL对象
window.URL.revokeObjectURL(url);
}
};
xhr.send();
}
上面代码不用看, 我忽略了浏览器跨域的问题 Referer是改不了的
然后考虑用PHP写。PHP如果是脚本本地运行的话,也行,如果是服务器端那就不好了,先下到服务器,再传到本地?
如果有一种 流式的 PHP发起请求直接把响应转到客户端的就好了
但说脚本的话,那不如直接 shell啊!
wget
修改一下请求头 岂不是轻轻松松
wget -O ke.mp4 --header "Referer: http://live.youdao.com/live/index.html" http://stream.youdao.com/private/xuetang/201911/44cd5c9a5c47/44cd5c9a5c47_screen--20191127201006__merge_a7fd4367.mp4?r=1574920719831
在反复试验几次后,发现他们的服务器只验证了Referer的域名而已,参数都不校验的,可能只是设置了防盗链,我都想复杂了。。。
下次应该用postman分析透彻后,再开始搞