通过$ _GET将URL传递给PHP

时间:2015-05-20 09:33:01

标签: php

当我将其复制并粘贴到下载管理器中时,我在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('&amp;','&',$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;
}   

1 个答案:

答案 0 :(得分:0)

400错误来自您网址中的拼写错误:删除此部分中的空格字符:&signature= '&title='

您的卷曲功能正常,但它不适用于您的网址。我不知道为什么不这样做,但它适用于这样的网址:https://youtu.be/LxBk5f6mr-A

也许你可以使用这篇文章中提到的工具:

grabbing youtube video URL from curl or get_video_info