実現したいこと
YouTube API(search)を使用し、動画検索を行いたいです。
環境
PHP 7.3
XAMPP 7
実行方法は、XAMPPでApacheを立ち上げ、localhostからファイルにアクセスしています。
ソースコード
こちらのサイトを参考にしています。
index.php
として保存しています。
php7
1<?php 2define('YOUTUBE_API_KEY', ''); // APIキー (Google Developer Consoleから取得したものをセットしてください) 3 4function json_get($url, $query = array(), $assoc = false) { // JSONデータ取得用 5 if ($query) $url .= ('?' . http_build_query($query, '', '&', PHP_QUERY_RFC3986)); 6 7 $curl = curl_init(); 8 curl_setopt($curl, CURLOPT_URL, $url); // URL 9 curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // リクエスト先が https の場合、証明書検証をしない (環境によって動作しない場合があるため) 10 curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); // curl_exec() 経由で応答データを直接取得できるようにする 11 curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 10); // 接続タイムアウトの秒数 12 $responseString = curl_exec($curl); // 応答データ取得 13 curl_close($curl); 14 return ($responseString !== false) ? json_decode($responseString, $assoc) : false; 15} 16function h($value, $encoding = 'UTF-8') { return htmlspecialchars($value, ENT_QUOTES, $encoding); } // HTMlエスケープ出力用 17function eh($value, $encoding = 'UTF-8') { echo h($value, $encoding); } // 同上 18 19 20$response = json_get('https://www.googleapis.com/youtube/v3/search', array( 21 'key' => YOUTUBE_API_KEY, 22 'channelId' => 'UCip8ve30-AoX2y2OtAAmqFA', // チャンネルID (チャンネルで絞り込む場合) 23 // 'q' => 'テスト', // 検索キーワード (キーワードで絞り込む場合) 24 'part' => 'snippet', // 取得するデータの種類 (タイトルや画像を含める場合はsnippet) 25 'order' => 'date', // 日時降順 26 'maxResults' => 50, // 検索数 (5~50) 27 'type' => 'video', // 結果の種類 (channel,playlist,video) 28), true); 29?> 30<!DOCTYPE html> 31<html> 32<head> 33<meta charset="UTF-8"> 34<title>PHP による YouTube Data API v3 を用いた検索の例</title> 35</head> 36<body> 37 <h1>PHP による YouTube Data API v3 を用いた検索の例</h1> 38 <?php if ($response === false || isset($response['error'])) { ?> 39 動画情報が取得できませんでした。 40 <?php } elseif (count($response['items']) == 0) { ?> 41 検索結果が0件でした。 42 <?php } else { ?> 43 <?php foreach ($response['items'] as $item) { 44 $img = $item['snippet']['thumbnails']['default']; // 画像情報 (default, medium, highの順で画像が大きくなります) 45 $id = $item['id']['videoId']; 46 47 $t = new DateTime($item['snippet']['publishedAt']); 48 $t->setTimeZone(new DateTimeZone('Asia/Tokyo')); 49 $publishedAt = $t->format('Y/m/d H:i:s'); // 投稿日時 (日本時間) 50 ?> 51 <!-- <?php echo json_encode($item, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT) ?> --> 52 <a href="https://www.youtube.com/watch?v=<?php eh($id) ?>"><img src="<?php eh($img['url']) ?>"></a><br> 53 <a class="item-title" href="https://www.youtube.com/watch?v=<?php eh($id) ?>"><?php eh($item['snippet']['title']) ?></a><br> 54 <span class="item-publishedAt"><?php eh($publishedAt) ?></span> 55 <hr> 56 <?php } ?> 57 <?php } ?> 58</body> 59</html>
function json_get()
で$url
を取得し、そのURLにアクセスすると、JSON型のデータ型式が表示されたページに飛びます。
発生しているエラー
json_get
関数でJSONデータがうまく返されません。
「動画情報が取得されませんでした。」がサイトに表示されます。
calc_exec()
周辺がよくわかっていませんが、特別なエラーなどは出ていません。
試したこと
echo "$url";
で表示されたURLにアクセスすると、JSONデータが記述されたページが表示されますので、$url
は正しいと思います。
また、正当なURL文字列があるので、file_get_contents(URL文字列)
を使用してjson_decode
を行う方法を試してみました。
すると、
Warning: file_get_contents(): php_network_getaddresses: getaddrinfo failed: (文字化けした文字列) in (上記php) line (file_get_contentsの行番号) Warning: file_get_contents(URLの文字列): failed to open stream: php_network_getaddresses: getaddrinfo failed: (文字化けした文字列) in (上記php) line (file_get_contentsの行番号)
が表示されました。
エラーではないのかもしれませんが、やはり動画情報は取得できていません。
思ったこと
JSONデータが表示されるページの文字コードが問題かと思いました。
試しにJSONデータをコピーしてファイルに保存し、
$url = "JSONファイルパス"; $url = mb_convert_encoding($url, 'UTF8', 'ASCII, JIS, UTF-8, EUC-JP, SJIS-WIN'); $json = file_get_contents($url); $json = mb_convert_encoding($json, 'UTF8', 'ASCII, JIS, UTF-8, EUC-JP, SJIS-WIN'); $data = json_decode($json, true);
としましたが、
Warning: file_get_contents(): php_network_getaddresses: getaddrinfo failed: (文字化けした文字列) in (上記php) line (file_get_contentsの行番号) Warning: file_get_contents(URLの文字列): failed to open stream: php_network_getaddresses: getaddrinfo failed: (文字化けした文字列) in (上記php) line (file_get_contentsの行番号)
は解決しませんでした。
Apacheろログなどは問題なかったので、phpプログラム内の処理に関して、文字コード周りのエラーが原因だと思うのですが、、、
ご教授ください。
あなたの回答
tips
プレビュー