用PHP获取youtube视频标题

时间:2012-03-12 09:26:45

标签: php youtube-api youtube-javascript-api

在我的一个应用程序中,我正在保存youtube视频的ID ...就像“A4fR3sDprOE”..我必须在应用程序中显示其标题。我得到了以下代码来获得它的标题,并且它的工作正常。

现在的问题是,如果发生任何错误(在删除视频的情况下)php显示错误。我增加了一个条件。但仍显示错误。

foreach($videos as $video) {

    $video_id = $video->videos;
    if($content=file_get_contents("http://youtube.com/get_video_info?video_id=".$video_id)) {
        parse_str($content, $ytarr);

        $myvideos[$i]['video_title']=$ytarr['title'];

    }
    else
        $myvideos[$i]['video_title']="No title";

    $i++;


}

return $myvideos;

如果出现错误,它会因以下情况而死亡

严重性:警告

消息:file_get_contents(http://youtube.com/get_video_info?video_id=A4fR3sDprOE)[function.file-get-contents]:无法打开流:HTTP请求失败! HTTP / 1.0 402需要付款

文件名:models / webs.php

行号:128

请帮忙

7 个答案:

答案 0 :(得分:11)

file_get_contents()与远程网址一起使用是不安全的。使用cURL代替Youtube API 2.0:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://gdata.youtube.com/feeds/api/videos/'.$video_id);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

$response = curl_exec($ch);
curl_close($ch);

if ($response) {
    $xml   = new SimpleXMLElement($response);
    $title = (string) $xml->title;
} else {
    // Error handling.
}

答案 1 :(得分:6)

这是我的解决方案。很短。

$id = "VIDEO ID";
$videoTitle = file_get_contents("http://gdata.youtube.com/feeds/api/videos/${id}?v=2&fields=title");

preg_match("/<title>(.+?)<\/title>/is", $videoTitle, $titleOfVideo);
$videoTitle = $titleOfVideo[1];

答案 2 :(得分:3)

在file_get_contents之前使用@(php-manual)是否有效?

类似的东西:

if($content = @file_get_contents("http://youtube.com/get_video_info?video_id=".$video_id))

应该删除错误并使用它在if语句中返回false

否则你可以使用try / catch语句(php-manual

try{
    // code
}catch (Exception $e){
    // else code
}

答案 3 :(得分:1)

我认为您的托管服务提供商已出于安全目的禁用了file_get_contents。你应该使用CURL。

<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://youtube.com/get_video_info?video_id=".$video_id);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
/* PARSE YOUTUBE'S RESPONSE AS YOU LIKE BELOW */
?>

答案 4 :(得分:1)

尝试:


//use @ to supress warnings
$content=@file_get_contents("http://youtube.com/get_video_info?video_id=".$video_id);
if($content===FALSE) {
  ..handle error here
}
else{
  ..rest of your code
}

答案 5 :(得分:1)

我想补充一点,这里看到的具体错误(HTTP 402 - 需要付款,否则是服务器通常没有实现的HTTP状态代码)是YouTube在确定“返回”时返回的内容过多的“流量来自您的IP地址(或IP地址范围 - 他们更喜欢频繁地阻止OVH的IP范围[1] [2]。”

因此,如果您以编程方式(使用PHP或其他方式)访问youtube.com(而不是API),您最终可能会发现自己遇到此错误。 YouTube通常首先向来自“过多流量”IP的请求提供CAPTCHA,但如果您没有完成它们(您的PHP脚本将不会),他们将切换到这些无益的402响应,基本上没有追索权 - YouTube没有没有客户支持服务台可以打电话,如果由于IP阻止而无法访问他们的任何网站,那么联系他们的机会就更少了。

其他参考文献:
http://productforums.google.com/forum/#!topic/youtube/tR4WkNBPnUo http://productforums.google.com/forum/?fromgroups=#!topic/youtube/179aboankVg

答案 6 :(得分:0)

我的解决方案是:

$xmlInfoVideo    = simplexml_load_file("http://gdata.youtube.com/feeds/api/videos/".$videoId."?v=2&fields=title");

foreach($xmlInfoVideo->children() as $title) { $videoTitle = strtoupper((string) $title); }

这是获得视频的标题。