【问题标题】:Transferring data to GAS via doPost does'nt work通过 doPost 将数据传输到 GAS 不起作用
【发布时间】:2015-04-18 05:51:49
【问题描述】:

我想通过 curl / doPost 从基于 php 的数据库系统向谷歌应用程序引擎提交一些简单的数据。目标是 GAS 以访问网络应用程序的用户身份执行应用程序,并且任何人(拥有 google 帐户)都可以访问该应用程序。

在 PHP 系统端,我有以下代码来发送数据:

// Get cURL resource
// 
$curl = curl_init();
// Set some options
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://script.google.com/macros/s/AKfycbw-BksmkTsn_KEX40EhzfEulE-rJsUmlbIjUtW9PrTRMQLyiA/exec',
CURLOPT_POST => 1,
CURLOPT_FOLLOWLOCATION => 1,
CURLOPT_SSL_VERIFYPEER  => 1,
CURLOPT_POSTFIELDS => array(
   'firstname' => 'John',
   'lastname' => 'Miller'
)
));

// Send the request, save response to $resp
$resp = curl_exec($curl);
//echo curl_error($curl);

// Show response
echo $resp;

// Close request to clear up some resources
curl_close($curl);
//echo 'curl closed';

在 GAS 方面,我有以下代码来接收数据:

function doPost(e) {

  var parameter
  var wert

  for (var i in e.parameter) {
    parameter = i;
    wert =  e.parameter[i];

    if (parameter == "firstname") {var firstname = wert;}    
    if (parameter == "lastname") {var lastname = wert;}

  }


  //Return  
  return ContentService.createTextOutput("The name is: " + firstname + " " + lastname);

}

只有在使用以下选项部署 GAS 中的脚本时,代码才能正常工作:“将应用程序执行为:”设置为“我自己”。 “谁有权访问该应用程序”设置为“任何人,甚至匿名”。如果有人想测试代码,您还必须在 php.ini 中添加一些行并在您的计算机上保存一个“cacert.pem”文件:

[curl]
curl.cainfo="C:/[path to]/cacert.pem"
CURLOPT_SSL_VERIFYPEER=1

如果我将部署选项“将应用程序执行为:”切换为“用户访问 Web 应用程序”并且“谁有权访问该应用程序”切换为“任何人”,则它不再起作用。屏幕上出现以下内容:

通过 cURL 将 https 请求发送到 google 应用程序脚本后,会出现一个登录屏幕,供用户登录到 google。 chrome 中的标签标题为“认识 Google”。它显示“登录以继续使用 Google 云端硬盘”。整个登录屏幕都是英文的(我是德国人)。之后,我输入我的私人谷歌帐户的登录信息,然后按“登录”按钮。之后会出现第二个登录屏幕。 chrome 中的标签标题为“Google Drive”。它说“Zur Nutzung von Google Drive anmelden”(翻译:“请登录以访问 google drive。”)。然后我再次输入相同的登录信息并按下“anmelden”按钮(翻译:“登录”)。接下来发生的事情是应用程序脚本的 URL 出现在 chrome 中。该选项卡的标题为“Fehler”(翻译:“错误”)。在窗口中我可以阅读“Skript-Funktion nicht gefunden: doGet”(翻译:“找不到脚本函数:doGet”)。

我无法理解 Google Apps 脚本的行为。特别是我不明白为什么谷歌要求“doGet”,尽管应用脚本中肯定有一个“doPost”。

我们非常欢迎一些帮助。


几个月后我仍在处理这个问题。

我在 google 开发者控制台中创建了一个项目,并将应用程序脚本连接到该项目。

这样就可以通过 PHP 的 google api 调用访问登录的 google 用户。所以我必须在 PHP 中完成所有的编码。但这不是我想要的。

我想通过谷歌应用脚​​本访问当前登录的谷歌用户 gmail / drive 等。我只想通过 PHP 传输一些数据。

在网上搜索了几个小时后,在我看来这是不可能的。

非常欢迎任何提示。

【问题讨论】:

    标签: curl google-apps-script


    【解决方案1】:

    您几乎已经在问题详细信息中回答了这个问题。应用程序脚本需要配置为以您身份运行并具有匿名访问权限。否则,您如何期望来自服务器的“发布”调用在您尝试的其他配置中工作? 其他模式下的身份验证要求另一端的浏览器具有授权访问其帐户的用户,因此脚本 1) 知道与谁交谈并 2) 获得对这些用户资源的请求访问权限。

    【讨论】:

    • 实际上可以通过从 doGet webapp 为预授权用户发送正确的 cookie 来伪造该用户,但这超出了这个问题的范围。
    • 假设我想在当前登录的用户帐户中使用我的脚本创建一封电子邮件,该用户正在访问我的脚本。然后应该会发生以下情况:GAS 应该询问实际登录的 google 用户是否愿意授权我的脚本访问他的电子邮件帐户。在用户说“是”后,脚本将能够创建电子邮件。我已经在网上多次看到这个过程,但不知道如何使用“doPost”来实现这一点。为什么它适用于“doGet”而不适用于“doPost”?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多