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 шага:
- Пользователь только зашел на страницу, токена доступа нет или он просрочен. Выдаем пользователю ссылку (приглашение) на авторизацию в google.
- Пользователь на сервере google авторизовался и дал разрешение на доступы, он отправляется назад с временным кодом. Возвращается по адресу redirect_uri .
- Меняем временный код на токен доступа.
- Токен получен сохраняем его, далее можно выполнять работу через 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 выдаст нам вот такую структуру данных:
Эти 4 метода для работы с этим массивом Токена. Если вы планируете хранить токены более безопасно, например в БД, вам нужно создать новый класс и перекрыть эти 4 метода.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 )
- 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>';
}
Остальные примеры смотрите в архиве.