dklight
@dklight
php кодер - level 2.5

Как побороть ошибку с file_get_contents failed to open stream: HTTP request failed! HTTP/1.0 400 — https youtube?

Дообрый день.

Есть код:
$url = 'https://www.googleapis.com/youtube/v3/videos';
$cn_match = 'www.googleapis.com';
// $url = 'https://stackoverflow.com/questions/';
// $cn_match = 'stackoverflow.com';

$data = array (     
	'key' => $api_key,               
	'part' => 'snippet',
	'id' => $video_id
);

// use key 'http' even if you send the request to https://...
$options = array(
	'http' => array( // text/plain
		'header'  => "Content-type: application/x-www-form-urlencoded\r\n",
		'method'  => 'GET', 
		'content' => http_build_query($data)                
	)
	, 'ssl' => array(
		'verify_peer' => true,
		'cafile' => '/SRV/php721/extras/ssl/' . "cacert.pem",
		'ciphers' => 'HIGH:TLSv1.2:TLSv1.1:TLSv1.0:!SSLv3:!SSLv2',
		'CN_match' => $cn_match,
		'disable_compression' => true,
	)
);

$scu = $url . '?' . http_build_query($data);
$context  = stream_context_create($options);
$response = file_get_contents($url, false, $context);
//$response = file_get_contents($scu);
//echo Debug::d($context);
//echo $scu; 
echo Debug::d($response);

выполнение приводит к ошибке:
Warning: file_get_contents(https://www.googleapis.com/youtube/v3/videos): failed to open stream: HTTP request failed! HTTP/1.0 400 Bad Request in C:\SRV\vhosts\test.loc\html\tmp\youtube-api\ex1\t1.php on line 67

или попросту HTTP/1.0 400 Bad Request

если делать курлом, например, вот так:
$curlSession = curl_init();
curl_setopt($curlSession, CURLOPT_URL, "https://www.googleapis.com/youtube/v3/videos?part=snippet&id=$video_id&key=$api_key");
curl_setopt($curlSession, CURLOPT_BINARYTRANSFER, true);
curl_setopt($curlSession, CURLOPT_RETURNTRANSFER, true);

$jsonData = json_decode(curl_exec($curlSession));
curl_close($curlSession);

echo Debug::d($jsonData);

ошибок не возникает, однако, как заставить заработать первоначальный код?
  • Вопрос задан
  • 23317 просмотров
Решения вопроса 1
dklight
@dklight Автор вопроса
php кодер - level 2.5
вопрос решен, однако через file_get_contents не получилось, пришлось использовать fopen:
$scu = $url . '?' . http_build_query($data);
$opts = array('http' =>
    array(
        'method' => 'GET',
        'max_redirects' => '0',
        'ignore_errors' => '1',        
    )
    , 'ssl' => array(
		'verify_peer' => true,
		'cafile' => '/SRV/php721/extras/ssl/' . "cacert.pem",
		'ciphers' => 'HIGH:TLSv1.2:TLSv1.1:TLSv1.0:!SSLv3:!SSLv2',
		'CN_match' => $cn_match,
		'disable_compression' => true,
	)
);

$context = stream_context_create($opts);
$stream = fopen($scu, 'r', false, $context);

// информация о заголовках, а также
// метаданные о потоке
echo Debug::d(stream_get_meta_data($stream),'stream_get_meta_data($stream)');

// актуальная информация по ссылке $url
echo Debug::d(stream_get_contents($stream),'stream_get_contents($stream)');
fclose($stream);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы