PHP コードサンプル

YouTube Reporting API には、PHP の Google API クライアント ライブラリを使用する次のコードサンプルが利用可能です。これらのコードサンプルは、GitHub の YouTube API コードサンプル リポジトリphp フォルダからダウンロードできます。

  1. レポートジョブを作成するreportTypes.listjobs.create
  2. レポートを取得するjobs.listjobs.reports.list

レポートジョブを作成する

このサンプルでは、レポートジョブの作成方法を示します。reportTypes.list メソッドを呼び出して、使用可能なレポートタイプのリストを取得します。次に、jobs.create メソッドを呼び出して、新しいレポートジョブを作成します。

<?php  /**  * This sample creates a reporting job by:  *  * 1. Listing the available report types using the "reportTypes.list" method.  * 2. Creating a reporting job using the "jobs.create" method.  *  * @author Ibrahim Ulukaya  */  /**  * Library Requirements  *  * 1. Install composer (https://getcomposer.org)  * 2. On the command line, change to this directory (api-samples/php)  * 3. Require the google/apiclient library  *    $ composer require google/apiclient:~2.0  */ if (!file_exists(__DIR__ . '/vendor/autoload.php')) {   throw new \Exception('please run "composer require google/apiclient:~2.0" in "' . __DIR__ .'"'); }  require_once __DIR__ . '/vendor/autoload.php'; session_start();  /*  * You can acquire an OAuth 2.0 client ID and client secret from the  * {{ Google Cloud Console }} <{{ https://cloud.google.com/console }}>  * For more information about using OAuth 2.0 to access Google APIs, please see:  * <https://developers.google.com/youtube/v3/guides/authentication>  * Please ensure that you have enabled the YouTube Data API for your project.  */ $OAUTH2_CLIENT_ID = 'REPLACE_ME'; $OAUTH2_CLIENT_SECRET = 'REPLACE_ME';  $client = new Google_Client(); $client->setClientId($OAUTH2_CLIENT_ID); $client->setClientSecret($OAUTH2_CLIENT_SECRET);  /*  * This OAuth 2.0 access scope allows for read access to the YouTube Analytics monetary reports for  * authenticated user's account. Any request that retrieves earnings or ad performance metrics must  * use this scope.  */ $client->setScopes('https://www.googleapis.com/auth/yt-analytics-monetary.readonly'); $redirect = filter_var('http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'],     FILTER_SANITIZE_URL); $client->setRedirectUri($redirect);  // YouTube Reporting object used to make YouTube Reporting API requests. $youtubeReporting = new Google_Service_YouTubeReporting($client);  // Check if an auth token exists for the required scopes $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])) {   $client->setAccessToken($_SESSION[$tokenSessionKey]); }  // Check to ensure that the access token was successfully acquired. if ($client->getAccessToken()) {   // This code executes if the user enters a name in the form   // and submits the form. Otherwise, the page displays the form above.   try {     if (empty(listReportTypes($youtubeReporting, $htmlBody))) {       $htmlBody .= sprintf('<p>No report types found.</p>');     } else if ($_GET['reportTypeId']){       createReportingJob($youtubeReporting, $_GET['reportTypeId'], $_GET['jobName'], $htmlBody);     }   } 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; }   /**  * Creates a reporting job. (jobs.create)  *  * @param Google_Service_YouTubereporting $youtubeReporting YouTube Reporting service object.  * @param string $reportTypeId Id of the job's report type.  * @param string $name name of the job.  * @param $htmlBody - html body.  */ function createReportingJob(Google_Service_YouTubeReporting $youtubeReporting, $reportTypeId,     $name, &$htmlBody) {   # Create a reporting job with a name and a report type id.   $reportingJob = new Google_Service_YouTubeReporting_Job();   $reportingJob->setReportTypeId($reportTypeId);   $reportingJob->setName($name);    // Call the YouTube Reporting API's jobs.create method to create a job.   $jobCreateResponse = $youtubeReporting->jobs->create($reportingJob);    $htmlBody .= "<h2>Created reporting job</h2><ul>";   $htmlBody .= sprintf('<li>"%s" for reporting type "%s" at "%s"</li>',       $jobCreateResponse['name'], $jobCreateResponse['reportTypeId'], $jobCreateResponse['createTime']);   $htmlBody .= '</ul>'; }   /**  * Returns a list of report types. (reportTypes.listReportTypes)  *  * @param Google_Service_YouTubereporting $youtubeReporting YouTube Reporting service object.  * @param $htmlBody - html body.  */ function listReportTypes(Google_Service_YouTubeReporting $youtubeReporting, &$htmlBody) {   // Call the YouTube Reporting API's reportTypes.list method to retrieve report types.   $reportTypes = $youtubeReporting->reportTypes->listReportTypes();    $htmlBody .= "<h3>Report Types</h3><ul>";   foreach ($reportTypes as $reportType) {     $htmlBody .= sprintf('<li>id: "%s", name: "%s"</li>', $reportType['id'], $reportType['name']);   }   $htmlBody .= '</ul>';    return $reportTypes; } ?>  <!doctype html> <html> <head> <title>Create a reporting job</title> </head> <body>   <form method="GET">     <div>       Job Name: <input type="text" id="jobName" name="jobName" placeholder="Enter Job Name">     </div>     <br>     <div>       Report Type Id: <input type="text" id="reportTypeId" name="reportTypeId" placeholder="Enter Report Type Id">     </div>     <br>     <input type="submit" value="Create!">   </form>   <?=$htmlBody?> </body> </html> 

レポートを取得する

このサンプルは、特定のジョブによって作成されたレポートを取得する方法を示しています。jobs.list メソッドを呼び出して、レポートジョブを取得します。次に、jobId パラメータを特定のジョブ ID に設定して reports.list メソッドを呼び出し、そのジョブによって作成されたレポートを取得します。最後に、各レポートのダウンロード URL が出力されます。

<?php  /**  * This sample supports the following use cases:  *  * 1. Retrieve reporting jobs by content owner:  *    Ex: php retrieve_reports.php  --contentOwner=="CONTENT_OWNER_ID"  *    Ex: php retrieve_reports.php  --contentOwner=="CONTENT_OWNER_ID" --includeSystemManaged==True  * 2. Retrieving list of downloadable reports for a particular job:  *    Ex: php retrieve_reports.php  --contentOwner=="CONTENT_OWNER_ID" --jobId="JOB_ID"  * 3. Download a report:  *    Ex: php retrieve_reports.php  --contentOwner=="CONTENT_OWNER_ID" --downloadUrl="DOWNLOAD_URL" --outputFile="report.txt"  */  /**  * Library Requirements  *  * 1. Install composer (https://getcomposer.org)  * 2. On the command line, change to this directory (api-samples/php)  * 3. Require the google/apiclient library  *    $ composer require google/apiclient:~2.0  */ if (!file_exists(__DIR__ . '/vendor/autoload.php')) {   throw new \Exception('please run "composer require google/apiclient:~2.2.0" in "' . __DIR__ .'"'); }  require_once __DIR__ . '/vendor/autoload.php'; session_start();   define('CREDENTIALS_PATH', '~/.credentials/youtube-php.json');  $longOptions = array(   'contentOwner::',   'downloadUrl::',   'includeSystemManaged::',   'jobId::',   'outputFile::', );  $options = getopt('', $longOptions);  $CONTENT_OWNER_ID = ($options['contentOwner'] ? $options['contentOwner'] : ''); $DOWNLOAD_URL = (array_key_exists('downloadUrl', $options) ?                  $options['downloadUrl'] : ''); $INCLUDE_SYSTEM_MANAGED = (array_key_exists('includeSystemManaged', $options) ?                            $options['includeSystemManaged'] : ''); $JOB_ID = (array_key_exists('jobId', $options) ? $options['jobId'] : ''); $OUTPUT_FILE = (array_key_exists('outputFile', $options) ?                 $options['outputFile'] : '');  /*  * You can obtain an OAuth 2.0 client ID and client secret from the  * {{ Google Cloud Console }} <{{ https://cloud.google.com/console }}>  * For more information about using OAuth 2.0 to access Google APIs, please see:  * <https://developers.google.com/youtube/v3/guides/authentication>  * Please ensure that you have enabled the YouTube Data API for your project.  */ function getClient() {   $client = new Google_Client();   $client->setAuthConfigFile('client_secrets_php.json');   $client->addScope(       'https://www.googleapis.com/auth/yt-analytics-monetary.readonly');   $client->setRedirectUri('urn:ietf:wg:oauth:2.0:oob');   $client->setAccessType('offline');    // Load previously authorized credentials from a file.   $credentialsPath = expandHomeDirectory(CREDENTIALS_PATH);   if (file_exists($credentialsPath)) {     $accessToken = json_decode(file_get_contents($credentialsPath), true);   } else {     // Request authorization from the user.     $authUrl = $client->createAuthUrl();     printf('Open the following link in your browser:\n%s\n', $authUrl);     print 'Enter verification code: ';     $authCode = trim(fgets(STDIN));      // Exchange authorization code for an access token.     $accessToken = $client->authenticate($authCode);     $refreshToken = $client->getRefreshToken();      // Store the credentials to disk.     if(!file_exists(dirname($credentialsPath))) {       mkdir(dirname($credentialsPath), 0700, true);     }     file_put_contents($credentialsPath, json_encode($accessToken));     printf('Credentials saved to %s\n', $credentialsPath);      //fclose($fp);   }   $client->setAccessToken($accessToken);    // Refresh the token if it's expired.   if ($client->isAccessTokenExpired()) {     $client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());     file_put_contents($credentialsPath, json_encode($client->getAccessToken()));   }    return $client; }  /**  * Expands the home directory alias '~' to the full path.  * @param string $path the path to expand.  * @return string the expanded path.  */ function expandHomeDirectory($path) {   $homeDirectory = getenv('HOME');   if (empty($homeDirectory)) {     $homeDirectory = getenv('HOMEDRIVE') . getenv('HOMEPATH');   }   return str_replace('~', realpath($homeDirectory), $path); }  /**  * Returns a list of reporting jobs. (jobs.listJobs)  *  * @param Google_Service_YouTubereporting $youtubeReporting YouTube Reporting service object.  * @param string $onBehalfOfContentOwner A content owner ID.  */ function listReportingJobs(Google_Service_YouTubeReporting $youtubeReporting,     $onBehalfOfContentOwner = '', $includeSystemManaged = False) {   $reportingJobs = $youtubeReporting->jobs->listJobs(       array('onBehalfOfContentOwner' => $onBehalfOfContentOwner,             'includeSystemManaged' => $includeSystemManaged));   print ('REPORTING JOBS' . PHP_EOL . '**************' . PHP_EOL);   foreach ($reportingJobs as $job) {     print($job['reportTypeId'] . ':' . $job['id'] . PHP_EOL);   }   print(PHP_EOL); }  /**  * Lists reports created by a specific job. (reports.listJobsReports)  *  * @param Google_Service_YouTubereporting $youtubeReporting YouTube Reporting service object.  * @param string $jobId The ID of the job.  * @param string $onBehalfOfContentOwner A content owner ID.  */ function listReportsForJob(Google_Service_YouTubeReporting $youtubeReporting,     $jobId, $onBehalfOfContentOwner = '') {   $reports = $youtubeReporting->jobs_reports->listJobsReports($jobId,       array('onBehalfOfContentOwner' => $onBehalfOfContentOwner));   print ('DOWNLOADABLE REPORTS' . PHP_EOL . '********************' . PHP_EOL);   foreach ($reports['reports'] as $report) {     print('Created: ' . date('d M Y', strtotime($report['createTime'])) .           ' (' . date('d M Y', strtotime($report['startTime'])) .           ' to ' . date('d M Y', strtotime($report['endTime'])) . ')' .           PHP_EOL .  '    ' . $report['downloadUrl'] . PHP_EOL . PHP_EOL);   } }  /**  * Download the report specified by the URL. (media.download)  *  * @param Google_Service_YouTubereporting $youtubeReporting YouTube Reporting service object.  * @param string $reportUrl The URL of the report to be downloaded.  * @param string $outputFile The file to write the report to locally.  * @param $htmlBody - html body.  */ function downloadReport(Google_Service_YouTubeReporting $youtubeReporting,     $reportUrl, $outputFile) {   $client = $youtubeReporting->getClient();   // Setting the defer flag to true tells the client to return a request that   // can be called with ->execute(); instead of making the API call immediately.   $client->setDefer(true);    // Call YouTube Reporting API's media.download method to download a report.   $request = $youtubeReporting->media->download('', array('alt' => 'media'));   $request = $request->withUri(new \GuzzleHttp\Psr7\Uri($reportUrl));   $responseBody = '';   try {     $response = $client->execute($request);     $responseBody = $response->getBody();   } catch (Google_Service_Exception $e) {     $responseBody = $e->getTrace()[0]['args'][0]->getResponseBody();   }   file_put_contents($outputFile, $responseBody);   $client->setDefer(false); }  // Define an object that will be used to make all API requests. $client = getClient(); // YouTube Reporting object used to make YouTube Reporting API requests. $youtubeReporting = new Google_Service_YouTubeReporting($client);  if ($CONTENT_OWNER_ID) {   if (!$DOWNLOAD_URL && !$JOB_ID) {     listReportingJobs($youtubeReporting, $CONTENT_OWNER_ID,                       $INCLUDE_SYSTEM_MANAGED);   } else if ($JOB_ID) {     listReportsForJob($youtubeReporting, $JOB_ID, $CONTENT_OWNER_ID);   } else if ($DOWNLOAD_URL && $OUTPUT_FILE) {     downloadReport($youtubeReporting, $DOWNLOAD_URL, $OUTPUT_FILE);   } }  ?>