如何使用PHP中的YouTube API在特定频道上传视频?

时间:2016-10-04 05:37:18

标签: php youtube access-token youtube-data-api

我想让用户无需身份验证即可在我的频道上传视频(如果需要)。有可能吗?

请帮帮我。

由于 OM

1 个答案:

答案 0 :(得分:1)

是Omprakash,有可能

  1. 您需要适用于PHP的Google API客户端库。
  2. 您还需要创建一个项目 https://console.developers.google.com/并获得证书(即 客户秘密&客户ID)。
  3. 最后,您需要为特定频道生成访问令牌。 请看一下这个链接 (https://youtube-eng.googleblog.com/2013/06/google-page-identities-and-youtube-api_24.html) 生成访问令牌。
  4. 一旦准备好所有这些东西,就可以使用现成的 用于PHP上传的Google API客户端库中提供的示例代码 YouTube上的视频。
  5. 注意:这不是详细的过程。无法详细解释堆栈溢出的所有过程。但是,一旦您接近解决方案,您可以重新发布或发表评论以获得进一步的帮助。

    这是在YouTube上传视频的示例代码。希望,它会帮助你

    /*include google libraries */
    require_once '../api/src/Google/autoload.php';
    require_once '../api/src/Google/Client.php';
    require_once '../api/src/Google/Service/YouTube.php';
    
    $application_name = 'Your application/project name created on google developer console'; 
    $client_secret = 'Your client secret';
    $client_id = 'Your client id';
    $scope = array('https://www.googleapis.com/auth/youtube.upload', 'https://www.googleapis.com/auth/youtube', 'https://www.googleapis.com/auth/youtubepartner');
    
    
        try{ 
            $key = file_get_contents('the_key.txt'); //it stores access token obtained in step 3
            $videoPath = 'video path on your server goes here';
            $videoTitle = 'video title';
            $videoDescription = 'video description';
            $videoCategory = "22"; //please take a look at youtube video categories for videoCategory.Not so important for our example
            $videoTags = array('tag1', 'tag2','tag3');  
    
            // Client init
            $client = new Google_Client();
            $client->setApplicationName($application_name);
            $client->setClientId($client_id);
            $client->setAccessType('offline');
            $client->setAccessToken($key);
            $client->setScopes($scope);
            $client->setClientSecret($client_secret);
    
            if ($client->getAccessToken()) {
                /**
                 * Check to see if our access token has expired. If so, get a new one and save it to file for future use.
                 */
                if($client->isAccessTokenExpired()) {
                    $newToken = json_decode($client->getAccessToken());
                    $client->refreshToken($newToken->refresh_token);
                    file_put_contents('the_key.txt', $client->getAccessToken());
                }
    
                $youtube = new Google_Service_YouTube($client);
    
    
    
                // Create a snipet with title, description, tags and category id
                $snippet = new Google_Service_YouTube_VideoSnippet();
                $snippet->setTitle($videoTitle);
                $snippet->setDescription($videoDescription);
                $snippet->setCategoryId($videoCategory);
                $snippet->setTags($videoTags);
    
                // Create a video status with privacy status. Options are "public", "private" and "unlisted".
                $status = new Google_Service_YouTube_VideoStatus();
                $status->setPrivacyStatus('public');
    
                // Create a YouTube video with snippet and status
                $video = new Google_Service_YouTube_Video();
                $video->setSnippet($snippet);
                $video->setStatus($status);
    
                // Size of each chunk of data in bytes. Setting it higher leads faster upload (less chunks,
                // for reliable connections). Setting it lower leads better recovery (fine-grained chunks)
                $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);
    
                /**
                 * Video has successfully been upload, now lets perform some cleanup functions for this video
                 */
                if ($status->status['uploadStatus'] == 'uploaded') {
                    $youtube_id = $status->id; //you got here youtube video id 
                } else {
                    // handle failere here
                }
    
                // If you want to make other calls after the file upload, set setDefer back to false
                $client->setDefer(true);
    
            } else{
                // @TODO Log error
                echo 'Problems creating the client';
            }
    
        } catch(Google_Service_Exception $e) {
            echo  "\r\n Caught Google service Exception ".$e->getCode(). " message is ".$e->getMessage();
            echo "\r\n Stack trace is ".$e->getTraceAsString(); 
        } catch (Exception $e) {
            echo  "\r\n Caught Google service Exception ".$e->getCode(). " message is ".$e->getMessage();
            echo  "\r\n Stack trace is ".$e->getTraceAsString(); 
        }