Youtube API v.3 загрузить видео через php скрипт

Тема в разделе "PHP", создана пользователем dandandan, 19 дек 2017.

Статус темы:
Закрыта.
Модераторы: latteo
  1. dandandan

    dandandan

    Регистр.:
    7 авг 2008
    Сообщения:
    1.026
    Симпатии:
    277
    Третий день ищу ответа по гуглу, но так и не могу найти как сделать загрузку видео на ютуб без oauth авторизации. Т.е. есть веб сервер. Нужно, чтобы с него можно было загрузить видео в любой момент. Через авторизацию доступ дается на 3600 секунд. Дальше нужно обновлять доступ. Нашел в интернете следующее.
    1. Нужно использовать oauthplayground . Но не понятно как его использовать через стандартную библиотеку гугла https://github.com/google/google-api-php-client

    2. Написал (точнее нашел) рабочий код к этой библиотеке. Видео загружается нормально. Но опять вопрос с обновлением токена остался открытым.

    3. Блоки кода с текстом "// added manualy" добавил только сейчас. До этого не использовал еще.


    PHP:
    <?php

    // Call set_include_path() as needed to point to your client library.
    require_once '../yaVoice.ru/vendor/autoload.php';
    session_start();

    /*
    * https://www.domsammut.com/code/php-server-side-youtube-v3-oauth-api-video-upload-guide/comment-page-8
    * https://stackoverflow.com/questions/19449061/upload-videos-to-my-youtube-channel-without-user-authentication-using-youtubeapi
    *
    * You can acquire an OAuth 2.0 client ID and client secret from the
    * {{ Google Cloud Console }} <{{ https://cloud.google.com/console }}>
    * 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 'XXXXXXXXXXXXXXapps.googleusercontent.com';
    $OAUTH2_CLIENT_SECRET 'XXXXXXXXXXXXXXXXXXXXXX';
    $REDIRECT 'http://localhost/oauth2callback.php';
    $APPNAME "youtubeVideo";

    $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);

    // added manualy
    $client->setAccessType('offline');
    $client->setApprovalPrompt('force'); // this line is important when you revoke permission from your app, it will prompt google approval dialogue box forcefully to user to grant offline access




    // Define an object that will be used to make all API requests.
    $youtube = new Google_Service_YouTube($client);
    // Check if an auth token exists for the required scopes
    $tokenSessionKey 'token-' $client->prepareScopes();
    if (isset(
    $_GET['code'])) {
        if (
    strval($_SESSION['state']) !== strval($_GET['state'])) {
            die(
    'The session state did not match.');
        }
        
    $client->authenticate($_GET['code']);
        
    $_SESSION[$tokenSessionKey] = $client->getAccessToken();
        
    header('Location: ' $redirect);
    }
    if (isset(
    $_SESSION[$tokenSessionKey])) {
        
    $client->setAccessToken($_SESSION[$tokenSessionKey]);
    }


    // added manualy
    if ($client->isAccessTokenExpired()) {
        
    $currentTokenData json_decode($_SESSION['token']);
        if (isset(
    $currentTokenData->refresh_token)) {
            
    $client->refreshToken($currentTokenData->refresh_token);
        }
    }


    // Check to ensure that the access token was successfully acquired.
    if ($client->getAccessToken()) {
        
    $htmlBody '';
        try{
            
    // REPLACE this value with the path to the file you are uploading.
            
    $videoPath "../yaVoice.ru/video_ready/ready.avi";
            
    // 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 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[$tokenSessionKey] = $client->getAccessToken();
    } elseif (
    $OAUTH2_CLIENT_ID == 'REPLACE_ME') {
        
    $htmlBody = <<<END
      <h3>Client Credentials Required</h3>
      <p>
        You need to set <code>\$OAUTH2_CLIENT_ID</code> and
        <code>\$OAUTH2_CLIENT_ID</code> before proceeding.
      <p>
    END;
    } 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>

    Что, где подправить, чтобы этот же код можно было выполнить еще раз, но без авторизации через веб страничку гугла после того, как токен умрет?
     
  2. mSnus

    mSnus Постоялец

    Регистр.:
    4 дек 2015
    Сообщения:
    76
    Симпатии:
    28
  3. DestroyMan

    DestroyMan Создатель

    Регистр.:
    31 янв 2014
    Сообщения:
    23
    Симпатии:
    0
    На странице API есть готовый php пример, зачем выдумывать?
     
  4. yuriyua

    yuriyua Писатель

    Регистр.:
    5 сен 2018
    Сообщения:
    2
    Симпатии:
    1
Статус темы:
Закрыта.