Я пытаюсь вызвать очень простой скрипт приложений Google из php с использованием служебной учетной записи, чтобы к нему мог получить доступ только мой сервер, а не пользователи веб-сайта.
Вот как я это делаю. Я создаю сценарий здесь https://script.google.com
function get() {
return ContentService.createTextOutput('get method');
}
и новый проект автоматически ассоциируется, когда я сохраняю его.
Тогда я открываю File > Project Properties
чтобы получить scriptId = MM8zQqofS1OIcnFiNSlm1CGEl5qMrMVBt
Я захожу в консоль разработчика соответствующего проекта Resources > Project Developers console
нажав на ссылку проекта в верхней части всплывающего окна.
Затем я нажимаю «Активировать и управлять API» и активировать «API выполнения скриптов Google Apps». Я нажимаю «Учетные данные» и вижу, что предыдущая операция автоматически создала учетные данные OAuth2. Но мне нужны учетные данные службы. Тогда я создаю один Add credentials > Service account
и загрузите сгенерированный файл p12. Я получаю clientId = 109160023321840004240
а также clientMail = [email protected]
для этой учетной записи службы.
Я возвращаюсь к своему сценарию и делюсь им с адресом электронной почты учетной записи службы для чтения&доступ для записи File > Share
, Прежде всего, я получаю письмо в своем личном почтовом ящике, которое уведомляет меня, что
Delivery to the following recipient failed permanently:
[email protected]
Затем я публикую сценарий как API выполнения Publish > Publish as an execution API
с доступом ко всем.
Теперь давайте перейдем на сторону сервера PHP. Используя клиентскую библиотеку API Google для PHP, доступную здесь https://github.com/google/google-api-php-client Я пытаюсь вызвать функцию скрипта из PHP:
$client = new Google_Client();
$client->setClientId('109160023321840004240');
$client->setApplicationName('myScript');
$cred = new Google_Auth_AssertionCredentials(
'[email protected]',
[/*no scope nedeed for this simple script*/],
file_get_contents('path_to_myScript.p12')
);
$client->setAssertionCredentials($cred);
if ($client->getAuth()->isAccessTokenExpired()) {
$client->getAuth()->refreshTokenWithAssertion($cred);
}
$service = new Google_Service_Script($client);
$scriptId = 'MM8zQqofS1OIcnFiNSlm1CGEl5qMrMVBt';
// Create an execution request object.
$request = new Google_Service_Script_ExecutionRequest();
$request->setFunction('get');
$response = $service->scripts->run($scriptId, $request);
И вот ответ, который я получаю все время
Error calling POST https://script.googleapis.com/v1/scripts/MM8zQqofS1OIcnFiNSlm1CGEl5qMrMVBt:run: (403) The caller does not have permission
Если при развертывании сценария я решу предоставить доступ «Только мне», я получу следующий ответ.
Error calling POST https://script.googleapis.com/v1/scripts/MM8zQqofS1OIcnFiNSlm1CGEl5qMrMVBt:run: (404) Requested entity was not found.
Я был бы так счастлив, если бы у кого-нибудь из вас была идея помочь мне 🙂
Сценарий приложения еще не поддерживает учетные записи служб с API-интерфейсом выполнения. увидеть https://code.google.com/p/google-apps-script-issues/issues/detail?id=5461
Google сказал, что они изучают это, но очевидно не скоро произойдет (на основе ответов Google на Google + сообщения об этом как https://plus.google.com/+MartinHawksey/posts/Zquix9XqzkK)
Других решений пока нет …