如何更新访问令牌并在YouTube上上传视频?

时间:2019-01-21 20:48:30

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

如何更新访问令牌(借助刷新令牌帮助)并在YouTube上上传视频?

authenticate.php

<?php

$client = new Google_Client();
$client->setClientId($OAUTH2_CLIENT_ID);
$client->setClientSecret($OAUTH2_CLIENT_SECRET);
$client->setScopes('https://www.googleapis.com/auth/youtube');
$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') ? 'https' : 'http';
$redirect = filter_var($protocol . '://' . $_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();
    exit;
}

if (isset($_SESSION['token'])) {
    $client->setAccessToken($_SESSION['token']);
}

config.php

<?php
require_once 'google-api-php-client-2.2.0/vendor/autoload.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 = '';
$OAUTH2_CLIENT_SECRET = '';

require_once 'inc/authenticate.php';

upload.php

<?php

if (!empty($_POST['video_path'])) {

    try{

        // REPLACE this value with the path to the file you are uploading.
        $videoPath = $_POST['video_path'];

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

        if (!empty($_POST['video_title'])) {
            $snippet->setTitle($_POST['video_title']);
        }

        if (!empty($_POST['video_description'])) {
            $snippet->setDescription($_POST['video_description']);
        }

        if (!empty($_POST['video_tags'])) {
            $video_tags = array_filter(array_map('trim', explode(',', $_POST['video_tags'])));
            $snippet->setTags($video_tags);
        }

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

        if (!empty($_POST['video_status']) && in_array($_POST['video_status'], array('public', 'private', 'unlisted'))) {
            $status->privacyStatus = $_POST['video_status'];
        }

        // 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));
        $headers = array_change_key_case(get_headers($videoPath, true));
        $media->setFileSize(intval($headers['content-length']));

        // Read the media file and upload it chunk by chunk.
        $status = false;
        $handle = fopen($videoPath, 'rb');
        while (!$status && !feof($handle)) {
            $chunk = stream_get_contents($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);

        $video_url = 'https://www.youtube.com/watch?v=' . $status['id'];
        ?>

        <div class="alert alert-success">
            <h3 class="alert-heading">Video Uploaded</h3>
            <p><a href="<?php echo $video_url; ?>" class="alert-link"><?php echo $video_url; ?></a></p>
        </div>

        <?php
    } catch (Google_Service_Exception $e) {
        ?>

        <div class="alert alert-danger">
            <p>A service error occurred: <code><?php echo htmlspecialchars($e->getMessage()); ?></code></p>
        </div>

        <?php
    } catch (Google_Exception $e) {
        ?>

        <div class="alert alert-danger">
            <p>An client error occurred: <code><?php echo htmlspecialchars($e->getMessage()); ?></code></p>
        </div>

        <?php
    }

    $_SESSION['token'] = $client->getAccessToken();
}

youtube-uploader

如何添加refresh_token文件,以防止重置授权。

{"access_token":"ya29.GluQBs6GFi_0sG1VgmLUZ0....","expires_in":3600,"refresh_token":"1\/cLxr6ox0...","scope":"https:\/\/www.googleapis.com\/auth\/userinfo.email https:\/\/www.googleapis.com\/auth\/userinfo.profile","token_type":"Bearer","id_token":"eyJhbGc..","created":1547330141}

我找到了正确的信息,但是无法在上面的代码中实现。

PHP server-side YouTube V3 OAuth API video upload guide

Russian info and code "[Examples] Authorization (getting the access and refresh token) OAuth 2.0 with Google and work with Google API in PHP"

我可以获得刷新令牌并将所有内容保存到文件或会话中,但是如何将令牌的验证和更新集成到上面的代码中?

请帮助我!

0 个答案:

没有答案