php - 如何使用PHP中的YouTube API在特定 channel 上载视频?

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

我想为用户提供无需身份验证即可在我的 channel 上上传视频的功能(如果需要)。可能吗 ?

请帮我 。

谢谢
OM

最佳答案

是的,有可能

  • 您将需要适用于PHP的Google API客户端库。
  • 您还需要在以下位置创建一个项目
    https://console.developers.google.com/并获取凭据(即
    客户 secret 和客户ID)。
  • 最后,您需要为特定 channel 生成访问 token 。
    请看这个链接
    (https://youtube-eng.googleblog.com/2013/06/google-page-identities-and-youtube-api_24.html)
    生成访问 token 。
  • 准备好所有这些东西之后,就可以使用现成的
    Google API客户端库中提供的示例代码供PHP上传
    YouTube上的视频。

  • 注意:这不是详细过程,无法详细说明堆栈溢出的所有过程。但是,一旦您接近解决方案,就可以重新发布或发表评论以寻求进一步的帮助。

    这是在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(); 
        }
    

    关于php - 如何使用PHP中的YouTube API在特定 channel 上载视频?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39844853/

    相关文章:

    HTML嵌入视频被截断

    Android Youtube Player API Activity 完成并创建

    php - Laravel 5.4 中的 Sass

    php - 将多个文件导入MySQL表

    php - php while循环中的对齐问题

    jwt - 使用 OpenId (Cognito) 进行身份验证后,如何在 Blazor WebAssembly 中获取 id_token?

    api - 使用 JWE 或 JWS 的优缺点是什么

    php - 关于 DELETE 方法的 REST API 设计

    javascript - 如何更改嵌入式 Youtube 视频的速度

    api - 生成 API key 的最佳方法?