doubi6215 2016-10-04 05:37
浏览 36

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

I want to make functionality for users to upload video on my channel without authentication (if needed). IS it possible ?

Please help me .

Thanks OM

  • 写回答

1条回答 默认 最新

  • douchensou6969 2016-10-04 06:12
    关注

    Yes Omprakash,it is possible

    1. You will need Google APIs Client Library for PHP.
    2. You will also need to create a project on https://console.developers.google.com/ and get credentials(i.e client secret & client id).
    3. Finally,you will need to generate access token for specific channel. Please take a look at this link (https://youtube-eng.googleblog.com/2013/06/google-page-identities-and-youtube-api_24.html) to generate access token.
    4. Once you have all these things ready with you,you can use ready made example code available in Google APIs Client Library for PHP to upload video on YouTube.

    Note: This is not in detail process.It is not possible to explain all of the process in detail on stack-overflow. But, once you get close to solution,you can re-post or put comment for further assistance.

    This is example code to upload video on YouTube. Hope, it will help you

    /*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  "
     Caught Google service Exception ".$e->getCode(). " message is ".$e->getMessage();
            echo "
     Stack trace is ".$e->getTraceAsString(); 
        } catch (Exception $e) {
            echo  "
     Caught Google service Exception ".$e->getCode(). " message is ".$e->getMessage();
            echo  "
     Stack trace is ".$e->getTraceAsString(); 
        }
    
    评论

报告相同问题?

悬赏问题

  • ¥15 基于卷积神经网络的声纹识别
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 stm32开发clion时遇到的编译问题