某道公开课,免费的课,只能在线看,不能下载
弄到视频地址

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分析透彻后,再开始搞