youtube get_video无效

时间:2011-01-05 10:20:56

标签: safari youtube

我用http://www.youtube.com/get_video?video_id=ID&t=SIGNATURE&fmt=18替换了

带有正确值的ID和SIGNATURE。但我没有看到任何保存或下载窗口,

代替一个空白窗口。

我在Safari平台上使用Safari浏览器。帮助感谢。

4 个答案:

答案 0 :(得分:16)

获取YouTube视频信息的最简单方法是从http://youtube.com/get_video_info?video_id=XXXXXXXX

获取来源

我将使用PHP作为处理此数据的示例。使用PHP的parse_str(),您可以将字符串的所有变量分配给一个很好的视频信息数组:

$content = file_get_contents("http://youtube.com/get_video_info?video_id=".$id);
parse_str($content, $ytarr);

然后所有信息都存储在 $ ytarr 中。感兴趣的变量是“fmt_list”和“fmt_map”(它似乎包含相同的东西)。此变量包含根据此处图表的可用视频格式列表:http://en.wikipedia.org/wiki/Youtube#Quality_and_codecs

假设您知道要下载哪种格式,则可以使用“fmt_url_map”变量(或此示例中的 $ ytarr ['fmt_url_map'] )来访问链接列表到所需的格式。

您可以使用这些链接下载任何格式的视频,但它们受youtube的有限带宽限制(youtube用于节省带宽的最佳流速)因此下载速度不会像您想象的那么快。这让我相信这些链接最适合用于流媒体而不是下载,但我不知道任何替代方案。

答案 1 :(得分:6)

互联网上充满了不工作的例子,所以这里有一个脚本供任何需要的人使用。 flv文件有问题。他们的链接提供.txt文件,但它对webm和mp4很好。对于pr0n网站我也需要那个hehehe

<?php

//$debug = true;

if(empty($debug))
    $debug = false;

if(empty($_GET['id']))
    die('no id');
if(!preg_match('/^[A-Z0-9-_]+$/i', $_GET['id']))
    die('invalid character in id');
else
    $id = $_GET['id'];

if(empty($_GET['type']))
    $type = 'mp4';
else
if(!preg_match('/^[A-Z]+$/i', $_GET['type']))
    die('invalid character in type');
else
    $type = strtolower($_GET['type']);


$url = 'http://youtube.com/get_video_info?video_id=';
$key = 'url_encoded_fmt_stream_map';
$content = file_get_contents($url.$id);
parse_str($content, $result);

if($debug)
    {
    echo $url.$id.'<br/>';
    echo $key.'<br/>';
    echo $type.'<br/>';
    echo '<pre>';
    print_r($result);
    echo '</pre>';
    }
else
    {
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename="videofile.'.$type.'"');
    }

$type = 'type=video/'.$type;
$files = explode(',url=', $result[$key]);
$files[0] = substr($files[0], 4);

for($i=0; $i<count($files); $i++)
    {
    $file = urldecode($files[$i]);
    $found = strpos($file, $type) > -1;

    if ($debug)
        {
        if ($found) 
            echo '[THIS]';
        echo '<a href="'.$file.'">'.$file.'</a><br/><br/>';
        }
    else
        {
        if ($found) 
            {
            $file = explode('; codecs=', $file);
            @readfile($file[0]);
            break;
            }
        }   
    }
?>  

答案 2 :(得分:4)

youtube更改了用于获取flv文件的请求。 现在看起来像

http://v2.lscache3.c.youtube.com/videoplayback?ip=0.0.0.0&sparams=id%2Cexpire%2Cip%2Cipbits%2Citag%2Calgorithm%2Cburst%2Cfactor%2Coc%3AU0dYSVZMTl9FSkNNOF9ORlJF&fexp=903816&fexp=903813%2C908400&algorithm=throttle-factor&itag=34&ipbits=0&burst=40&sver=3&expire=1294610400&key=yt1&signature=9C4D194A7F85F0171771486714D3F061ED2924F6.98D10BB190123CADCA3CDF993174D47F8932895F&factor=1.25&id=10af5a6280e42a28

你可以轻松获取除oc参数之外的所有参数,即%2Coc%3AU0dYSVZMTl9FSkNNOF9ORlJF 从回应中,仍在寻找获得它的方法。

youtube将链接锁定到浏览器,因此您无法在服务器上使用它。 如果您查看youtube页面的源代码,您将找到类似上述地址但没有oc参数的内容,如果您从firebug net panel或chrome资源复制它,它将下载flv电影作为“videoplayback”。

答案 3 :(得分:0)

你试试:

$id = "111_fGEdIvs"; //the youtube video ID
//$id = $_GET['id'];

//$format = $_GET['fmt']; //the MIME type of the video. e.g. video/mp4, video/webm, etc.
parse_str(file_get_contents("http://youtube.com/get_video_info?video_id=".$id),$info);     //decode the data
$streams = $info['url_encoded_fmt_stream_map']; //the video's location info
$streams = explode(',',$streams);
parse_str(urldecode($streams[0]),$data);  //In this example I am downloading only the first video

$url=$data['url'];
$sig=$data['signature'];
unset($data['type']);
unset($data['url']);
unset($data['sig']);
$urlPlay= str_replace('%2C', ',' ,$url.'&'.http_build_query($data).'&signature='.$sig); 

echo '<iframe class="youtube-player" type="text/html" width="640" height="385" src="'.$urlPlay.'" allowfullscreen frameborder="0" ></iframe>';