Проблемы с использованием cURL с Google Apps Script Web App в файле PHP - PullRequest
1 голос
/ 17 января 2020

Я пытаюсь выяснить, почему этот код не будет работать с URL-адресом веб-приложения скрипта Служб Google, но будет работать со случайным URL-адресом веб-API?

1-й блок кода получает данные от фиктивного API. Второй блок кода ничего не возвращает по URL-адресу веб-приложения скрипта Google Apps. Единственное отличие в коде - это значение переменной $ url.

Приложение GAS настроено на использование веб-приложения, поэтому любой, даже анонимный пользователь, может получить к нему доступ (скриншот ниже). Если я go непосредственно на адрес GAS GAS Output , он возвращает JSON.

Код скрипта Google Apps находится ниже в третьем блоке кода.

Есть идеи?

Проблема решена благодаря Танаике !! Рабочий код вставлен внизу вопроса.

enter image description here

Первый кодовый блок

<?php
// Initiate curl session in a variable (resource)
$curl_handle = curl_init();

$url = "http://dummy.restapiexample.com/api/v1/employees";

// Set the curl URL option
curl_setopt($curl_handle, CURLOPT_URL, $url);

// This option will return data as a string instead of direct output
curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, true);

// Execute curl & store data in a variable
$curl_data = curl_exec($curl_handle);

curl_close($curl_handle);

// Decode JSON into PHP array
$user_data = json_decode($curl_data);

// Print all data if needed
print_r($user_data);

?>

Второй кодовый блок

<?php
// Initiate curl session in a variable (resource)
$curl_handle = curl_init();

$url = "https://script.google.com/macros/s/AKfycbyWSDzUyFa41fu_6QWP7h8ToklwWysGZsuSPaRnu649DmPNYG8/exec";

// Set the curl URL option
curl_setopt($curl_handle, CURLOPT_URL, $url);

// This option will return data as a string instead of direct output
curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, true);

// Execute curl & store data in a variable
$curl_data = curl_exec($curl_handle);

curl_close($curl_handle);

// Decode JSON into PHP array
$user_data = json_decode($curl_data);

// Print all data if needed
print_r($user_data);

?>

Первый кодовый блок: код ГАЗ

function doGet(e) {
  var data = {
    status: 'success',
    dataSet: 'Some Info'

  };

  var output = JSON.stringify(data);
  return ContentService.createTextOutput(output).setMimeType(ContentService.MimeType.JSON);
}

Рабочий код, спасибо Танаике !!

<?php
// Initiate curl session in a variable (resource)
$curl_handle = curl_init();

$url = "https://script.google.com/macros/s/AKfycbyWSDzUyFa41fu_6QWP7h8ToklwWysGZsuSPaRnu649DmPNYG8/exec";



// Set the curl URL option
curl_setopt($curl_handle, CURLOPT_URL, $url);

// was an update from my stack overflow question.
curl_setopt($curl_handle, CURLOPT_FOLLOWLOCATION, true); //https://stackoverflow.com/questions/59780986/trouble-using-curl-with-google-apps-script-web-app-in-a-php-file/59781600#59781600

// This option will return data as a string instead of direct output
curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, true);

// Execute curl & store data in a variable
$curl_data = curl_exec($curl_handle);

curl_close($curl_handle);

// Decode JSON into PHP array
$user_data = json_decode($curl_data);

// Print all data if needed
print_r($user_data);

?>

Ответы [ 2 ]

2 голосов
/ 17 января 2020
  • Вы хотите получить доступ к веб-приложениям с помощью php.
  • Вы хотите знать причину, по которой при запуске сценария не отображаются никакие значения.

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

Причина вашей проблемы:

В ваших веб-приложениях Execute the app as: и Who has access to the app: установлены как User accessing the web app и Anyone соответственно. В этом случае при доступе к веб-приложениям необходимо использовать токен доступа. Так что в вашем скрипте возникает ошибка. Но curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, true) используется. При этом значения не отображаются. Когда curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, true) удаляется, в вашем скрипте страница перенаправления извлекается как HTML data.

Чтобы избежать этой проблемы, как насчет следующих изменений?

Pattern 1:

В вашем скрипте похоже, что токен доступа не используется. В этом случае установите Execute the app as: и Who has access to the app: как Me и Anyone, even anonymous соответственно. В этом случае не требуется использовать токен доступа.

Для этого, пожалуйста, добавьте следующий скрипт в ваш скрипт для доступа к веб-приложениям.

curl_setopt($curl_handle, CURLOPT_FOLLOWLOCATION, true);

В соответствии с приведенным выше потоком, Вы можете получить доступ к веб-приложениям с помощью сценария php и получить значения из веб-приложений.

Шаблон 2:

Если вы хотите получить доступ к веб-приложениям, развернутым с Execute the app as: и Who has access to the app: как User accessing the web app и Anyone, соответственно, необходимо использовать токен доступа.

Для этого, пожалуйста, добавьте следующий скрипт в ваш скрипт для доступа к веб-приложениям.

curl_setopt($curl_handle, CURLOPT_FOLLOWLOCATION, true);
$header = ['Authorization: Bearer ###your access token###'];
curl_setopt($curl_handle, CURLOPT_HTTPHEADER, $header);

Примечание:

  • При указанных выше условиях, если вы, владелец веб-приложений, предоставляете другим пользователям доступ к вашим веб-приложениям с этим условием, расскажите, пожалуйста, о проекте GAS, что веб-приложения был развернут с пользователями. Таким образом, пользователи могут получать доступ к веб-приложениям с помощью токена доступа пользователя.

Примечание:

  • При изменении сценария веб-приложений на стороне сценария Google Apps, пожалуйста, повторно разверните веб-приложения в новой версии. Таким образом, последний скрипт отражается на веб-приложениях. Пожалуйста, будьте осторожны.

Ссылки:

Если я неправильно понял ваш вопрос, и это не то направление, которое вы хотите, прошу прощения.

0 голосов
/ 17 января 2020

Я попытался получить доступ к URL-адресу скрипта приложений в окне инкогнито, и он перенаправил на приглашение входа в Google.

Когда вы используете настройку User accessing the web app для опции Execute the app as, сценарий, что неудивительно , запустить как личность пользователя, получающего к нему доступ. Поэтому, с вашими текущими настройками, пользователь должен войти в учетную запись Google, чтобы успешно выполнить приложение .

Если вы переключите опцию Execute the app as на Me (<you address>), это делает дополнительную опцию Anyone, even anonymous доступной для опции Who has access to this app. Это единственный способ обеспечить действительно анонимный доступ к приложению.

Подробнее см. в документации по разрешениям .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...