Не удалось открыть поток: HTTP-запрос не выполнен! Неверный запрос HTTP / 1.0 400 — Попытка получить данные API YouTube

Недавно я пытался получить некоторые данные с помощью 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 />';?>

2

Решение

РЕДАКТИРОВАТЬ

Вот пример запроса 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 (Может быть похожая строка, начинающаяся с точки с запятой, которую вы можете просто удалить). Но на большинстве конфигураций это уже сделано.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]