Простая работа с Google Drive API
Сегодня рассмотрим простой пример работы с Google Drive API. Почему именно данное API, потому что оно популярно. Как-то не так давно, мне пришлось разрабатывать кое-что подобное для нескольких студентов. Там использовались не только сервисы от Google, но и от других не менее известных компаний. Для упрощения статьи я решил опустить некоторые моменты по настройке, о которых можно прочитать на других сайтах. Но хватит вступления, приступим к рассмотрению моего примера.
Подготовка к работе
Первым делом Вам необходимо иметь учетную запись в Google. Затем надо будет подключить нужное нам API и получить секретный ключ и идентификатор клиента. Подключить Google Drive API можно в Google API Console. Не забывайте, что после включения API нужно будет создать новый проект. Здесь я лишь приведу примеры изображений, как настроено у меня.
В своей работе я буду использовать использовать библиотеку Google API Client Library for PHP. Если перейти по данной ссылке, то Вы найдете описание как установить зависимости через composer.
Для удобства всю логику приложения оставил в файле index.php.
Листинг файла index.php
<?php
/**
* @Doc https://developers.google.com/drive/api/v3/about-sdk
*/
// include your composer dependencies
require_once 'vendor/autoload.php';
include 'BuildTree.php';session_start();
ob_start();$redirect_uri = "http://{$_SERVER ['HTTP_HOST']}/";
$client = new Google_Client();
$client->setClientId('797383941645-12og1l10jlhbmkpp4e71rpe4akqcu562.apps.googleusercontent.com');
$client->setClientSecret('qPzJuo0wRApxXnCO9PryjKgE');
$client->setRedirectUri($redirect_uri);
$client->addScope(Google_Service_Drive:RIVE);// Запрос на подтверждение работы с Google-диском
if (isset($_REQUEST['code'])) {
$token = $client->authenticate($_REQUEST['code']);
$_SESSION['accessToken'] = $token;
header('Location:' . filter_var($redirect_uri, FILTER_SANITIZE_URL));
} elseif (!isset($_SESSION['accessToken'])) {
header('Location:' . filter_var($client->createAuthUrl(), FILTER_SANITIZE_URL));
}// Присваиваем защитный токен для работы с Google-диском
$client->setAccessToken($_SESSION['accessToken']);$driveService = new Google_Service_Drive($client);
$listFiles = $driveService->files->listFiles([
'fields' => 'nextPageToken, files(id, name, parents, fileExtension, mimeType, size, iconLink, thumbnailLink, webContentLink, webViewLink, createdTime)'
]);// Пересобираем массив для добавления ключа parentId
$files = [];foreach ($listFiles['modelData']['files'] as $k => $item) {
$files[$k] = $item;
$files[$k]['parentId'] = $item['parents'][0];
unset($files[$k]['parents']);
}// Строим дерево элементов
$buildTree = new buildTree();
$tree = $buildTree->makeTree($files, '0AHCqnAQsA3IDUk9PVA');echo '<style type="text/css">
ul > li {
list-style: none;
}
ul > li > img {
margin-right: 3px;
}.icon-new {
display: inline-block;
background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDIxIDc5LjE1NTc3MiwgMjAxNC8wMS8xMy0xOTo0NDowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkI1RTc1MjFBNjI1RTExRThCMEIwQzZBMUQyNjBFNTFEIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkI1RTc1MjFCNjI1RTExRThCMEIwQzZBMUQyNjBFNTFEIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QjVFNzUyMTg2MjVFMTFFOEIwQjBDNkExRDI2MEU1MUQiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QjVFNzUyMTk2MjVFMTFFOEIwQjBDNkExRDI2MEU1MUQiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7jjx+wAAABuklEQVR42pRSPYsUQRB9/TGO6y4KinuioGBgZGBgeNy/kLvEwOC4RC640NB/4I8QTEw88A+YCIrhqYFmBwfrutyyHzPd9WH13Gh4ck1N09NV9eq9qnaqiousOP/4dvr6QKsRFI5W15+8vLb19LyMr7u30vH7fHJIx++an2++74313OVlMK5u342DZbiyqO8M2iz/oTSdJdAEi1OwIq3re4+/PHtYjXwvrUg0rt452Hd1czuWW3YgURG3yg/2n0OkMwUzhPtf5xH9pxcHZwl2S5amRmfyw1noWRwTiJAzuLEyqKtm3cZk8GrmwYI009VMzW3RlEGMMES4jDhyEIfYEuI6EZpfOvms7byAUUFV27k/KGenlR9uuBv3SdBROj3CagrxhRV7GDGDK+eghZvXvJbFkf/9bTmfx2Vj7miiS5dMjDEp2CzcFwHbjai/BMmlraUCWWdbpdDTYDPGP1bd7q1UkMSIOWtBTR0wi1BS+tsf5hJtFXKWMhdPrFFCxKh2QxfIG7FgGgzeUIxh5o6kKfUIQOVtVHH8aOvDq8Oap2yOItEmK2bCYn5b6EYeA9qMm5s77qLP+48AAwD2V2eDUfQIogAAAABJRU5ErkJggg==");
width: 16px;
height: 16px;
}
.icon-upload{
display: inline-block;
background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDIxIDc5LjE1NTc3MiwgMjAxNC8wMS8xMy0xOTo0NDowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjBCNjg1MEQ0NjI1RjExRThBOTQ0RDIxMjczOUI5OTg0IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjBCNjg1MEQ1NjI1RjExRThBOTQ0RDIxMjczOUI5OTg0Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MEI2ODUwRDI2MjVGMTFFOEE5NDREMjEyNzM5Qjk5ODQiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MEI2ODUwRDM2MjVGMTFFOEE5NDREMjEyNzM5Qjk5ODQiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6pslxlAAABb0lEQVR42oxSPUsDQRCd3du7yGkhpEghKQTthFTaKdraWdmqP8LKv2BnYWejjeQfiIWkEhWDoI2KihBJkUjI5+3uzDprQC/higwHNzP73ny8XeGcg5StniwWilMqCtm32tQ/B5Xd5zRAwaj1tN5e3nxsnrLf6sq313gMME7wRiKUOf4HLuMwg2BJIAF/3URORABCg5KrW8zqwFum4ziKtBF9I8iBNtjq9BcO8yOEEHJ7W/NOSJ6EQWRUtXEOpAhkPCPW1oOlwgrneUJCKF/cKj2gh/qNgBARyC8giSJkJq/hJGterd3BkMC6tTsK0VkrpABD4Ehax6eAKHh+a73P5S1juQRItKCsdi/vgU9482uWChsfVGHcV81yOB2lBExIdXvJ/dW/4N+9ZmkHhuOxXV82xlV6OnhLx8X9udk4nzTl71yCM52jfhqQcTUG+X3xaoGjyW4avSYB+RaTEf5EpAk7HJ+V27rlCVlv40eAAQDtXcpSmStOgAAAAABJRU5ErkJggg==");
width: 16px;
height: 16px;
}
.icon-delete {
display: inline-block;
background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDIxIDc5LjE1NTc3MiwgMjAxNC8wMS8xMy0xOTo0NDowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkU5NTRGNDZCNjI1RTExRTg4RUMwQTVGQzQyRTBGQTUxIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkU5NTRGNDZDNjI1RTExRTg4RUMwQTVGQzQyRTBGQTUxIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6RTk1NEY0Njk2MjVFMTFFODhFQzBBNUZDNDJFMEZBNTEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6RTk1NEY0NkE2MjVFMTFFODhFQzBBNUZDNDJFMEZBNTEiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5pfvFyAAAB7UlEQVR42mL8//8/AwNDyZqc84/PPHh7/+vPLwyoQIBLUFVM3VDWpMmvE8hlBGqInhG2+8aW/7////vN8P/ff4b/CNWMTAyMzIyMLEDEYKZosyV/F6PbLB12lu8/f/z89evfn99///75D7ETApiYGJmYGVlZmVnZmFjZmL/+ZmL5z/jN0UyegTiw8sBZlo8f/l5784VIDe/f/2d59uDHs3dXidTw+yMnyNPLFq9WUlMkqPrerftRsaEsQNbnz1+FRYSQ5cp2qwDJLtc7yIIXz14BkiANr189FxYShkvU7zc2k04GMjrPWjTYn+ZiE4CIf3j/Bqrh65cfggL8cA1fmF64mfgDGVNOLpcWQwTgr19/oRqA7nnx4qWwqMj3Xx852fgnuD0CkkDxNqdLn76/+/bnkzCX7NvXbyQkxEAxA8QystIP7z/88vnL/ofTs9Zqff785QsY/f3OkrlO6+TTpUA2UIGSsiJUg7S05NVrN37++DF5VwM/g9Kv7/8/fPwARECGLr8vUBAoBVQgryALdZKtg/XePftBlnz48+Df/fqtYcFaxd9+f5p4PBXieqDU4wePVFLioBqA4OOHz/de3czXXwThfvv4k4GBHc4FSn3+9BXChmrQ1FY9ve/i77//sEYZE8N/HR1tCBsgwABAIuuiYfgrmwAAAABJRU5ErkJggg==");
width: 16px;
height: 16px;
}
</style>';
Добрый день! Развернул архив на хостинге и получил следующее ошибку:
Parse error: syntax error, unexpected ‘:’, expecting ‘;’ or ‘{‘ in /home/host1475025/***domain***/htdocs/www/google-drive-amo/BuildTree.php on line 12
Вместо ***domain*** соответственно свой домен в котором лежит папка google-drive-amo.
Заранее благодарен!
Добрый день! Необходимо проверить, какая версия PHP установлена на сервере. Здесь требуется минимум PHP 7.0.
А еще можно строку
public function makeTree(Array &$elements, $parentId = '') : array
заменить наpublic function makeTree(Array &$elements, $parentId = '')
в файле BuildTree.php.А так все должно работать. Проверялось неоднократно.
Спасибо, помогла замена строки в файле BuildTree.php.
Сейчас след. ошибку возвращает гугл:
400. That’s an error.
Error: redirect_uri_mismatch
The redirect URI in the request, http://***domain***/google-drive-amo/index.php, does not match the ones authorized for the OAuth client. To update the authorized redirect URIs, visit: https://console.developers.google.com/apis/credentials/oauthclient/************-9r04kt1hsj25dl3bktal1kvjqe350so5.apps.googleusercontent.com?project=********
Похоже я неверно заполнил след. вкладку. ( скрин https://yadi.sk/i/ZO_oSc0S3YoUAD )
В поле «Разрешенные URI перенаправления» необходимо написать путь к index.php файлу.
В примере все размещалось на localhost. У вас — это
http://***domain***/google-drive-amo/
.Здесь ***domain*** — ваше доменное имя. Если скрипт хотите разместить в корне, то просто указываете адрес сайта вместе с http.
Так, разрешение акк получил. Теперь выдает след. ошибку:
Fatal error: Uncaught InvalidArgumentException: Invalid token format in /home/host1475025/***domain***/htdocs/www/google-drive-amo/vendor/google/apiclient/src/Google/Client.php:423 Stack trace: #0 /home/host1475025/***domain***/htdocs/www/google-drive-amo/index.php(30): Google_Client->setAccessToken(Array) #1 {main} thrown in /home/host1475025/***domain***/htdocs/www/google-drive-amo/vendor/google/apiclient/src/Google/Client.php on line 423
PHP на сервере обновил до 7.0 версии.
Предыдущая ошибка пропала. Сейчас белый экран.
1)var_dump($_SESSION[‘accessToken’]); возвращает:
array(4) { [«access_token»]=> string(129) «**************************-iHHSBVny3yBJQyM97PVPe66XO1IqclBfgJW45jd3uJ0Hobhnp4zKbPKKhRx8hYJYfwIBrlDRTNeCslNeAyqaB8ZHmWqjvvX****» [«token_type»]=> string(6) «Bearer» [«expires_in»]=> int(3600) [«created»]=> int(1530799869) }
1)var_dump($token]); возвращает: NULL
Ну если clientId и clienSecret свои поставили, да и как видно $_SESSION[‘accessToken’]) возвращает все-таки токен.
Не понятно почему $token возвращает [no-highlight]NULL[/no-highlight].
Да и тут опечатка видимо [no-highlight]1)var_dump($token]);[/no-highlight]. Лишняя скобка.
Я бы попробовал уничтожить сессию через [no-highlight]unset($_SESSION[‘accessToken’]);[/no-highlight]. Можно в браузере удалить сессию и попробовать заново
Да, видимо ошибка в скобке была (уже забил на это) . В сессии все норм было, авторизацию проходил успешно. В общем все работает прекрасно, спасибо огромное! Только у меня не заработало дерево элементов, но оно мне и не нужно было)
Окей, обращайтесь. А насчет дерева элементов, возможно на самом google-диске просто нет файлов. Пустое дерево — пустой массив.
Добрый вечер, Денис! Подскажите пожалуйста для чего нужны ob_start(); и ob_end_flush(); ? Можно ли обойтись без них?
Добрый день! Все просто.
Если говорить кратко, то иногда необходимо, чтобы вывод скрипта не отправлялся, т.к. появляются ошибки при выводе. Поэтому временно все что хотим вывести сохраняем в буфере. А в конце сбрасываем и отключаем буферизацию.
ob_start — Включение буферизации вывода.
ob_end_flush — Сбросить (отправить) буфер вывод и отключить буферизацию вывода.
И насчет обойтись без них. Да, можно, но чтобы не было ошибок лучше сначала отправлять все заголовки, а потом уже что-то выводить.
На данную тему можно легко найти информацию в интернете. Все шаблонизаторы работают по аналогичному принципу.
Спасибо!
Добрый вечер! У меня возник еще один вопрос: достаточно ли добавить до запроса на подтверждения работы с гугл диском следующую строку $client->setAccessType(‘offline’); , чтобы период жизни токена не истекал и приложение могло работало автономно без подтверждения через браузер?
Добрый вечер. Я, к сожалению, не могу помнить всего API Google и библиотеки, которая его реализует.
Однако если бегло взглянуть, то да можно воспользоваться данным методом для так сказать вечного токена.
Насколько понял, нужно применить [no-highlight]$client->setAccessType(‘offline’);[/no-highlight], а еще [no-highlight]$client->setApprovalPrompt(‘force’);[/no-highlight] — включение запроса для токена. А то может не возвращаться токен. И, еще, надо не забыть удалить предыдущий токен.
Но более точную информацию можно получить при обращении к библиотеке и ее документации
Спасибо, добавив $client->setAccessType(‘offline’); и $client->setApprovalPrompt(‘force’); включился автономный доступ. Массив $_SESSION[‘accessToken’] дополнился refresh_token’ом.
получаю белый пустой экран
$_SESSION[‘accessToken’] не пустой
разрешение предоставил
пару файликов на диске присутствуют
всё — разобрался!
дело было в загадочном 0AHCqnAQsA3IDUk9PVA
непосредственно в построении дерева
$tree = $buildTree->makeTree($files, ‘0AHCqnAQsA3IDUk9PVA’);
у меня например совсем другое значение оказалось!
В общем перед этой строчкой делаем var_dump($tree) и смотрим parentId у любого файла расположенного в корне — берём эти символы и пихаем вместо загадочных
Добрый день! Да, всегда при проверке работы желательно включать вывод всех ошибок. Если ничего не выводится, то можно проверить выводимые данные с помощью отладочных функций. А так, специально для отладки здесь есть функция varDumper (хотя var_dump будет более подробной).
попробовал form-upload-file.php из архива — не загружает
при нажатии «загрузить файлы» пишет «Файл не выбран»
это оказался подключаемый файл
соответственно, для загрузки попробовал
/index.php?action=upload&fid=1
получаю всегда File not found
Урааа — загрузилось!!!
fid это и есть эти загадочные символы!
т.е. файловый идентификатор родителя
если это корень — те же самые символы что и выше!!!
Да, fid содержит идентификатор родителя, чтобы знать куда загрузить файл .
ещё момент — как быть если я не браузером авторизироваться буду?
т.е. нужно чтобы по расписанию с гугл диска загружались новые файлы на сайт
В любом случае, необходимо получить разрешение для работы с диском, как раз и будет возвращен токен. А уже потом каким образом и что будете Вы делать, решать только вам.
создал ключ сервисного аккаунта, авторизовался через него
он вообще другой список файлов даёт — один файлик «Getting started.pdf»
попробую ваш вариант с вечным токеном
пока пашет …
Если все выполнено правильно, то должно работать. Следует учитывать версию php, настройки сервера, ну и конечно, ваши данные для доступа к Google Drive (тут данные только для примера, хоть и реальные) .
да, с токеном пашет — спасибо большое за статью!
а вот с ключем сервисного аккаунта я так и не разобрался какой то левый список получает
Parse error: syntax error, unexpected ‘:’, expecting ‘;’ or ‘{‘ in /BuildTree.php on line 12
вообще
на PHP 5.6 можно как то запустить?
Да, всегда можно переписать под любую версию PHP. Для этого необходимо понимать отличия версий. В интернете полно информации. Например, в файле BuildTree.php есть функция, которая возвращает в заголовке массив, который можно убрать:
[no-highlight]public function makeTree(Array &$elements, $parentId = »)[/no-highlight]
по предыдущему отбой
мне BuildTree и не нужен, достаточно списка в том виде, что гугл отдаёт
Это пример. Данный класс действительно нужен только для построения дерева. Если дерево не нужно строить, то можно и обойтись без него
ещё момент — за раз только 100 файлов отдаётся!
судя по логике следующая партия — с новым токеном должна запрашиваться nextPageToken
не в курсе — можно сразу все получить?
Это наверное по умолчанию 100 файлов отдается. Если не ошибаюсь, то можно указать от 1 до 1000. Также есть параметр pageToken в который нужно вставить маркер из предыдущего ответа nextPageToken.
Все в документации подробно описано здесь.
Дока это отлично, но как эти параметры задать?
туплю
$DriveService->files->pageSize(1000);
Fatal error: Call to undefined method Google_Service_Drive_Resource_Files::pageSize()
всё — раступил
прописал в массив
рядышком с параметром «fields» при вызове метода listFiles
Блин дичь какая то — отображает все «доступные мне» файлы, а не только мой диск
вообще АПИ хрень
очень часто выкидывает
Fatal error: Uncaught exception ‘RuntimeException’ with message ‘Error creating resource: [message] fopen(): php_network_getaddresses: getaddrinfo failed
кто же запросы через fopen() дёргает?! пипец
Добрый день. Стандартная ситуация когда для получения данных используется fopen (старая и надежная функция для получения данных). Нет, зависимости, например от cUrl. Можете попробовать написать свой класс для работы с API, например через cUrl или еще как-то.
Да и это нормальный процесс, ошибки в разработке бывают. Нужно читать документация и смотреть, что передается и что возвращается.
друзья помогите настроить. чет не понимаю. залил скрипт. прописал setClientId и setClientSecret и кроме ошибки 500 не чего не получаю.
Доброго времени суток. Вы же понимаете, сложно сказать, что у вас не так по одной только 500 ошибке. Ошибка серверная, проверьте версию php, должна быть от 7. А так, функция var_dump() и die() для тестирования в помощь. Видимо не все условия выполнены как в статье.
да, тупанул. У меня мультиверсионность php и по умолчанию стояла 5.6. Вроде подключился, но теперь не могу вывести весь каталог — пустая страница
Что здесь $tree = $buildTree->makeTree($files, ‘0AHCqnAQsA3IDUk9PVA’); надо прописать?
Вижу чужие файлы, своих не вижу.
Добрый день. Что же Вы не читаете комментарии к коду.
[php]
/**
* Рекурсивное создание дерева элементов
*
* @param array $elements Массив элементов
* @param string $parentId Идентификатор корневого элемента
* @return array
*/
public function makeTree(Array &$elements, $parentId = ») : array
[/php]
Следовательно, здесь должен быть — Идентификатор корневого элемента. У всех он естественно разный. Если вам видно чужие файлы, то скорее всего вы не установили свои значения в методах setClientId и setClientSecret.
Как и где взять эти значения можно найти в Интернете.