在我的一个应用程序中,我正在保存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
请帮忙
答案 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); }
这是获得视频的标题。