2016-01-12 10 views
20

Ich verwalte ein Google-Konto und es ist ein YouTube-Kanal mit einem Google+ Profil verbunden und ein YouTube-Kanal mit einer Google+ Seite verbunden. Mit einem OAuth-Schlüssel dieses Kontos möchte ich Videos auf den "page" -Kanal hochladen, bisher habe ich es nur mit dem "profil" -Kanal geschafft. Der "Seite" -Kanal hat unseren Firmennamen und Logo, also möchte ich nicht, dass es ein persönlicher (zumindest scheinbar) "Profil" -KanalWie lade ich einen bestimmten YouTube-Kanal desselben Kontos hoch? (YouTube Data API)

ist Ich benutze ein Skript fast identisch mit dem Video-Upload-Beispielskript:

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> 

wie bereits erwähnt, wird das Skript arbeitet für den Kanal, der mit dem „Profil“ verbunden war .. ich habe dies seit gelöscht, da es nur zum Testen war. Ich möchte stattdessen Videos auf den anderen Google+ "page" -Kanal hochladen, der auch diesem Konto gehört. Bisher habe ich versucht, den gewünschten Kanal als Standard für dieses Konto festzulegen, aber muss ich den Kanal tatsächlich auf das Google+ "Profil" verschieben? .. es sei denn, ich kann im obigen Skript einen Kanal angeben. Wenn ich den Kanal verschiebe, behält er dann den Namen des Kanals? Ich möchte nichts über den Kanal ändern (Name, Logo). Von dem, was ich sehe es wird den Kanalnamen ändern (siehe Bild), die nicht ideal ist, ich möchte nur auf diesen Kanal laden - das ist alles

enter image description here

+0

Haben Sie versucht, dieses Stack-Überlauf-Ticket zu lesen? (http://stackoverflow.com/questions/18412492/is-it-possible-to-upload-videos-on-specific-channel-through-youtube-api). Es könnte dir helfen. –

+0

Sie sollten zuerst 'session_start();' ausführen. – PHPglue

+0

Hey @Martyn, hast du eine Lösung dafür? Ich bin auch mit dem gleichen Szenario konfrontiert. Bitte lass es mich wissen. –

Antwort

1

Kasse dies:

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

Und beachten Sie die onBehalfOfContentOwner und die onBehalfOfContentOwnerChannel Parameter für die Anfrage, ich denke, das ist, was Sie brauchen.

Dieser Parameter ist für YouTube-Inhaltspartner gedacht, die viele verschiedene YouTube-Kanäle besitzen und verwalten. Es ermöglicht Inhaltseigentümern, sich einmal zu authentifizieren und Aktionen für den im Parameterwert angegebenen Kanal auszuführen, ohne für jeden einzelnen Kanal Authentifizierungsinformationen angeben zu müssen.

Auch hier ein Beispiel:

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

Verwandte Themen