Etiqueta: Google Drive

  • Cómo acceder a Google Drive usando PHP

    Cómo acceder a Google Drive usando PHP

    El escenario que voy a analizar es este: Una aplicación desarrollada en PHP requiere acceder a archivos que sus usuarios tienen almacenados en sus propios documentos en Google Drive.

    Configuración de la API De Google

    1. Crear un proyecto en Google (yendo a https://console.developers.google.com/apis/credentials):

    1. Habilitar el acceso a la API via OAuth (https://console.developers.google.com/apis/api/drive/overview?project=MI_PROYECTO):
    1. Crear las credenciales de acceso vía OAuth:

    Seleccionar OAuth:

    1. Descargar las credenciales a un lugar seguro:
    1. Autorizar la URI de redireccionamiento

    Uso de la API de Google desde PHP

    Con esto hecho ya tenés lo básico para empezar a programar.

    Si bien podés hacer todo en un solo archivo, no es muy recomendable, es mejor tener un archivo para cada paso del trabajo.

    Ante todo, vas a necesitar la librería google/apiclient (Te recomiendo incorporarla con composer), acá podés ver un ejemplo de composer.json:

    {
     "name": "leeway/google-drive",
     "require": {
     "google/apiclient": "^2.1"
     },
     "authors": [
     {
     "name": "Mauro Chojrin",
     "email": "mauro.chojrin@leewayweb.com"
     }
     ]
    }

    No olvides después correr el comando

    composer install

    Este codigo (config.php) va a ser común a todos los archivos .php que vendrán luego:

    <?php
    require_once 'vendor/autoload.php';
    session_start();
    $redirect_uri = 'http://' . $_SERVER['HTTP_HOST'] . '/paso2.php';
    $client = new Google_Client();
    $client->setAuthConfig('<PATH_AL_ARCHIVO_JSON_DE_CREDENCIALES>');
    $client->setRedirectUri($redirect_uri);
    $client->addScope("https://www.googleapis.com/auth/drive");

    El primer paso:

    Ofrecer al usuario un formulario para conectarse a su Drive (paso1.php):

    <?php require_once 'config.php' ?>
    <div class="request">
     <a class='login' href='<?php echo $client->createAuthUrl() ?>'>Conectame!</a>
    </div>

    Contar con una URL a la que Google informe que la autenticación fue exitosa (paso2.php):

    <?php 
    require_once 'config.php';
    
    if (isset($_GET['code'])) {
     $token = $client->fetchAccessTokenWithAuthCode($_GET['code']);
     $client->setAccessToken($token);
    
     $_SESSION['upload_token'] = $token;
    
     header('Location: paso3.php');
    }

    Muy importante: este archivo (paso2.php) debe ser accesible para el cliente (Para eso es importante que su URL completa esté ingresada en la configuración de URI de redireccionamiento, sin eso nada de esto funcionará.

    Paso 3 (Completar la autenticación):

    <?php
    
    require_once 'config.php';
    
    if (!empty($_SESSION['upload_token'])) {
     $client->setAccessToken($_SESSION['upload_token']);
     if ($client->isAccessTokenExpired()) {
      unset($_SESSION['upload_token']);
      echo 'La sesion expiro. <a href="paso1.php">Volver a comenzar</a>';
      die;
     }
    }
    echo 'Autenticacion completa <a href="paso4.php">Descargar archivo</a>';

    Paso 4:

    Hacer lo que uno quiera en el drive autorizado :).

    Ejemplo: descargar un archivo desde Google Drive usando PHP

    <?php
    require_once 'config.php';
    
    echo '<p>Descargando el archivo "Mi archivo"</p>';
    $service = new Google_Service_Drive($client);
    $files = $service->files->listFiles([
     'q' => "name='Mi archivo'",
     'fields' => 'files(id,size)'
     ]);
    
    if ( count($files) < 1 ) {
     echo 'No se encontro el archivo :(';
     die;
    }
    $fileId = $files[0]->id;
    $fileSize = intval($files[0]->size);
    
    $http = $client->authorize();
    
    $fp = fopen('Mi archivo', 'w');
    
    $chunkSizeBytes = 1 * 1024 * 1024;
    $chunkStart = 0;
    
    while ($chunkStart < $fileSize) {
     $chunkEnd = $chunkStart + $chunkSizeBytes;
    
     $response = $http->request(
      'GET',
      sprintf('/drive/v3/files/%s', $fileId),
      [
       'query' => ['alt' => 'media'],
       'headers' => [
           'Range' => sprintf('bytes=%s-%s', $chunkStart, $chunkEnd)
       ]
      ]
      );
      $chunkStart = $chunkEnd + 1;
      fwrite($fp, $response->getBody()->getContents());
     }
     fclose($fp);
    echo '<p>Listo! Archivo disponible en: "'.realpath('Mi archivo').'"</p>';

    Y listo, tenemos el archivo buscado descargado a nuestro disco.

    Para probar esta aplicación (suponiendo que fuiste guardando cada porción de código en su propio archivo), iniciá el servidor de php:

    php -S localhost:8080

    y abrí en tu navegador:

    http://localhost:8080/paso1.php

    Claramente, no se trata de magia, lo que hay detrás de esto es un WebService, al que se está accediendo usando la clase Google_Service_Drive. Podes ver más información entrando a https://github.com/google/google-api-php-client.

    Y ahora que sabés cómo manipular archivos que están en el drive… ¡cuidado con lo que hacés!