当我将其复制并粘贴到下载管理器中时,我在url下面遇到了奇怪的问题,它运行正常。但我将通过PHP直接链接流然后得到400错误。但是,当我使用链接到不同的上传中心网站(uploadboy.com)来测试链接是否正常工作时,它在上传器上工作正常。
我编写了一个附加到词缀的脚本。并尝试许多不同的方式下载它,但仍然面临错误400!
我采取了哪些措施来解决问题? 我测试以查看脚本是否在url的整个部分和url的查询字符串上运行urlencode和urldecode函数。在这4种不同的方式下载没有成功。但是我以我测试的方式附加了我的脚本。
我再次注意到你。链接工作正常,它不仅限于IP地址。但是,我测试下载网址的下载管理器与php webserver具有相同的IP地址。
网址示例:
http://r5---sn-p5qlsnsk.googlevideo.com/videoplayback?ipbits=0&mm=31&fexp=9407724,9408142,9408592,9408705,9408710,9408982,9412517,9412776,9413317,9413355,945137,948124,952612,952637,952640,952642&id=o-ACIY_VMiJqYl9lskpYea7F_6tP6DNv6WlJattCarpNST&signature=0DF7579F401F8BB481A4511F96ECD95C52FB618B.29AA2A450464D709E3FC3974759459A1EB7066E9&nh=IgpwcjAzLmlhZDA3KgkxMjcuMC4wLjE&key=yt5&mt=1432113172&ip=198.50.235.216&upn=aR3Slhiml7g&expire=1432134981&sparams=dur,id,ip,ipbits,itag,mime,mm,ms,mv,nh,pl,source,upn,expire&mime=video/3gpp&sver=3&pl=23&source=youtube&mv=u&dur=87.817&itag=17&ms=au&signature= '&title='Youtube-API-V3-Drag--Drop-PlayList--Download-videos--Search-Keyword'
要传输的代码示例:
$url = $_POST['url'];
$referrer = $_POST['referrer'];
if(strstr($url,'googlevideo.com')){
$url_parts = parse_url($url);
$query = $url_parts['query'];
$query_parts = parse_str($query,$queries);
foreach ($queries AS $key=>$value){
$post_url .= $key.'='.urlencode($value).'&';
}
$post_url = rtrim($post_url, '&');
$url2 = 'http://r1---sn-u2oxu-f5f6.googlevideo.com/videoplayback?'.$post_url;
die($url.'<br><br>'.$url2);
$filename = preg_replace('/[^a-zA-Z0-9-_\.]/','', $title).'.'.getExtension($mime);
// $head = array_change_key_case(get_headers($url, TRUE));
// $filesize = $head['content-length'];
header('Pragma: public'); // required
header('Expires: 0'); // no cache
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Cache-Control: private',false);
header('Content-Type: '.$mime);
header('Content-Disposition: attachment; filename="'.basename($filename).'"');
header('Content-Transfer-Encoding: binary');
// header('Content-Length: '.$filesize); // provide file size
header('Connection: close');
// echo getUrl($url,$_SERVER['HTTP_USER_AGENT'],$referrer);
$file = fopen(str_replace('&','&',$url), 'rb');
while (($content = fread($file, 20480)) !== false) { // Read in 2048-byte chunks
echo $content; // or output it somehow else.
flush(); // force output so far
}
fclose($file);
exit();
}
UPDATE1: 我已经在curl函数下面测试了:
function getUrl($url,$agent='',$referrer='',$proxy=''){
$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_NOBODY, false);
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
if(!empty($agent)){
curl_setopt ($ch, CURLOPT_USERAGENT,$agent);
}
curl_setopt ($ch, CURLOPT_TIMEOUT, 60);
if(!empty($referrer)){
curl_setopt ($ch, CURLOPT_REFERER, $referrer);
}
curl_setopt($ch,CURLOPT_FOLLOWLOCATION,false);
$output=curl_exec($ch);
curl_close($ch);
return $output;
}
答案 0 :(得分:0)
400错误来自您网址中的拼写错误:删除此部分中的空格字符:&signature= '&title='
。
您的卷曲功能正常,但它不适用于您的网址。我不知道为什么不这样做,但它适用于这样的网址:https://youtu.be/LxBk5f6mr-A
。
也许你可以使用这篇文章中提到的工具: