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

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

新規登録して質問してみよう
ただいま回答率
87.20%
Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

OAuth 2.0

OAuth 2.0(Open Authorization 2.0)は、APIを通して保護されたリソース(サードパーティのアプリケーション)へアクセスする為のオープンプロトコルです。

PHP

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

YouTube API

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

解決済

アクセストークンが取得出来ない

study_111
study_111

総合スコア82

Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

OAuth 2.0

OAuth 2.0(Open Authorization 2.0)は、APIを通して保護されたリソース(サードパーティのアプリケーション)へアクセスする為のオープンプロトコルです。

PHP

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

YouTube API

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

1回答

0評価

0クリップ

1146閲覧

投稿2020/07/06 14:38

編集2020/07/06 14:40

前提・実現したいこと

YoutubeDataApiV3のサンプルコードを元に、動画アップロード処理を記述したのですが、アクセストークンを取得する部分で、NULLとなってしまい、先の処理が行えない状況です。

発生している問題・エラーメッセージ

NULLとなってしまっているのは、以下の部分です。

var_dump($client->getAccessToken());

該当のソースコード

以下は、PHPコードの全文になります。

php

<?php require_once __DIR__ . '/vendor/autoload.php'; session_start(); if ($_SERVER['REQUEST_METHOD'] == 'GET') { echo('getリクエストです'); exit(); } $err_msg = array(); $title = ''; $description = ''; $tag = ''; $tag_array = array(); $category_id = ''; // $tag_array[0] = 'aaa'; // var_dump($tag_array); //拡張子取得 function getExt($filename) { return pathinfo($filename, PATHINFO_EXTENSION); } // echo(__DIR__ ); //タイトル取得 if(isset($_POST['title'])){ $title = $_POST['title']; // print($comment); } //説明 if(isset($_POST['description'])){ $description = $_POST['description']; // print($comment); } //タグ if(isset($_POST['tag'])){ // echo('sss'); $tag = $_POST['tag']; // echo($tag); if (mb_strlen($tag, 'UTF-8') > 500){ $err_msg[] = 'タグに登録出来る文字数は500文字以内です'; }else{ $tag_array = explode(',',$tag); // $tag_array = array_filter($tag_array,'strlen'); $tag_array = array_filter($tag_array,function($x){ return preg_match("/\S+/misu",$x); }); // var_dump($tag_array[3]); $tag_array = array_unique($tag_array); // var_dump($tag_array); } } if(isset($_POST['category'])){ $category_id = $_POST['category']; // var_dump($category_id); } if(isset($_FILES['certification_file']['tmp_name'])){ // echo('jsonファイルは存在します'); // echo($_FILES['certification_file']['tmp_name']); $ext = getExt($_FILES['certification_file']['name']); // echo(__LINE__); // echo($ext); if ($ext == "json"){ // echo("jsonファイルです。"); $certification_tmpfile = $_FILES['certification_file']['tmp_name']; $certification_filename = "./credentials/" . date("YmdHis"); $certification_filename .= mt_rand(); // $certification_filename = "./credentials/". $_FILES['certification_file']['name']; $certification_filename .= '.' . $ext; if (is_uploaded_file($certification_tmpfile)) { if ( move_uploaded_file($certification_tmpfile , $certification_filename)) { echo $certification_filename . "をアップロードしました。"; } else { echo "ファイルをアップロードできません。"; } } else { echo "ファイルが選択されていません。"; } }else{ echo("credentials.jsonファイルではありません。"); } // echo($_FILES['certification_file']['type']); // echo($certification_filename); // echo "\n"; // echo($certification_tmpfile); } if(isset($_FILES['movie_file']['tmp_name'])){ $ext = getExt($_FILES['movie_file']['name']); $movie_tmpfile = $_FILES['movie_file']['tmp_name']; $movie_filename = "./movies/" . date("YmdHis"); $movie_filename .= "." . $ext; if (is_uploaded_file($movie_tmpfile)) { if ( move_uploaded_file($movie_tmpfile , $movie_filename)) { echo $movie_filename . "をアップロードしました。"; } else { echo "ファイルをアップロードできません。"; } } else { echo "ファイルが選択されていません。"; } // echo($movie_tmpfile); } // echo($movie_filename)."\n"; $url = $certification_filename; $json = file_get_contents($url); $json = mb_convert_encoding($json, 'UTF8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN'); // echo($json); $cert_arr = json_decode($json,true); // var_dump($cert_arr); if (!file_exists(__DIR__ . '/vendor/autoload.php')) { throw new \Exception('please run "composer require google/apiclient:~2.0" in "' . __DIR__ .'"'); } $OAUTH2_CLIENT_ID = $cert_arr['web']['client_id']; $OAUTH2_CLIENT_SECRET = $cert_arr['web']['client_secret']; echo($OAUTH2_CLIENT_ID); echo '<br>'; echo($OAUTH2_CLIENT_SECRET); // echo($_SERVER['HTTP_HOST'] ); $client = new Google_Client(); // var_dump($OAUTH2_CLIENT_ID); // var_dump($OAUTH2_CLIENT_SECRET); $client->setClientId($OAUTH2_CLIENT_ID); $client->setClientSecret($OAUTH2_CLIENT_SECRET); $client->setScopes('https://www.googleapis.com/auth/youtube'); $redirect = filter_var('http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'], FILTER_SANITIZE_URL); $client->setRedirectUri($redirect); // 使用するサービスを作成 $youtube = new Google_Service_YouTube($client); // var_dump($youtube); $tokenSessionKey = 'token-' . $client->prepareScopes(); if (isset($_GET['code'])) { if (strval($_SESSION['state']) !== strval($_GET['state'])) { die('The session state did not match.'); } $client->authenticate($_GET['code']); $_SESSION[$tokenSessionKey] = $client->getAccessToken(); header('Location: ' . $redirect); } if (isset($_SESSION[$tokenSessionKey])) { // echo(__LINE__); $client->setAccessToken($_SESSION[$tokenSessionKey]); } var_dump($client->getAccessToken()); // echo(__LINE__); // Check to ensure that the access token was successfully acquired. if ($client->getAccessToken()) { $htmlBody = ''; echo(__LINE__); try{ //アップロードするファイルパスへ置き換える $videoPath = $movie_filename; // Create a snippet with title, description, tags and category ID // Create an asset resource and set its snippet metadata and type. // This example sets the video's title, description, keyword tags, and // video category. $snippet = new Google_Service_YouTube_VideoSnippet(); $snippet->setTitle($title); $snippet->setDescription($description); $snippet->setTags($tag_array); // Numeric video category. See // https://developers.google.com/youtube/v3/docs/videoCategories/list $snippet->setCategoryId($category_id); // Set the video's status to "public". Valid statuses are "public", // "private" and "unlisted". $status = new Google_Service_YouTube_VideoStatus(); //公開ステータスは「非公開」に設定 $status->privacyStatus = "private"; // Associate the snippet and status objects with a new video resource. $video = new Google_Service_YouTube_Video(); $video->setSnippet($snippet); $video->setStatus($status); // Specify the size of each chunk of data, in bytes. Set a higher value for // reliable connection as fewer chunks lead to faster uploads. Set a lower // value for better recovery on less reliable connections. $chunkSizeBytes = 1 * 1024 * 1024; // Setting the defer flag to true tells the client to return a request which can be called // with ->execute(); instead of making the API call immediately. $client->setDefer(true); // Create a request for the API's videos.insert method to create and upload the video. $insertRequest = $youtube->videos->insert("status,snippet", $video); var_dump($insertRequest); // Create a MediaFileUpload object for resumable uploads. $media = new Google_Http_MediaFileUpload( $client, $insertRequest, 'video/*', null, true, $chunkSizeBytes ); $media->setFileSize(filesize($videoPath)); // Read the media file and upload it chunk by chunk. $status = false; $handle = fopen($videoPath, "rb"); while (!$status && !feof($handle)) { $chunk = fread($handle, $chunkSizeBytes); $status = $media->nextChunk($chunk); } fclose($handle); // If you want to make other calls after the file upload, set setDefer back to false $client->setDefer(false); // echo('ssssss'); $htmlBody .= "<h3>Video Uploaded</h3><ul>"; $htmlBody .= sprintf('<li>%s (%s)</li>', $status['snippet']['title'], $status['id']); $htmlBody .= '</ul>'; } catch (Google_Service_Exception $e) { $htmlBody .= sprintf('<p>A service error occurred: <code>%s</code></p>', htmlspecialchars($e->getMessage())); } catch (Google_Exception $e) { $htmlBody .= sprintf('<p>An client error occurred: <code>%s</code></p>', htmlspecialchars($e->getMessage())); } $_SESSION[$tokenSessionKey] = $client->getAccessToken(); } elseif ($OAUTH2_CLIENT_ID == 'REPLACE_ME') { $htmlBody = <<<END <h3>Client Credentials Required</h3> <p> You need to set <code>$OAUTH2_CLIENT_ID</code> and <code>$OAUTH2_CLIENT_ID</code> before proceeding. <p> END; } else { // If the user hasn't authorized the app, initiate the OAuth flow $state = mt_rand(); $client->setState($state); $_SESSION['state'] = $state; $authUrl = $client->createAuthUrl(); $htmlBody = <<<END <h3>Authorization Required</h3> <p>You need to <a href="$authUrl">authorize access</a> before proceeding.<p> END; } ?> <!-- // // // $url = __DIR__ . ; -->

補足情報(FW/ツールのバージョンなど)

「OAUTH2_CLIENT_ID」と「OAUTH2_CLIENT_SECRET」には、値が入っていることが、以下の部分で確認できている状況です。

echo($OAUTH2_CLIENT_ID); echo '<br>'; echo($OAUTH2_CLIENT_SECRET);

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

asahina1979

2020/07/10 11:43

そもそもアクセストークン取得するための認可が動作してませんよね。 OAUTH の動きをしっていたら 1枚でやるなら GET 禁止 の時点で認可が正常終了していません
study_111

2020/07/10 12:19

サンプルコードをそのまま使用する形としたのですが、どこら辺の部分の修正、追記が必要になってくるのでしょうか?

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

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

OAuth 2.0

OAuth 2.0(Open Authorization 2.0)は、APIを通して保護されたリソース(サードパーティのアプリケーション)へアクセスする為のオープンプロトコルです。

PHP

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

YouTube API

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