質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

YouTube API

YouTube APIはYouTubeのビデオコンテンツと機能性をウェブサイト、アプリケーション、デバイスに統合することを可能にします。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

XAMPP

XAMPP(ザンプ)は、ウェブアプリケーションの実行に必要なフリーソフトウェアをパッケージングしたApacheディストリビューションです。 XAMPPひとつインストールするだけで、Apache、MySQL、PHP、Perlなどのソフトウェアと、 phpMyAdminなどの管理ツール、SQLiteなどのソフトウェアやライブラリモジュールなどを利用することが可能です。

Q&A

0回答

1621閲覧

YouTube APIを用いた動画検索結果のJSONデータ取得に関するエラー(PHP)

quiqui59911225_

総合スコア2

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

YouTube API

YouTube APIはYouTubeのビデオコンテンツと機能性をウェブサイト、アプリケーション、デバイスに統合することを可能にします。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

XAMPP

XAMPP(ザンプ)は、ウェブアプリケーションの実行に必要なフリーソフトウェアをパッケージングしたApacheディストリビューションです。 XAMPPひとつインストールするだけで、Apache、MySQL、PHP、Perlなどのソフトウェアと、 phpMyAdminなどの管理ツール、SQLiteなどのソフトウェアやライブラリモジュールなどを利用することが可能です。

0グッド

0クリップ

投稿2020/07/14 04:57

実現したいこと

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プログラム内の処理に関して、文字コード周りのエラーが原因だと思うのですが、、、
ご教授ください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問