PHP Code Samples

The following code samples, which use the Google API Client Library for PHP , are available for the YouTube Reporting API . You can download these code samples from the php folder of the YouTube APIs code sample repository on GitHub .

  1. Create a reporting job ( reportTypes.list , jobs.create )
  2. Retrieve reports ( jobs.list , jobs.reports.list )

Create a reporting job

This sample demonstrates how to create a reporting job. It calls the reportTypes.list method to retrieve a list of available report types. It then calls the jobs.create method to create a new reporting job.

< ?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 
>  

Retrieve reports

This sample demonstrates how to retrieve reports created by a specific job. It calls the jobs.list method to retrieve reporting jobs. It then calls the reports.list method with the jobId parameter set to a specific job ID to retrieve reports created by that job. Finally, the sample prints out the download URL for each report.

< ?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); 
 } 
 } 
 ? 
>  
Design a Mobile Site
View Site in Mobile | Classic
Share by: