2014-10-19 134 views
1

我最近一直在嘗試使用YouTube分析API獲取一些數據。我在ONE域名上遇到問題,但它在另一個域上沒有任何錯誤。無法打開流:HTTP請求失敗! HTTP/1.0 400錯誤請求 - 試圖獲取YouTube API數據

它使用EXACT相同的代碼,除了從index.php更改爲api.php的形式action =「」 - 我只是不明白爲什麼它在一個域上工作,而不在另一個域上?!

確切的錯誤是:

警告:的file_get_contents(http://gdata.youtube.com/feeds/api/users/):未能打開流:HTTP請求失敗! HTTP/1.0 400錯誤請求/customers/2/c/9/catalyst.yt/httpd.www/api.php on line 22警告:file_get_contents(http://gdata.youtube.com/feeds/api/users/?alt=json):無法打開流:HTTP請求失敗! HTTP/1.0 400 /customers/2/c/9/catalyst.yt/httpd.www/api.php錯誤的請求上線24

下面的代碼

<html> 
<head> 
    <title>Get YouTube Channel Data</title> 
</head> 
<body> 

<form action="api.php" method="GET"> 
    <input type="text" name="username" /> 
    <input type="submit" value="Submit!" /> 
</form> 

</body> 

</html> 

<?php 

$channelUser = $_GET['username']; 



$data = file_get_contents('http://gdata.youtube.com/feeds/api/users/' . $channelUser); 

$data = file_get_contents('http://gdata.youtube.com/feeds/api/users/' . $channelUser . '?alt=json'); 
$data = json_decode($data, true); 
$stats_data = $data['entry']['yt$statistics']; 
$img_data = $data['entry']['media$thumbnail']; 

echo $channelUser . ' Has <strong>'.$stats_data['subscriberCount'].'</strong> Subscribers.<br />'; 
echo $channelUser . ' Has <strong>'.$stats_data['totalUploadViews'].'</strong> Total Views.<br />'; 
echo 'Logo: <br /><img src="' .$img_data["url"].'" /><br />'; 


?> 

回答

1

EDIT

以下是使用cURL進行v3 api請求的示例。因此您需要在developer console中創建一個api密鑰。如果您還沒有服務器密鑰,請創建一個新項目,選擇它,然後單擊'Credentials'(在'API & auth) - >創建新密鑰 - >服務器密鑰 - >創建(您不必如果您在本地計算機上開發,請輸入任何內容)。

然後用您的API密鑰替換代碼中的佔位符。

$api_key = 'YOUR_API_KEY'; 
$url = 'https://www.googleapis.com/youtube/v3/channels?part=snippet,statistics&key=' . $api_key . '&forUsername=' . $_GET['username']; 

// initializes the request 
$curl = curl_init(); 
// sets the url 
curl_setopt($curl, CURLOPT_URL, $url); 

// enables that curl_exec() returns content instead of status code 
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 

// allows redirects 
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); 

// checks if a secure site has been requested 
if(preg_match('/^https:\/\//', $url)){ 
    // if so, verification is disabled 
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); 
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); 
} 
// performs the actual request 
$data = curl_exec($curl); 
// destructs the request 
curl_close($curl); 

// this line converts the json string which is returned into a php object 
$data = json_decode($data); 

// you can access your stats like this: 
var_dump($data->items[0]->statistics->subscriberCount); 
var_dump($data->items[0]->statistics->videoCount); 
var_dump($data->items[0]->snippet->thumbnails->default->url); 

注意,禁用SSL驗證您的最終產品是不推薦的,它只是現在更容易。稍後,您應該正確驗證證書。(之前你問,我從來沒有這樣做過)

我希望這對你有用。


原來的答案

貌似allow_url_fopen是在php.ini中禁用。如果您的php.ini中有一行allow_url_fopen = Off,請將其更改爲allow_url_fopen = On

但我更喜歡用捲曲:

$curl = curl_init(); 
curl_setopt($curl, CURLOPT_URL, 'http://gdata.youtube.com/feeds/api/users/' . $channelUser); 
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); 
$data = curl_exec($curl); 
curl_close($curl); 

curl擴展必須要開啓,太:extension = php_curl.dll(有可能是開始,你可以只是刪除分號類似的線)。但在大多數配置中,這已經完成。

+0

其實allow_url_fopen在Web服務器上啓用。我會給這個鏡頭,謝謝! - 編輯。試圖抓取數據時這不起作用,不知道爲什麼(啓用了捲曲)。 – 2014-10-19 17:46:37

+0

你能解釋一下哪些工作不正常或者提供了一些輸出結果嗎?另外,您正在使用已棄用的v2 api。您應該創建一個api密鑰並使用v3 api。我正在做一個例子。 – paolo 2014-10-20 18:12:38

相關問題