2016-01-12 18 views
20

Sto gestendo un account Google e ha un canale YouTube collegato a un profilo Google+ e un canale YouTube collegato a una pagina Google+. Usando una chiave OAuth di questo account, voglio caricare video sul canale della "pagina", finora ho gestito solo con il canale "profilo". Il canale "pagina" ha il nome e il logo della nostra società, quindi non voglio che sia un canale personale (almeno apparentemente) "profilo"Come caricare su un canale YouTube specifico dello stesso account? (YouTube Data API)

Sto usando uno script quasi identico al Video script di esempio upload:

https://developers.google.com/youtube/v3/code_samples/php?hl=en#upload_a_video

<?php 

// Call set_include_path() as needed to point to your client library. 
require_once 'Google/Client.php'; 
require_once 'Google/Service/YouTube.php'; 
session_start(); 

/* 
* You can acquire an OAuth 2.0 client ID and client secret from the 
* Google Developers Console <https://console.developers.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/youtube'); 
$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); 

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. 
    $videoPath = "/path/to/file.mp4"; 

    // 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); 

    // 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); 


    $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['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>Video Uploaded</title> 
</head> 
<body> 
    <?=$htmlBody?> 
</body> 
</html> 

come accennato, lo script funziona per il canale che è stato collegato al "profilo" .. ho dato cancellato questo perché era solo per i test. Voglio caricare video invece sull'altro canale "page" di Google+, anch'esso di proprietà di questo account. Finora ho provato a impostare il canale desiderato come predefinito per questo account, ma devo effettivamente spostare il canale sul "profilo" di Google+? .. a meno che non sia possibile specificare il canale nello script sopra? Se sposto il canale, conserverà comunque il nome del canale? Non voglio nulla sul canale da cambiare (nome, logo). Da quello che vedo che cambierà il nome del canale (vedi immagine), che non è l'ideale, voglio solo caricare su questo canale - questo è tutto

enter image description here

+0

Hai provato la lettura di questo biglietto di overflow stack? (Http://stackoverflow.com/questions/18412492/is-it-possible-to-upload-videos-on-specific-channel-through-youtube-api). Potrebbe aiutarti. –

+0

Dovresti eseguire 'session_start();' prima. – PHPglue

+0

Ehi, @ Martin, hai una soluzione per questo? Anch'io sto affrontando lo stesso scenario. Gentilmente fammi sapere. –

risposta

1

Checkout questo:

https://developers.google.com/youtube/v3/docs/videos/insert

E noti i parametri onBehalfOfContentOwner e onBehalfOfContentOwnerChannel per la richiesta, penso che questo sia ciò di cui hai bisogno.

Questo parametro è destinato ai partner di contenuti di YouTube che possiedono e gestiscono molti canali YouTube diversi. Consente ai proprietari di contenuti di autenticarsi una sola volta ed eseguire azioni per conto del canale specificato nel valore del parametro, senza dover fornire credenziali di autenticazione per ciascun canale separato.

Anche qui è un esempio:

http://www.techtonet.com/youtube-upload-videos-with-partner-api-in-php/