За последние 24 часа нас посетили 21983 программиста и 996 роботов. Сейчас ищут 752 программиста ...

Google API Drive доступ из cron без авторизации

Тема в разделе "PHP для профи", создана пользователем StudentBot, 8 апр 2019.

Метки:
  1. StudentBot

    StudentBot Новичок

    С нами с:
    8 апр 2019
    Сообщения:
    2
    Симпатии:
    0
    Здравствуйте! Удалось реализовать доступ к содержимому диска через веб-морду OAuth2, однако каждый раз происходит запрос авторизации у пользователя, чего хотелось бы избежать. Есть 1 учётная запись, которая владеет всем необходимым на гугл диске, нужно читать содержимое конкретной директории при заходе пользователя по веб. Может у кого уже реализован такой механизм? Интересует всё, включая открытие доступа со стороны учётных записей google. Заранее большое спасибо за помощь!
     
  2. twim32

    twim32 Активный пользователь

    С нами с:
    29 мар 2017
    Сообщения:
    275
    Симпатии:
    58
    Вопрос актуален? Если да, то вышлю подробную инфу
     
  3. StudentBot

    StudentBot Новичок

    С нами с:
    8 апр 2019
    Сообщения:
    2
    Симпатии:
    0
    Да!! Заранее большое спасибо!
     
  4. twim32

    twim32 Активный пользователь

    С нами с:
    29 мар 2017
    Сообщения:
    275
    Симпатии:
    58
    Давно это я делал, поэтому могу вспомнить не всё.
    1. Регистрируем СЕРВИСНЫЙ аккаунт https://console.developers.google.com/iam-admin/serviceaccounts.
    2. Скачиваем ключ в формате json и размещаем его в любой папке на сервере. (про права доступа к ключу не стоит забывать)
    3. Предоставляем права доступа приложению к различным сервисам гугла (исходя из потребностей: excel, word)
    4. Если делать через пыху, то качаем библиотеку Google Api : https://github.com/googleapis/google-api-php-client/releases и заливаем её на хост.
    Отступление: можно композером, я лично делал руками.
    5. Авторизация и получения экземпляра сервиса :
    Писал чисто для себя, поэтому если что, не помидорами не кидайтесь и правьте под свои нужды.
    Код (Text):
    1.  
    2. // подключаем библиотеку
    3. require_once '../../Google_API/vendor/autoload.php';
    4.  
    5. use \Google_Client;
    6. use \Google_Service_Drive;
    7. use \Google_Service_Sheets;
    8.  
    9. class GoogleServiceProvider
    10. {
    11.     private const
    12.         SECRET_PATH = 'путь к фаилу.json';
    13.  
    14.     static public function drive() : Google_Service_Drive
    15.     {
    16.         $credentials_file = self::getSecretPath();
    17.             $client = new Google_Client();
    18.             $client->setAuthConfig($credentials_file);
    19.             $client->addScope(Google_Service_Drive::DRIVE);
    20.             $service = new Google_Service_Drive($client);
    21.             return $service;
    22.     }
    23.    
    24.     static public function sheets() : Google_Service_Sheets
    25.     {
    26.         $credentials_file = self::getSecretPath();
    27.             $client = new Google_Client();
    28.             $client->setAuthConfig($credentials_file);
    29.             $client->addScope(Google_Service_Sheets::SPREADSHEETS_READONLY);
    30.             $service = new Google_Service_Sheets($client);
    31.             return $service;
    32.     }
    33.  
    34.  
    35.     static private function getSecretPath()
    36.     {
    37.         $path = self::SECRET_PATH;
    38.         if(file_exists($path))
    39.         {
    40.             return $path;
    41.         }
    42.         die('Secret file doesnt exists');
    43.     }
    44. }
    6. Вытягиваем данные из таблицы:
    Код (Text):
    1.  
    2.         $spreadsheetId = 'XXXXXXXXX'; // ID гугл документа, можно взять из браузерной строки
    3.         $service = GoogleServiceProvider::drive(); // подключаемся
    4.  
    5.         // отправляем запрос и получаем ответ
    6.         $response = $service->files->export($spreadsheetId, 'text/csv', [
    7.             'alt' => 'media'
    8.         ]);
    9.        
    10.         // берём данные из ответа
    11.         $content = $response->getBody()->getContents();
    12.  
    13.          var_dump($content);
    7. Радуемся результату ;)