以下是使用 PHP 專用 Google API 用戶端程式庫的程式碼範例,適用於 YouTube Content ID API。
注意:這些範例會匯入 YouTubePartner
服務。請參閱用戶端程式庫說明文件,下載執行這些範例所需的 YouTube Content ID API 繫結。
上傳影片並營利 (服務帳戶授權)
注意事項:這個範例使用服務帳戶授權。
這個程式碼範例上傳 YouTube 影片並套用營利政策。如要透過影片營利,您必須在 YouTube 版權管理系統中,以資產來聲明影片版權。這個範例上傳影片、建立新資產、使用該資產聲明影片版權,以及對影片套用營利政策。
程式碼會執行下列步驟:
此方法會擷取與授權要求相關聯的內容擁有者 ID,方法是呼叫
youtubePartner.contentOwners.list
API 方法並將fetchMine
參數設為true
。它會呼叫 Data API 的
videos.insert
方法,將影片新增至內容擁有者管理的頻道。這個 API 呼叫會將onBehalfOfContentOwner
委派參數設為在上一個步驟擷取的內容擁有者 ID。也會設定onBehalfOfContentOwnerChannel
委派參數,以識別適當的管道。
針對上傳作業,程式會使用Google_MediaFileUpload
類別並將resumable upload
參數設為true
,逐一上傳影片。如果上傳作業中斷,之後重試時,可從上次重試失敗的時間點繼續上傳。這項功能對於需要上傳大型影片的程式相當實用。影片內容上傳完畢後,程式碼需要建立資產物件,將內容識別為自有內容。資產代表 YouTube 版權管理系統中的一種智慧財產,資產擁有者可以利用資產設定政策,追蹤、封鎖與資產內容相符的影片,或是透過影片營利。
程式碼會使用youtubePartner.assets.insert
API 方法為上傳的影片建立資產,然後呼叫youtubePartner.ownership.update
方法來建立擁有權。程式碼範例會建立營利政策,用來聲明影片版權。
程式碼會呼叫
youtubePartner.claims.insert
,聲明上傳影片的比對結果是否為新建的資產。版權聲明會套用至上一個步驟建立的營利政策。最後,程式碼範例會呼叫
youtubePartner.videoAdvertisingOptions.update
方法,讓 TrueView 串流內廣告在影片播放期間顯示。
除了 youtubePartner.contentOwners.list
方法以外,所有 YouTube Content ID API 方法都會使用 onBehalfOfContentOwner
委派參數,並將其值設為內容擁有者的 ID。
<?php /** * This sample uploads, claims and monetizes a video by : * * 1. Finding the content owner ID via "youtubePartner.contentOwners.listContentOwners" method * 2. Uploading the video via "youtube.videos.insert" with utilizing "Google_MediaFileUpload" * 3. Creating an asset via "youtubePartner.assets.insert" method * 4. Creating ownership on the asset via "youtubePartner.ownership.update" method * 5. Claiming the video with the asset and a policy via "youtubePartner.claims.insert" * 6. Enabling the TrueView advertising on the video via "youtubePartner.videoAdvertisingOptions.update" * * @author Ibrahim Ulukaya */ // Call set_include_path() as needed to point to your client library. require_once 'Google/Client.php'; require_once 'Google/Service/YouTube.php'; require_once 'Google/Service/YouTubePartner.php'; session_start(); /* * You can acquire an OAuth 2.0 service account name and private key file from the * Google API Console <https://console.cloud.google.com/> * For more information about using OAuth 2.0 Service Accounts to access Google APIs, please see: * <https://developers.google.com/accounts/docs/OAuth2ServiceAccount> * Please ensure that you have enabled the YouTube Data API for your project. */ $OAUTH2_SERVICE_ACCOUNT_NAME = 'REPLACE ME'; // Make sure you keep your key.p12 file in a secure location, and isn't // readable by others. $OAUTH2_KEY_FILE = '/super/secret/path/to/key.p12'; $client = new Google_Client(); // Define an object that will be used to make all API requests. $youtube = new Google_Service_YouTube($client); // YouTube Partner object used to make Content ID API requests. $youtubePartner = new Google_Service_YouTubePartner($client); if (isset($_SESSION['service_token'])) { $client->setAccessToken($_SESSION['service_token']); } /* Load the key in PKCS 12 format. You need to download this from the * Google API Console when the service account was created. * Please read https://developers.google.com/youtube/partner/guides/oauth2_for_service_accounts * for info on configuration. */ $key = file_get_contents($OAUTH2_KEY_FILE); $cred = new Google_Auth_AssertionCredentials( $OAUTH2_SERVICE_ACCOUNT_NAME, array('https://www.googleapis.com/auth/youtubepartner'), $key); $client->setAssertionCredentials($cred); if($client->getAuth()->isAccessTokenExpired()) { $client->getAuth()->refreshTokenWithAssertion($cred); } $_SESSION['service_token'] = $client->getAccessToken(); try{ // Call the contentOwners.list method to retrieve the ID of the content // owner associated with the currently authenticated user's account. $contentOwnersListResponse = $youtubePartner->contentOwners->listContentOwners( array('fetchMine' => true)); $contentOwnerId = $contentOwnersListResponse['items'][0]['id']; // REPLACE this value with the path to the file you are uploading. $videoPath = "/path/to/file.mp4"; // REPLACE this value with the ID that uniquely identifies the channel that // you are uploading to. $channelId = "CHANNEL_ID"; // 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("Test title"); $snippet->setDescription("Test description"); $snippet->setTags(array("tag1", "tag2")); // Numeric video category. See // https://developers.google.com/youtube/v3/docs/videoCategories/list $snippet->setCategoryId("22"); // Set the video's status to "public". Valid statuses are "public", // "private" and "unlisted". $status = new Google_Service_YouTube_VideoStatus(); $status->privacyStatus = "public"; // 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, array('onBehalfOfContentOwner' => $contentOwnerId, 'onBehalfOfContentOwnerChannel' => $channelId)); // 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); // Set defer back to false to be able to make other calls after the file upload. $client->setDefer(false); $videoId = $status['id']; // Create an asset resource and set its metadata and type. Assets support // many metadata fields, but this sample only sets a title and description. $asset = new Google_Service_YouTubePartner_Asset(); $metadata = new Google_Service_YouTubePartner_Metadata(); $metadata->setTitle("Test asset title"); $metadata->setDescription("Test asset description"); $asset->setMetadata($metadata); $asset->setType("web"); // Insert the asset resource. Extract its unique asset ID from the API // response. $assetInsertResponse = $youtubePartner->assets->insert($asset, array('onBehalfOfContentOwner' => $contentOwnerId)); $assetId = $assetInsertResponse['id']; // Create a territory owner with owner, ratio, type and territories // Set the asset's ownership data. This example identifies the content // owner associated with the authenticated user's account as the asset's // owner. It indicates that the content owner owns 100% of the asset // worldwide. $owners = new Google_Service_YouTubePartner_TerritoryOwners(); $owners->setOwner($contentOwnerId); $owners->setRatio(100); $owners->setType("exclude"); $owners->setTerritories(array()); // Create ownership with a territory owner $ownership = new Google_Service_YouTubePartner_RightsOwnership(); $ownership->setGeneral(array($owners)); // Update the asset's ownership with the rights data defined above. $ownershipUpdateResponse = $youtubePartner->ownership->update($assetId, $ownership, array('onBehalfOfContentOwner' => $contentOwnerId)); // Define a monetization policy for the asset. $policy = new Google_Service_YouTubePartner_Policy(); $policyRule = new Google_Service_YouTubePartner_PolicyRule(); $policyRule->setAction("monetize"); $policy->setRules(array($policyRule)); // Create a claim resource. Identify the video being claimed, the asset // that represents the claimed content, the type of content being claimed, // and the policy that you want to apply to the claimed video. $claim = new Google_Service_YouTubePartner_Claim(); $claim->setAssetId($assetId); $claim->setVideoId($videoId); $claim->setPolicy($policy); $claim->setContentType("audiovisual"); // Insert the created claim. $claimInsertResponse = $youtubePartner->claims->insert($claim, array('onBehalfOfContentOwner' => $contentOwnerId)); # Enable ads for the video. This example enables the TrueView ad format. $option = new Google_Service_YouTubePartner_VideoAdvertisingOption(); $option->setAdFormats(array("trueview_instream")); $setAdvertisingResponse = $youtubePartner->videoAdvertisingOptions->update( $videoId, $option, array('onBehalfOfContentOwner' => $contentOwnerId)); $htmlBody .= "<h3>Video Uploaded</h3><ul>"; $htmlBody .= sprintf('<li>%s (%s) for content owner %s</li>', $status['snippet']['title'], $videoId, $contentOwnerId); $htmlBody .= "<h3>Asset created</h3><ul>"; $htmlBody .= sprintf('<li>%s</li>', $assetId); $htmlBody .= "<h3>Claim uploaded</h3><ul>"; $htmlBody .= sprintf('<li>%s with policy "%s"</li>', $claimInsertResponse['id'], $claimInsertResponse['policy']['rules'][0]['action']); $htmlBody .= "<h3>Advertising Option Added</h3><ul>"; $htmlBody .= sprintf('<li>%s</li>', $setAdvertisingResponse['adFormats'][0]); $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())); } ?> <!doctype html> <html> <head> <title>Claim Uploaded</title> </head> <body> <?=$htmlBody?> </body> </html>
上傳影片並透過影片營利
這個程式碼範例上傳 YouTube 影片並套用營利政策。如要透過影片營利,您必須在 YouTube 版權管理系統中,以資產來聲明影片版權。這個範例上傳影片、建立新資產、使用該資產聲明影片版權,以及對影片套用營利政策。
程式碼會執行下列步驟:
此方法會擷取與授權要求相關聯的內容擁有者 ID,方法是呼叫
youtubePartner.contentOwners.list
API 方法並將fetchMine
參數設為true
。它會呼叫 Data API 的
videos.insert
方法,將影片新增至內容擁有者管理的頻道。這個 API 呼叫會將onBehalfOfContentOwner
委派參數設為在上一個步驟擷取的內容擁有者 ID。也會設定onBehalfOfContentOwnerChannel
委派參數,以識別適當的管道。
針對上傳作業,程式會使用Google_MediaFileUpload
類別並將resumable upload
參數設為true
,逐一上傳影片。如果上傳作業中斷,之後重試時,可從上次重試失敗的時間點繼續上傳。這項功能對於需要上傳大型影片的程式相當實用。影片內容上傳完畢後,程式碼需要建立資產物件,將內容識別為自有內容。資產代表 YouTube 版權管理系統中的一種智慧財產,資產擁有者可以利用資產設定政策,追蹤、封鎖與資產內容相符的影片,或是透過影片營利。
程式碼會使用youtubePartner.assets.insert
API 方法為上傳的影片建立資產,然後呼叫youtubePartner.ownership.update
方法來建立擁有權。程式碼範例會建立營利政策,用來聲明影片版權。
程式碼會呼叫
youtubePartner.claims.insert
,聲明上傳影片的比對結果是否為新建的資產。版權聲明會套用至上一個步驟建立的營利政策。最後,程式碼範例會呼叫
youtubePartner.videoAdvertisingOptions.update
方法,讓 TrueView 串流內廣告在影片播放期間顯示。
除了 youtubePartner.contentOwners.list
方法以外,所有 YouTube Content ID API 方法都會使用 onBehalfOfContentOwner
委派參數,並將其值設為內容擁有者的 ID。
<?php /** * This sample uploads, claims and monetizes a video by : * * 1. Finding the content owner ID via "youtubePartner.contentOwners.listContentOwners" method * 2. Uploading the video via "youtube.videos.insert" with utilizing "Google_MediaFileUpload" * 3. Creating an asset via "youtubePartner.assets.insert" method * 4. Creating ownership on the asset via "youtubePartner.ownership.update" method * 5. Claiming the video with the asset and a policy via "youtubePartner.claims.insert" * 6. Enabling the TrueView advertising on the video via "youtubePartner.videoAdvertisingOptions.update" * * @author Ibrahim Ulukaya */ // Call set_include_path() as needed to point to your client library. require_once 'Google/Client.php'; require_once 'Google/Service/YouTube.php'; require_once 'Google/Service/YouTubePartner.php'; session_start(); /* * You can acquire an OAuth 2.0 client ID and client secret from the * Google API Console <https://console.cloud.google.com/> * 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); $client->setScopes('https://www.googleapis.com/auth/youtubepartner'); $redirect = filter_var('http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'], FILTER_SANITIZE_URL); $client->setRedirectUri($redirect); // Define an object that will be used to make all API requests. $youtube = new Google_Service_YouTube($client); // YouTube Partner object used to make Content ID API requests. $youtubePartner = new Google_Service_YouTubePartner($client); if (isset($_GET['code'])) { if (strval($_SESSION['state']) !== strval($_GET['state'])) { die('The session state did not match.'); } $client->authenticate($_GET['code']); $_SESSION['token'] = $client->getAccessToken(); header('Location: ' . $redirect); } if (isset($_SESSION['token'])) { $client->setAccessToken($_SESSION['token']); } // Check to ensure that the access token was successfully acquired. if ($client->getAccessToken()) { try{ // Call the contentOwners.list method to retrieve the ID of the content // owner associated with the currently authenticated user's account. $contentOwnersListResponse = $youtubePartner->contentOwners->listContentOwners( array('fetchMine' => true)); $contentOwnerId = $contentOwnersListResponse['items'][0]['id']; // REPLACE this value with the path to the file you are uploading. $videoPath = "/path/to/file.mp4"; // REPLACE this value with the ID that uniquely identifies the channel that // you are uploading to. $channelId = "CHANNEL_ID"; // 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("Test title"); $snippet->setDescription("Test description"); $snippet->setTags(array("tag1", "tag2")); // Numeric video category. See // https://developers.google.com/youtube/v3/docs/videoCategories/list $snippet->setCategoryId("22"); // Set the video's status to "public". Valid statuses are "public", // "private" and "unlisted". $status = new Google_Service_YouTube_VideoStatus(); $status->privacyStatus = "public"; // 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, array('onBehalfOfContentOwner' => $contentOwnerId, 'onBehalfOfContentOwnerChannel' => $channelId)); // 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); // Set defer back to false to be able to make other calls after the file upload. $client->setDefer(false); $videoId = $status['id']; // Create an asset resource and set its metadata and type. Assets support // many metadata fields, but this sample only sets a title and description. $asset = new Google_Service_YouTubePartner_Asset(); $metadata = new Google_Service_YouTubePartner_Metadata(); $metadata->setTitle("Test asset title"); $metadata->setDescription("Test asset description"); $asset->setMetadata($metadata); $asset->setType("web"); // Insert the asset resource. Extract its unique asset ID from the API // response. $assetInsertResponse = $youtubePartner->assets->insert($asset, array('onBehalfOfContentOwner' => $contentOwnerId)); $assetId = $assetInsertResponse['id']; // Create a territory owner with owner, ratio, type and territories // Set the asset's ownership data. This example identifies the content // owner associated with the authenticated user's account as the asset's // owner. It indicates that the content owner owns 100% of the asset // worldwide. $owners = new Google_Service_YouTubePartner_TerritoryOwners(); $owners->setOwner($contentOwnerId); $owners->setRatio(100); $owners->setType("exclude"); $owners->setTerritories(array()); // Create ownership with a territory owner $ownership = new Google_Service_YouTubePartner_RightsOwnership(); $ownership->setGeneral(array($owners)); // Update the asset's ownership with the rights data defined above. $ownershipUpdateResponse = $youtubePartner->ownership->update($assetId, $ownership, array('onBehalfOfContentOwner' => $contentOwnerId)); // Define a monetization policy for the asset. $policy = new Google_Service_YouTubePartner_Policy(); $policyRule = new Google_Service_YouTubePartner_PolicyRule(); $policyRule->setAction("monetize"); $policy->setRules(array($policyRule)); // Create a claim resource. Identify the video being claimed, the asset // that represents the claimed content, the type of content being claimed, // and the policy that you want to apply to the claimed video. $claim = new Google_Service_YouTubePartner_Claim(); $claim->setAssetId($assetId); $claim->setVideoId($videoId); $claim->setPolicy($policy); $claim->setContentType("audiovisual"); // Insert the created claim. $claimInsertResponse = $youtubePartner->claims->insert($claim, array('onBehalfOfContentOwner' => $contentOwnerId)); # Enable ads for the video. This example enables the TrueView ad format. $option = new Google_Service_YouTubePartner_VideoAdvertisingOption(); $option->setAdFormats(array("trueview_instream")); $setAdvertisingResponse = $youtubePartner->videoAdvertisingOptions->update( $videoId, $option, array('onBehalfOfContentOwner' => $contentOwnerId)); $htmlBody .= "<h3>Video Uploaded</h3><ul>"; $htmlBody .= sprintf('<li>%s (%s) for content owner %s</li>', $status['snippet']['title'], $videoId, $contentOwnerId); $htmlBody .= "<h3>Asset created</h3><ul>"; $htmlBody .= sprintf('<li>%s</li>', $assetId); $htmlBody .= "<h3>Claim uploaded</h3><ul>"; $htmlBody .= sprintf('<li>%s with policy "%s"</li>', $claimInsertResponse['id'], $claimInsertResponse['policy']['rules'][0]['action']); $htmlBody .= "<h3>Advertising Option Added</h3><ul>"; $htmlBody .= sprintf('<li>%s</li>', $setAdvertisingResponse['adFormats'][0]); $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['token'] = $client->getAccessToken(); } 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; } ?> <!doctype html> <html> <head> <title>Claim Uploaded</title> </head> <body> <?=$htmlBody?> </body> </html>
建立、管理及使用資產標籤
以下程式碼範例會進行一系列的 API 呼叫,示範如何建立並使用資產標籤,分類及搜尋素材資源庫中的項目。
<?php /** * This sample creates, manages and uses asset labels by: * * 1. Finding the content owner ID with "youtubePartner.contentOwners.list" method * 2. Creating an asset label with "youtubePartner.assetLabels.insert" method * 3. Retrieving existing asset labels with "youtubePartner.assetLabels.list" method * 4. Creating an asset with "youtubePartner.assets.insert" method * 5. Setting labels of an existing asset with "youtubePartner.assets.update" method * 4. Searching assets based on their labels with "youtubePartner.assetSearch.list" method * * @author Ibrahim Ulukaya */ // Call set_include_path() as needed to point to your local copy of the client library. require_once 'Google/Client.php'; require_once 'Google/Service/YouTube.php'; require_once 'Google/Service/YouTubePartner.php'; session_start(); /* * You can acquire an OAuth 2.0 service account name and private key file from the * Google API Console <https://console.cloud.google.com/> * For more information about using OAuth 2.0 Service Accounts to access Google APIs, please see: * <https://developers.google.com/accounts/docs/OAuth2ServiceAccount> * Please ensure that you have enabled the YouTube Data API and the YouTube Content ID API for * your project. */ $OAUTH2_SERVICE_ACCOUNT_NAME = 'REPLACE ME'; // Make sure that you keep your key.p12 file in a secure location and that the file isn't // readable by others. $OAUTH2_KEY_FILE = '/super/secret/path/to/key.p12'; $client = new Google_Client(); // Define an object that will be used to make Data API requests. $youtube = new Google_Service_YouTube($client); // YouTube Partner object used to make Content ID API requests. $youtubePartner = new Google_Service_YouTubePartner($client); if (isset($_SESSION['service_token'])) { $client->setAccessToken($_SESSION['service_token']); } /* Load the key in PKCS 12 format. You need to download the key from the * Google API Console when the service account is created. * Please read https://developers.google.com/youtube/partner/guides/oauth2_for_service_accounts * for info on configuration. */ $key = file_get_contents($OAUTH2_KEY_FILE); $cred = new Google_Auth_AssertionCredentials( $OAUTH2_SERVICE_ACCOUNT_NAME, array('https://www.googleapis.com/auth/youtubepartner'), $key); $client->setAssertionCredentials($cred); if($client->getAuth()->isAccessTokenExpired()) { $client->getAuth()->refreshTokenWithAssertion($cred); } $_SESSION['service_token'] = $client->getAccessToken(); try { // Call the contentOwners.list method to retrieve the ID of the content // owner associated with the currently authenticated user's account. $contentOwnersListResponse = $youtubePartner->contentOwners->listContentOwners( array('fetchMine' => true)); $contentOwnerId = $contentOwnersListResponse['items'][0]['id']; // Create an asset label and set its name. $assetLabel = new Google_Service_YouTubePartner_AssetLabel(); $assetLabel->setLabelName("label1"); try { // Insert the asset label resource. Extract its unique name from the API response. $assetLabelsInsertResponse = $youtubePartner->assetLabels->insert($assetLabel, array('onBehalfOfContentOwner' => $contentOwnerId)); $assetLabelName = $assetLabelsInsertResponse['labelName']; } catch (Google_Service_Exception $e) { // This error indicates that there is already an asset label with the same name. if ($e->getCode() == 409) { $assetLabelName = "label1"; } else { throw $e; } } // Retrieve asset labels that have been defined by the content owner. $assetLabelsListResponseBefore = $youtubePartner->assetLabels->listAssetLabels( array('onBehalfOfContentOwner' => $contentOwnerId)); // Create an asset resource and set its metadata and type. Assets support // many metadata fields, but this sample only sets a title. $asset = new Google_Service_YouTubePartner_Asset(); $metadata = new Google_Service_YouTubePartner_Metadata(); $metadata->setTitle("asset1"); $asset->setMetadata($metadata); $asset->setType("web"); // Call the assets.insert() method to create the asset resource. Extract its unique asset ID from the API // response. $assetInsertResponse1 = $youtubePartner->assets->insert($asset, array('onBehalfOfContentOwner' => $contentOwnerId)); $assetId1 = $assetInsertResponse1['id']; // Modify the list of asset labels associated with the asset resource, then call // the assets.update() method to update the resource. $assetInsertResponse1['label'] = array($assetLabelName,"label2"); $assetUpdateResponse1 = $youtubePartner->assets->update($assetId1, $assetInsertResponse1, array('onBehalfOfContentOwner' => $contentOwnerId)); // Call the assets.insert() method to create another asset. // This code reuses the $asset and $metadata variables created earlier, // but updates the title in the metadata before creating the asset. // The code then extracts the unique asset ID from the API response. $metadata->setTitle("asset2"); $assetInsertResponse2 = $youtubePartner->assets->insert($asset, array('onBehalfOfContentOwner' => $contentOwnerId)); $assetId2 = $assetInsertResponse2['id']; // Modify the list of asset labels associated with the asset resource, then call // the assets.update() method to update the resource. $assetInsertResponse2['label'] = array("label2"); $assetUpdateResponse2 = $youtubePartner->assets->update($assetId2, $assetInsertResponse2, array('onBehalfOfContentOwner' => $contentOwnerId)); // Retrieve asset labels that have been defined by the content owner. This list of labels // can be compared to the list retrieved earlier to see the effect of the API call. $assetLabelsListResponseAfter = $youtubePartner->assetLabels->listAssetLabels( array('onBehalfOfContentOwner' => $contentOwnerId)); /* * AssetSearch may not be able to return the expected results right away, as there is a delay * in indexing the assets with labels for the asset search after they are added. * If you run this code sample a second time, you should see the assets created in * the previous run. */ // Search for assets having both 'label1' and 'label2' labels. // The results should include "asset1" after indexing is succesfully finished. $assetSearchResponse1 = $youtubePartner->assetSearch->listAssetSearch( array('labels' => "label1, label2", 'onBehalfOfContentOwner' => $contentOwnerId)); // Search for assets having at least one of 'label1' and 'label2' labels. // The results should include "asset1" and "asset2" after indexing is succesfully finished. $assetSearchResponse2 = $youtubePartner->assetSearch->listAssetSearch( array('labels' => "label1, label2", 'includeAnyProvidedlabel' => true, 'onBehalfOfContentOwner' => $contentOwnerId)); $htmlBody .= "<h3>Content owner</h3><ul>"; $htmlBody .= sprintf('<li>Content owner %s</li>', $contentOwnerId); $htmlBody .= '</ul>'; $htmlBody .= "<h3>Asset label created</h3><ul>"; $htmlBody .= sprintf('<li>%s</li>', $assetLabelName); $htmlBody .= '</ul>'; $htmlBody .= "<h3>Asset Labels Before</h3><ul>"; foreach ($assetLabelsListResponseBefore['items'] as $labelItem) { $htmlBody .= sprintf('<li>%s</li>', $labelItem['labelName']); } $htmlBody .= '</ul>'; $htmlBody .= "<h3>Asset created</h3><ul>"; $htmlBody .= sprintf('<li>%s</li>', $assetId1); $htmlBody .= '</ul>'; $htmlBody .= "<h3>Added asset labels</h3><ul>"; $htmlBody .= sprintf('<li>%s %s to %s</li>', $assetInsertResponse1['label'][0], $assetInsertResponse1['label'][1], $assetId1); $htmlBody .= '</ul>'; $htmlBody .= "<h3>Asset created</h3><ul>"; $htmlBody .= sprintf('<li>%s</li>', $assetId2); $htmlBody .= '</ul>'; $htmlBody .= "<h3>Added asset labels</h3><ul>"; $htmlBody .= sprintf('<li>%s to %s</li>', $assetInsertResponse2['label'][0], $assetId2); $htmlBody .= '</ul>'; $htmlBody .= "<h3>Asset Labels After</h3><ul>"; foreach ($assetLabelsListResponseAfter['items'] as $labelItem) { $htmlBody .= sprintf('<li>%s</li>', $labelItem['labelName']); } $htmlBody .= '</ul>'; $htmlBody .= "<h3>Asset labeled with label1 and label2 </h3><ul>"; foreach ($assetSearchResponse1['items'] as $assetItem) { $htmlBody .= sprintf('<li>%s</li>', $assetItem['id']); } $htmlBody .= '</ul>'; $htmlBody .= "<h3>Asset labeled with label1 and/or label2 </h3><ul>"; foreach ($assetSearchResponse2['items'] as $assetItem) { $htmlBody .= sprintf('<li>%s</li>', $assetItem['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())); } ?> <!doctype html> <html> <head> <title>Assets Labels Example</title> </head> <body> <?=$htmlBody?> </body> </html>
上傳參考資料 (服務帳戶授權)
注意事項:這個範例使用服務帳戶授權。
這個程式碼範例示範如何使用 YouTube Content ID API 上傳參考檔案。參考資料代表資產的實際內容。YouTube 會將新上傳的影片與參考檔案庫進行比對,藉此自動產生資產擁有者的版權聲明。如要上傳參考檔案,我們必須先建立定義擁有權資料和 AssetMatchPolicy 的資產。
如要這麼做,以下程式碼已完成下列步驟:
- 此方法會擷取與授權要求相關聯的內容擁有者 ID,方法是呼叫
youtubePartner.contentOwners.list
API 方法並將fetchMine
參數設為true
。 - 它會呼叫
youtubePartner.assets.insert
方法來建立資產。 - 其會呼叫
youtubePartner.ownership.update
方法,設定資產的擁有權資料。 - 它會呼叫
youtubePartner.assetMatchPolicy.update
以設定資產的資產比對政策。 - 它會呼叫
youtubePartner.references.insert
方法來上傳資產的參考檔案。針對上傳作業,程式會使用Google_MediaFileUpload
類別並將resumable upload
參數設為true
,逐一上傳影片。如果上傳作業中斷,之後重試時,可從上次重試失敗的時間點繼續上傳。這項功能對於需要上傳大型影片的程式相當實用。
除了 youtubePartner.contentOwners.list
方法以外,所有 YouTube Content ID API 方法都會使用 onBehalfOfContentOwner
委派參數,並將其值設為內容擁有者的 ID。
<?php /** * This sample creates an asset, asset ownership, match policy and uploads a reference video by: * * 1. Finding the content owner ID with "youtubePartner.contentOwners.list" method * 2. Creating an asset with "youtubePartner.assets.insert" method * 3. Configure ownership on the asset with "youtubePartner.ownership.update" method * 4. Configure the asset's match policy with "youtubePartner.assetMatchPolicy.update" method * 5. Creating a refererence with "youtubePartner.reference.insert" method * 6. Uploading a reference video with "youtube.videos.insert" utilizing "Google_MediaFileUpload" * * @author Ibrahim Ulukaya */ // Call set_include_path() as needed to point to your client library. require_once 'Google/Client.php'; require_once 'Google/Service/YouTube.php'; require_once 'Google/Service/YouTubePartner.php'; session_start(); /* * You can acquire an OAuth 2.0 service account name and private key file from the * Google API Console <https://console.cloud.google.com/> * For more information about using OAuth 2.0 Service Accounts to access Google APIs, please see: * <https://developers.google.com/accounts/docs/OAuth2ServiceAccount> * Please ensure that you have enabled the YouTube Data API for your project. */ $OAUTH2_SERVICE_ACCOUNT_NAME = 'REPLACE ME'; // Make sure you keep your key.p12 file in a secure location, and isn't // readable by others. $OAUTH2_KEY_FILE = '/super/secret/path/to/key.p12'; $client = new Google_Client(); // Define an object that will be used to make all API requests. $youtube = new Google_Service_YouTube($client); // YouTube Partner object used to make Content ID API requests. $youtubePartner = new Google_Service_YouTubePartner($client); if (isset($_SESSION['service_token'])) { $client->setAccessToken($_SESSION['service_token']); } /* Load the key in PKCS 12 format. You need to download this from the * Google API Console when the service account was created. * Please read https://developers.google.com/youtube/partner/guides/oauth2_for_service_accounts * for info on configuration. */ $key = file_get_contents($OAUTH2_KEY_FILE); $cred = new Google_Auth_AssertionCredentials( $OAUTH2_SERVICE_ACCOUNT_NAME, array('https://www.googleapis.com/auth/youtubepartner'), $key); $client->setAssertionCredentials($cred); if($client->getAuth()->isAccessTokenExpired()) { $client->getAuth()->refreshTokenWithAssertion($cred); } $_SESSION['service_token'] = $client->getAccessToken(); try{ // REPLACE this value with the path to the file you are uploading // as a reference. $referenceVideoPath = "/path/to/file.mp4"; // Call the contentOwners.list method to retrieve the ID of the content // owner associated with the currently authenticated user's account. $contentOwnersListResponse = $youtubePartner->contentOwners->listContentOwners( array('fetchMine' => true)); $contentOwnerId = $contentOwnersListResponse['items'][0]['id']; // Create an asset resource and set its metadata and type. Assets support // many metadata fields, but this sample only sets a title and description. $asset = new Google_Service_YouTubePartner_Asset(); $metadata = new Google_Service_YouTubePartner_Metadata(); $metadata->setTitle("Test asset title"); $metadata->setDescription("Test asset description"); $asset->setMetadata($metadata); $asset->setType("web"); // Insert the asset resource. Extract its unique asset ID from the API // response. $assetInsertResponse = $youtubePartner->assets->insert($asset, array('onBehalfOfContentOwner' => $contentOwnerId)); $assetId = $assetInsertResponse['id']; // Set the asset's ownership data. This example identifies the content // owner associated with the authenticated user's account as the asset's // owner. It indicates that the content owner owns 100% of the asset in // Great Britain and Poland. $owners = new Google_Service_YouTubePartner_TerritoryOwners(); $owners->setOwner($contentOwnerId); $owners->setRatio(100); $owners->setType("include"); $owners->setTerritories(array("PL","GB")); // Define the rights that the owner owns for the asset. $ownership = new Google_Service_YouTubePartner_RightsOwnership(); $ownership->setGeneral(array($owners)); // Update the asset's ownership with the rights data defined above. $ownershipUpdateResponse = $youtubePartner->ownership->update($assetId, $ownership, array('onBehalfOfContentOwner' => $contentOwnerId)); $requiredTerritories = new Google_Service_YouTubePartner_TerritoryCondition(); $requiredTerritories->setTerritories(array()); $requiredTerritories->setType("exclude"); // Create a "track" policy for the asset. The policy specifies the // conditions when the policy will be applied by defining a duration, // territories where the policy applies, and the type of content that an // uploaded video must match. $everywherePolicyCondition = new Google_Service_YouTubePartner_Conditions(); $everywherePolicyCondition->setContentMatchType(array("video")); $everywherePolicyCondition->setRequiredTerritories($requiredTerritories); $everywherePolicyCondition->setReferenceDuration(array("low" => 10)); // Create a policy rule and associate the conditions with the rule. $trackEverywhereRule = new Google_Service_YouTubePartner_PolicyRule(); $trackEverywhereRule->setAction("track"); $trackEverywhereRule->setConditions($everywherePolicyCondition); // Associate the policy rule with an assetMatchPolicy resource. $assetMatchPolicy = new Google_Service_YouTubePartner_AssetMatchPolicy(); $assetMatchPolicy->setRules(array($trackEverywhereRule)); // Update the asset's match policy $youtubePartner->assetMatchPolicy->update($assetId, $assetMatchPolicy, array('onBehalfOfContentOwner' => $contentOwnerId)); // 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 reference resource. Set the asset ID associated with the // reference, and identify the type of reference content being uploaded. $reference = new Google_Service_YouTubePartner_Reference(); $reference->setAssetId($assetId); $reference->setContentType("video"); // Create a request for the API's references.insert method to insert the reference resource // while uploading the reference video. $insertRequest = $youtubePartner->references->insert($reference, array('onBehalfOfContentOwner' => $contentOwnerId)); // Create a MediaFileUpload object for resumable uploads. $media = new Google_Http_MediaFileUpload( $client, $insertRequest, 'video/*', null, true, $chunkSizeBytes ); $media->setFileSize(filesize($referenceVideoPath)); // Read the media file and upload it chunk by chunk. $status = false; $handle = fopen($referenceVideoPath, "rb"); while (!$status && !feof($handle)) { $chunk = fread($handle, $chunkSizeBytes); $status = $media->nextChunk($chunk); } fclose($handle); // Set defer back to false to be able to make other calls after the file upload. $client->setDefer(false); $htmlBody .= "<h3>Content owner</h3><ul>"; $htmlBody .= sprintf('<li>Content owner %s</li>', $contentOwnerId); $htmlBody .= '</ul>'; $htmlBody .= "<h3>Asset created</h3><ul>"; $htmlBody .= sprintf('<li>%s</li>', $assetId); $htmlBody .= '</ul>'; $htmlBody .= "<h3>Asset ownership has been created</h3>"; $htmlBody .= "<h3>Asset match policy has been created</h3>"; $htmlBody .= "<h3>Reference has been created</h3><ul>"; $htmlBody .= sprintf('<li>%s</li>', $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())); } ?> <!doctype html> <html> <head> <title>Reference Uploaded</title> </head> <body> <?=$htmlBody?> </body> </html>
上傳參考資料
這個程式碼範例示範如何使用 YouTube Content ID API 上傳參考檔案。參考資料代表資產的實際內容。YouTube 會將新上傳的影片與參考檔案庫進行比對,藉此自動產生資產擁有者的版權聲明。如要上傳參考檔案,我們必須先建立定義擁有權資料和 AssetMatchPolicy 的資產。
如要這麼做,以下程式碼已完成下列步驟:
- 此方法會擷取與授權要求相關聯的內容擁有者 ID,方法是呼叫
youtubePartner.contentOwners.list
API 方法並將fetchMine
參數設為true
。 - 它會呼叫
youtubePartner.assets.insert
方法來建立資產。 - 其會呼叫
youtubePartner.ownership.update
方法,設定資產的擁有權資料。 - 它會呼叫
youtubePartner.assetMatchPolicy.update
以設定資產的資產比對政策。 - 它會呼叫
youtubePartner.references.insert
方法來上傳資產的參考檔案。針對上傳作業,程式會使用Google_MediaFileUpload
類別並將resumable upload
參數設為true
,逐一上傳影片。如果上傳作業中斷,之後重試時,可從上次重試失敗的時間點繼續上傳。這項功能對於需要上傳大型影片的程式相當實用。
除了 youtubePartner.contentOwners.list
方法以外,所有 YouTube Content ID API 方法都會使用 onBehalfOfContentOwner
委派參數,並將其值設為內容擁有者的 ID。
<?php /** * This sample creates an asset, asset ownership, match policy and uploads a reference video by: * * 1. Finding the content owner ID with "youtubePartner.contentOwners.list" method * 2. Creating an asset with "youtubePartner.assets.insert" method * 3. Configure ownership on the asset with "youtubePartner.ownership.update" method * 4. Configure the asset's match policy with "youtubePartner.assetMatchPolicy.update" method * 5. Creating a refererence with "youtubePartner.reference.insert" method * 6. Uploading a reference video with "youtube.videos.insert" utilizing "Google_MediaFileUpload" * * @author Ibrahim Ulukaya */ // Call set_include_path() as needed to point to your client library. require_once 'Google/Client.php'; require_once 'Google/Service/YouTube.php'; require_once 'Google/Service/YouTubePartner.php'; session_start(); /* * You can acquire an OAuth 2.0 client ID and client secret from the * Google API Console <https://console.cloud.google.com/> * 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); $client->setScopes('https://www.googleapis.com/auth/youtubepartner'); $redirect = filter_var('http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'], FILTER_SANITIZE_URL); $client->setRedirectUri($redirect); // Define an object that will be used to make all API requests. $youtube = new Google_Service_YouTube($client); // YouTube Partner object used to make Content ID API requests. $youtubePartner = new Google_Service_YouTubePartner($client); if (isset($_GET['code'])) { if (strval($_SESSION['state']) !== strval($_GET['state'])) { die('The session state did not match.'); } $client->authenticate($_GET['code']); $_SESSION['token'] = $client->getAccessToken(); header('Location: ' . $redirect); } if (isset($_SESSION['token'])) { $client->setAccessToken($_SESSION['token']); } // Check to ensure that the access token was successfully acquired. if ($client->getAccessToken()) { try{ // REPLACE this value with the path to the file you are uploading // as a reference. $referenceVideoPath = "/path/to/file.mp4"; // Call the contentOwners.list method to retrieve the ID of the content // owner associated with the currently authenticated user's account. $contentOwnersListResponse = $youtubePartner->contentOwners->listContentOwners( array('fetchMine' => true)); $contentOwnerId = $contentOwnersListResponse['items'][0]['id']; // Create an asset resource and set its metadata and type. Assets support // many metadata fields, but this sample only sets a title and description. $asset = new Google_Service_YouTubePartner_Asset(); $metadata = new Google_Service_YouTubePartner_Metadata(); $metadata->setTitle("Test asset title"); $metadata->setDescription("Test asset description"); $asset->setMetadata($metadata); $asset->setType("web"); // Insert the asset resource. Extract its unique asset ID from the API // response. $assetInsertResponse = $youtubePartner->assets->insert($asset, array('onBehalfOfContentOwner' => $contentOwnerId)); $assetId = $assetInsertResponse['id']; // Set the asset's ownership data. This example identifies the content // owner associated with the authenticated user's account as the asset's // owner. It indicates that the content owner owns 100% of the asset in // Great Britain and Poland. $owners = new Google_Service_YouTubePartner_TerritoryOwners(); $owners->setOwner($contentOwnerId); $owners->setRatio(100); $owners->setType("include"); $owners->setTerritories(array("PL","GB")); // Define the rights that the owner owns for the asset. $ownership = new Google_Service_YouTubePartner_RightsOwnership(); $ownership->setGeneral(array($owners)); // Update the asset's ownership with the rights data defined above. $ownershipUpdateResponse = $youtubePartner->ownership->update($assetId, $ownership, array('onBehalfOfContentOwner' => $contentOwnerId)); $requiredTerritories = new Google_Service_YouTubePartner_TerritoryCondition(); $requiredTerritories->setTerritories(array()); $requiredTerritories->setType("exclude"); // Create a "track" policy for the asset. The policy specifies the // conditions when the policy will be applied by defining a duration, // territories where the policy applies, and the type of content that an // uploaded video must match. $everywherePolicyCondition = new Google_Service_YouTubePartner_Conditions(); $everywherePolicyCondition->setContentMatchType(array("video")); $everywherePolicyCondition->setRequiredTerritories($requiredTerritories); $everywherePolicyCondition->setReferenceDuration(array("low" => 10)); // Create a policy rule and associate the conditions with the rule. $trackEverywhereRule = new Google_Service_YouTubePartner_PolicyRule(); $trackEverywhereRule->setAction("track"); $trackEverywhereRule->setConditions($everywherePolicyCondition); // Associate the policy rule with an assetMatchPolicy resource. $assetMatchPolicy = new Google_Service_YouTubePartner_AssetMatchPolicy(); $assetMatchPolicy->setRules(array($trackEverywhereRule)); // Update the asset's match policy $youtubePartner->assetMatchPolicy->update($assetId, $assetMatchPolicy, array('onBehalfOfContentOwner' => $contentOwnerId)); // 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 reference resource. Set the asset ID associated with the // reference, and identify the type of reference content being uploaded. $reference = new Google_Service_YouTubePartner_Reference(); $reference->setAssetId($assetId); $reference->setContentType("video"); // Create a request for the API's references.insert method to insert the reference resource // while uploading the reference video. $insertRequest = $youtubePartner->references->insert($reference, array('onBehalfOfContentOwner' => $contentOwnerId)); // Create a MediaFileUpload object for resumable uploads. $media = new Google_Http_MediaFileUpload( $client, $insertRequest, 'video/*', null, true, $chunkSizeBytes ); $media->setFileSize(filesize($referenceVideoPath)); // Read the media file and upload it chunk by chunk. $status = false; $handle = fopen($referenceVideoPath, "rb"); while (!$status && !feof($handle)) { $chunk = fread($handle, $chunkSizeBytes); $status = $media->nextChunk($chunk); } fclose($handle); // Set defer back to false to be able to make other calls after the file upload. $client->setDefer(false); $htmlBody .= "<h3>Content owner</h3><ul>"; $htmlBody .= sprintf('<li>Content owner %s</li>', $contentOwnerId); $htmlBody .= '</ul>'; $htmlBody .= "<h3>Asset created</h3><ul>"; $htmlBody .= sprintf('<li>%s</li>', $assetId); $htmlBody .= '</ul>'; $htmlBody .= "<h3>Asset ownership has been created</h3>"; $htmlBody .= "<h3>Asset match policy has been created</h3>"; $htmlBody .= "<h3>Reference has been created</h3><ul>"; $htmlBody .= sprintf('<li>%s</li>', $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['token'] = $client->getAccessToken(); } 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; } ?> <!doctype html> <html> <head> <title>Reference Uploaded</title> </head> <body> <?=$htmlBody?> </body> </html>
擷取內容擁有者的代管頻道 (服務帳戶授權)
注意事項:這個範例使用服務帳戶授權。
以下程式碼範例示範如何擷取內容擁有者管理的頻道。
程式碼範例會先呼叫 youtubePartner.contentOwners.list
API 方法,並將 mine
參數設為 true
。這項要求會擷取授權使用者的內容擁有者 ID。接著,程式碼會使用該 ID 呼叫 Data API 的 youtube.channels.list
方法,擷取內容擁有者管理的頻道。這個呼叫使用委派參數,並將 onBehalfOfContentOwner
參數設為內容擁有者 ID,並將 managedByMe
參數設為 true
。
<?php /** * This sample lists channels that are managed by the authorized account's content ID by: * * 1. Finding the content owner ID with "youtubePartner.contentOwners.listContentOwners" method * 2. Listing channels with "youtube.channels.list" method and delegation parameters * 3. Utilizing pageToken to retrieve next set of results, repeating the process if necessary * * @author Ibrahim Ulukaya */ // Call set_include_path() as needed to point to your client library. require_once 'Google/Client.php'; require_once 'Google/Service/YouTube.php'; require_once 'Google/Service/YouTubePartner.php'; session_start(); /* * You can acquire an OAuth 2.0 service account name and private key file from the * Google API Console <https://console.cloud.google.com/> * For more information about using OAuth 2.0 Service Accounts to access Google APIs, please see: * <https://developers.google.com/accounts/docs/OAuth2ServiceAccount> * Please ensure that you have enabled the YouTube Data API for your project. */ $OAUTH2_SERVICE_ACCOUNT_NAME = 'REPLACE ME'; // Make sure you keep your key.p12 file in a secure location, and isn't // readable by others. $OAUTH2_KEY_FILE = '/super/secret/path/to/key.p12'; $client = new Google_Client(); // Define an object that will be used to make all API requests. $youtube = new Google_Service_YouTube($client); // YouTube Partner object used to make Content ID API requests. $youtubePartner = new Google_Service_YouTubePartner($client); if (isset($_SESSION['service_token'])) { $client->setAccessToken($_SESSION['service_token']); } /* Load the key in PKCS 12 format. You need to download this from the * Google API Console when the service account was created. * Please read https://developers.google.com/youtube/partner/guides/oauth2_for_service_accounts * for info on configuration. */ $key = file_get_contents($OAUTH2_KEY_FILE); $cred = new Google_Auth_AssertionCredentials( $OAUTH2_SERVICE_ACCOUNT_NAME, array('https://www.googleapis.com/auth/youtubepartner'), $key); $client->setAssertionCredentials($cred); if($client->getAuth()->isAccessTokenExpired()) { $client->getAuth()->refreshTokenWithAssertion($cred); } $_SESSION['service_token'] = $client->getAccessToken(); try{ // Call the contentOwners.list method to retrieve the ID of the content // owner associated with the currently authenticated user's account. $contentOwnersListResponse = $youtubePartner->contentOwners->listContentOwners( array('fetchMine' => true)); $contentOwnerId = $contentOwnersListResponse['items'][0]['id']; // Call the YouTube Data API's channels.list method to retrieve a list of // channels that the content owner manages. $listResponse = $youtube->channels->listChannels("snippet", array('onBehalfOfContentOwner' => $contentOwnerId, 'managedByMe' => true, 'maxResults' => 50)); $channels = ''; while (!empty($listResponse['items'])) { foreach ($listResponse['items'] as $listResult) { $channels .= sprintf('<li>%s (%s)</li>', $listResult['snippet']['title'], $listResult['id']); } // If the API response returns a pageToken, use that value to request the // next set of results. $pageToken = $listResponse['pageToken']; if(is_null($pageToken)) break; $listResponse = $youtube->channels->listChannels("snippet", array('onBehalfOfContentOwner' => $contentOwnerId, 'managedByMe' => true, 'maxResults' => 50, 'pageToken' => $pageToken)); } $htmlBody .= <<<END <h3>Channels</h3> <ul>$channels</ul> END; } 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())); } ?> <!doctype html> <html> <head> <title>My Managed Channels</title> </head> <body> <?=$htmlBody?> </body> </html>