PHP

Php класс для Google Photo API OAuth2, настройка работы под локальный веб-сервер OpenServer

Простой класс для OAuth2 авторизации и его продолжение - класс для подключения к Google Photo API. Ничего лишнего 600 строк кода 29килобайт.

Регистрация клиента в Google Cloud

Для начала работы с google api необходимо зарегистрироваться и создать проект в техническом сервисе Google Cloud.  Далее в рамках созданного проекта создаем OAuth клиента вот здесь Create OAuth client ID   вот так примерно это выглядит:

Важный момент!  Мы собираемся запускать\тестировать на локальном сервере OpenServer поэтому выбираем Desktop App - прикинемся обычным компьютерным приложением. 

 В рамках одного проекта можно создавать много клиентов. Так для тестирования можно сделать Desktop App, настроить,  проверить его работу, а уже после перенести на настоящий сервер. Для реального сервера необходимо будет создать нового клиента Web application и прописать данные клиента в php скриптах.   

Вот так, примерно, выглядит моя Cloud панель - имя проекта buArc смотрите вверху.  В проекте создано три  OAuth2 клиента .

 

Подготовка  сервера OpenServer, быстрый старт

Далее переходим к локальному OpenServer буду все показывать на примере домена buOAuth2Curl. В папке сервера создаем новый домен домен    buOAuth2Curl C:\OpenServer\domains\buOAuth2Curl\    перезагружаем сервер.   

Качаем архив, файлы из архива копируем в новый домен, а файл redirect.php копируем в домен localhost. Открываем index.php   редактируем настройки прописываем тут свой ID клиента client_id и секретный ключ  клиента client_secret эти данные берем в google cloud. 

Обратите внимание на redirect_uri   это адрес перенаправления клиента после подтверждения регистрации. Для локального сервера возможен вариант только localhost  именно поэтому в папку localhost мы положили redirect.php это есть наш  промежуточный редирект, который перенаправит нас на конечный адрес  http://buOAuth2Curl/index.php    

scope - это список запрашиваемых разрешений, email и profile это стандартные. Разрешает получить почтовый ящик и  узнать имя клиента, его ID. А вот последним https://www.googleapis.com/auth/photoslibrary идет запрос на доступ к google photo api, это разрешение понадобится нам для просмотра и скачивания фото через api.

$arrGoogleApiID = [
    'client_id' =>  '1111111111111-xxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com',
    'client_secret' => 'XxxXXXXXXXXXxxxxXXXXxxXXXXXXXXX',
    'redirect_uri' => 'http://localhost/redirect.php?target=http://buOAuth2Curl/index.php',
    'scope' => 'email profile https://www.googleapis.com/auth/photoslibrary',

];

В примере есть файлы download.php  и search.php их надо настроить подобным образом,  внимательнее с редиректом :)

Пробуем заходить на index.php   и пройти авторизацию.  На этом шаге вам понадобится некоторое упорство - Google будет вас пугать типа не проверенный проект, опасности и все такое. Не сдавайтесь, и вам дадут разрешение :)

   

В арихиве идут файлы с примрами:

  • index.php - выводит все фотографии и видео
  • search.php - пример  с применением поиска  по типу файла выводит все фотографии без видео
  • download.php - пример выкачивает все файлы из вашего Google Photo к вам на диск  D:\tmp - работает долго ! если надо остановить жмем отмена в браузере (крестик) 

 

Процесс авторизации в google можно разбить на 4 шага: 

  1. Пользователь только зашел на страницу, токена доступа нет или он просрочен. Выдаем пользователю ссылку (приглашение) на  авторизацию в google.
  2. Пользователь на сервере google авторизовался и дал разрешение на доступы, он отправляется назад с временным кодом.  Возвращается по адресу  redirect_uri .
  3.   Меняем временный код на токен доступа.
  4.  Токен получен сохраняем его,  далее можно выполнять работу через API 

В файле buOAuth2Curl.class.php   эти этапы отмечены в комментариях, при желании можно разобраться.  Идут пункты не по порядку!

Класс buOAuth2Curl:

Начало работы 

<?php
require_once 'buOAuth2Curl.class.php';

// INSTALL CORRECTLY redirect_uri ON THIS PAGE !!!
$arrGoogleApiID = [
    'client_id' =>     'XXXXXXXXXXXXXXXXXX',
    'client_secret' => 'XXXXXXXXXXXXXXXXX',
    'redirect_uri' => 'http://localhost/redirect.php?target=http://buOAuth2Curl/index.php',
    'scope' => 'email profile',

];

session_start();

$gApi = new buOAuth2Curl\buOAuth2Curl( $arrGoogleApiID );

Прописываем свои данные: клиент ID, клиент секрет, смотрим куда должен пойти редирект.   

Важно обязательно стартуем сессию session_start();  т.к. класс сохраняет токены в сессии.!!

 Получаем имя пользователя и его email

if( $gApi->checkAuth() ){ // авторизован?

    echo "Hello, authorization successful!";
    $userInfo = $gApi->getUserInfo();
    echo '<pre>'; print_r($userInfo); echo '</pre>';

} else { // не авторизован выводим ссылку на сервер авторизации

    $urlAuth = $gApi->getLinkAuth();
    echo '<pre>'; print_r($urlAuth); echo '</pre>';
}

Методы класса buOAuth2Curl 

  •  checkAuth()  - основной метод, с него начинаем работу с классом. Проверяет есть авторизация или нет, если есть выполняем свои запросы к API.  В этом же методе происходит проверка токена по времени действия и если время истекает, то токен будет автоматически обновлен.  Если вы используете какой-то длительный процесс (ну например выкачиваем все файлы из Google Photo)  то периодически,  где-то в цикле надо вызывать проверку.
    if( !$gApi->checkAuth() ) break;
  • getUrlAuth()  - выдает url на сервер авторизации .
  • getLinkAuth() -  выдает ссылку с текстом на авторизацию.
  • getArrToken()  setArrToken() unsetArrToken() getAccessToken()  методы для работы с массивом токена : получение массива,  сохранение ,   удаление,   получение только токена access_token.  При авторизации google выдаст нам вот такую структуру данных:
    Array
    (
        [access_token] => ya29.A0ARrdaM85krSn_BWotnJcyDiWJ1fPmi5vI90ZQ4dSqhP-BusfckT98LqSdtA5pM6hOZCpvMaCFZyLgQWc0Vl5KbHK1iSsTVMKHN91xLQmD5sXumzvZs8Dr7Y6E
        [expires_in] => 3599
        [scope] => https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/photoslibrary openid https://www.googleapis.com/auth/userinfo.email
        [token_type] => Bearer
        [id_token] => eyJhbGciOiJSUzI1NiIsImtpZCI6ImMxODkyZWI0OWQ3ZWY5YWRmOGIyZTE0YzA1Y2EwZDAzMjcxNGEyMzciLCJ0eXAiOiJKV1QifQ.eyJpc3MiOiJhY2NvdW50cy5nb29nbGUuY29tIiwiYXpwIjoiMTkzMTg3ODAzMzQ2LXZnbWx1dTNyaDN1amVsOGVzcW5jNDJkdmZzMmw1ZXRzLmFwcHMuZ29vZ2xldXNlcmNvbnRlbnQuY29tIiwiYXVkIjoiMTkzMTg3ODAzMzQ2LXZnbWx1dTNyaDN1amVsOGVzcW5jNDJkdxldXNlcmNvbnRlbnQuY29tIiwic3ViIjoiMTE1MTcwNzgxOTY1ODQ0NTkzMTU0IiwiZW1haWwiOiJ5LnN0ZXBhbm92QGdtYWlsLmNvbSIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJhdF9oYXNoIjoiSy1Fd1pBaW1kS1MtekdJLS1lci1zdyIsImlhdCI6MTYzODk0ODA3MSwiZXhwIjoxNjM4OTUxNjcxfQ.F_PjonvvloLZKzMyvmo-Q3RnodPA0o5yXCpMeTah0inEXbXK6Yae_kFE0ceqDfgSzCdlIbWS_X9z7HdJbNqgn2LbU58PfuulDdyD_YBJ1OI3TCPXHNFhpC9AAVQ16dmAChI5ELwaGAaO38vJu8Virdz6mhz95o5wA-zkb4dj_KPLT71UvwK6kGz8EO9_nFR6mMYLH1bHXaLg1KEKaYHwAQxHSCJi-i__sr130dGkbP14ua7m5yCQZ2H-8NqAcxS2R_hzGOQQpNQzfjGnDlR3bOKFF88OF0sK89bEkmPiBsJsAs6qQGapRLPoTc7QL2HMQwJ3eCr1ELVoTm5S522NEA
        [timeEnd] => 1638951671
    )
    Эти 4 метода  для работы с этим массивом Токена.  Если вы планируете хранить токены более безопасно, например в БД, вам нужно создать новый класс и перекрыть эти 4 метода.
  •  getUserInfo()  получает информацию о пользователе,  это как бонус метод будет работать только под GOOGLE .

Класс buGooglePhoto

Класс buGooglePhoto  наследует предыдущий класс buOAuth2Curl. Расширяет его методами для работы непосредственно с Google Photo API. 

Пример получим первые 100 фото\видео   из вашего акаунта на облаке:

<?php
require_once 'buOAuth2Curl.class.php';

// INSTALL CORRECTLY redirect_uri ON THIS PAGE !!!
$arrGoogleApiID = [
    'client_id' =>   'xxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com',
    'client_secret' => 'xxxxxxxxxxxxxxxxxxxx',
    'redirect_uri' => 'http://localhost/redirect.php?target=http://buOAuth2Curl/index.php',
    'scope' => 'email profile https://www.googleapis.com/auth/photoslibrary',

];

session_start();

$gApi = new buOAuth2Curl\buGooglePhoto( $arrGoogleApiID );
if( $gApi->checkAuth() ){// authorized let's get to work
    $res =   $gApi->getItems();
    echo '<pre>'; print_r($res); echo '</pre>';
    $gApi->printItems( $res );

} else { // NO authorization displaying a link to the server

    $urlAuth = $gApi->getLinkAuth();
    echo '<pre>'; print_r($urlAuth); echo '</pre>';
}

Начало работы как в предыдущих примерах настраиваем массив $arrGoogleApiID - своими данными : ID клиента и его секретный ключ, проверяем куда ридирект настроен. В scope  (список разрешений) должно быть добавлен запрос на Photo API https://www.googleapis.com/auth/photoslibrary    Дальше проверка авторизации и получение фотографий $res =   $gApi->getItems();  ,  а потом вывод фото на печать $gApi->printItems( $res ); 

Методы класса buGooglePhoto

  • execGet($url, $getVars = null)  выполняет GET запрос к Photo API. Все GET запросы  к API должны проходить через этот метод основной GET шлюз. Если задан массив переменных $getVars, то $url должен быть без переменных (вся что до знака ?)    
  • execPost($url, $postVars ) выполняет POST запрос к API.  Все POST запросы должны также проходить через этот метод.
  • getAlboms()  получаем первые 50 альбомов пользователя, вряд ли их больше 
  • getItems() Получаем items (фоты, видосы  медиа объекты). Первый вызов вернет первые 100 объектов, второй вызов вторую сотню  и так далее пока не дойдет до конца.  В конце вернет false. Такая вот примитивная пагинация. Количество полученных объектов  на странице может быть не равно 100,  отдает всегда по разному, видимо это связано с удалением файлов в корзину (не разобрал).
  • resetPages() сбрасываем пагинацию страниц.  Если поле этого метода вызвать getItems() - то он опять вернет первую страницу  (первые 100 объектов). 
  • searchItems( $query ) Этот метод запускает поисковый запрос к API. Вернет первые 100 объектов, при повторном вызове метода с таким же $query вернет следующую страницу (сотню) по этому запросу ну и так далее пока будут данные.
    Метод можно использовать в цикле получая всю выборку по заданному фильтру.
    Если изменить $query то пагинация будет автоматически сброшена и вернется на первую страницу. Также можно сбросить пагинацию методом resetPages(). Подробности формирования $query смотрите по ссылке json apply-filters 
  • getItem( $id )  Получает одну фоту или видеу, $id - идентификатор в google API  
  • downloadItem($item, $destination_folder = 'D:\TMP') скачивает файл  в папку  $destination_folder по умолчанию стоит D:\TMP. $item - это массив фото\видео,  двумерный массив $items возвращает метод getItems() или searchItems( $query ) .
  • printItems($items) простенькая распечатка объектов.  

Примеры работы с Google Photo API

Получаем первые 100 фотографий\видео и скачиваем их на диск в директорию d:\tmp :

// подключение файла и настройки как и раньше в предыдущих примерах
set_time_limit(0);
session_start();
$gApi = new buOAuth2Curl\buGooglePhoto( $arrGoogleApiID );
if( $gApi->checkAuth() ){// проверка авторизации

    $res =   $gApi->getItems( );  // получаем 100 итемов
    foreach ($res as $key => $item) { // запускаем цикл
        $path = $gApi->downloadItem( $item, 'D:\TMP'  ); // скачиваем файл
        if( file_exists($path) ){  // проверяем наличие файла и выводим сообщения
            echo "Download OK!  = $path<br>";
        }
        else{
            echo "<span style='color: #CC0000'>Download Error!</span>  = $path<br>";
            echo '<pre>'; print_r($gApi->msg); echo '</pre>';
        }
        flush();// принудительно все что напечатали  сообщения отправляем в браузер 

        if( !$gApi->checkAuth() ) break;  // проверяем авторизация не просрочена ли ?
    }

} else { // не авторизован

    $urlAuth = $gApi->getLinkAuth();
    echo $urlAuth;
}

Применение фильтра - отфильтруем только фотографии  и выведем их на печать. Если у вас много фотографий может долго печатать, аккуратнее. 

session_start();
$gApi = new buOAuth2Curl\buGooglePhoto( $arrGoogleApiID );
if( $gApi->checkAuth() ){// authorized let's get to work
    $json = '
       {
            "filters": {
                "mediaTypeFilter": {
                    "mediaTypes": [
                        "PHOTO"
                    ]
                }
            },
            "pageSize": "100"
        }';
 
    while( $res =   $gApi->searchItems( $json ) ){
        $gApi->printItems($res);
        echo '<pre>'; print_r($gApi); echo '</pre>';
    }

} else { // NO authorization displaying a link to the server

    $urlAuth = $gApi->getLinkAuth();
    echo '<pre>'; print_r($urlAuth); echo '</pre>';
}

Остальные примеры смотрите в архиве.

Скачать класс buOAuth2Curl

buOAuth2Curl2021_12_08_18_27_39.zip