Недавно я пытался получить некоторые данные с помощью API аналитики YouTube. У меня проблема с ОДНЫМ доменом, но на другом он работает без ошибок.
Он использует точно такой же код, кроме формы action = «», которая была изменена с index.php на api.php — я просто не могу понять, почему он работает на одном домене, а на другом нет ?!
Точная ошибка:
Предупреждение: 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 в строке 22 Предупреждение: file_get_contents (http://gdata.youtube.com/feeds/api/users/?alt=json): не удалось открыть поток: ошибка HTTP-запроса! HTTP / 1.0 400 Bad Request в /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 />';?>
РЕДАКТИРОВАТЬ
Вот пример запроса API v3 с помощью cURL. Поэтому вам нужно создать ключ API в консоль разработчика. Если у вас еще нет ключа сервера, создайте новый проект, выберите его и нажмите «Учетные данные» (в «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. Если есть линия allow_url_fopen = Off
в вашем php.ini измените его на allow_url_fopen = On
,
Но я бы предпочел использовать cURL:
$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
(Может быть похожая строка, начинающаяся с точки с запятой, которую вы можете просто удалить). Но на большинстве конфигураций это уже сделано.
Других решений пока нет …