首页 > 解决方案 > 如何在 Google Script 中从这个特定的 POST HTTP 调用中获取结果 - 在 python 中运行良好

问题描述

我在 python 中得到了这个简单的脚本

import requests

val = "id"

data = {
  'val': val,
  'type': '1'
}

session = requests.session()

response = session.post('https://www.someweb.com/modules/output/ajax.check_results.php', data=data)

print(response.json())

出于安全原因,我不允许透露正确的网址。

我不知道python(我可以在我的计算机上运行上面的代码并且它运行良好)所以我想将代码移植到谷歌应用程序脚本。目前看起来是这样的

function getResults() {
  
  var url = 'https://www.someweb.com/modules/output/ajax.check_results.php';

  var data = {
    'val': 'id',
    'type': '1'
  }
  var options = {
      "method": "post",
 //     "headers": headers,
      "data": data
  };
  var response = UrlFetchApp.fetch(url, options);

  Logger.log(response.getContent);
  Logger.log(response);
  Logger.log(response.getAllHeaders());
  Logger.log(response.getResponseCode());
  Logger.log(response.getContentText());
  //Logger.log(JSON.parse(response.getContent()));
  //Logger.log(JSON.parse(response.getContentText()));
  //Logger.log(JSON.parse(response));
} 

输出看起来像这样

2:47:22 PM Notice  Execution started
2:47:22 PM Info    function () { [native code] }
2:47:22 PM Info 
2:47:22 PM Info    {Content-Type=text/html; charset=UTF-8, Expires=Thu, 19 Nov 1981 08:52:00 GMT, Date=Sun, 24 Jan 2021 13:47:22 GMT, Set-Cookie=PHPSESSID=ibdotvlrrec1q6glnbe8i0iu23; path=/, Server=Apache/2.4.38 (Debian), Cache-Control=private, must-revalidate, Content-Length=0, Pragma=no-cache, keep-alive=timeout=5, max=100, Connection=Keep-Alive}
2:47:22 PM Info    200.0
2:47:22 PM Info
2:47:23 PM Notice  Execution completed

评论的记录器给了我

3:14:03 PM Error SyntaxError: Unexpected end of JSON input  getResults @ 

我认为问题在于 Google Script 需要一秒钟才能完成,但 python 需要 14 秒。它等待得到结果。

有人可以帮助如何制作谷歌脚本来获得结果吗?

标签: pythonpostgoogle-apps-script

解决方案


查看UrlFetchApp.fetch(). data不是可用参数之一。您应该改用并作为字符串payload传递。data

function getResults() {
  const url = 'https://www.someweb.com/modules/output/ajax.check_results.php';
  const data = {
    'val': 'id',
    'type': '1'
  };
  const options = {
    'method': 'post',
    'payload': JSON.stringify(data)
  };
  const response = UrlFetchApp.fetch(url, options);
  console.log(response.getContentText()); // string
  console.log(JSON.parse(response.getContentText())); // object, if it can be parsed
}

您收到的错误来自JSON.parse(response.getContent()),因为JSON.parse()需要一个字符串,但getContent()返回一个原始二进制数据数组。根据我上面的示例,您应该getContentText()改用。


推荐阅读