Javascript 如何使用;执行官;url而不是“url”;发展";网址。Exec返回403错误

Javascript 如何使用;执行官;url而不是“url”;发展";网址。Exec返回403错误,javascript,google-apps-script,google-sheets,webhooks,trello,Javascript,Google Apps Script,Google Sheets,Webhooks,Trello,一直在尝试在GoogleSheets应用程序脚本中设置一个webhook,当Trello中发生更改时,该脚本将做出响应。为此,建议将脚本部署为web应用程序(需要返回HTML的doGet和doPost函数),以创建用于接收post和get请求的URL目的地 web应用程序生成两个URL,一个以/dev结尾,用于开发目的(不响应post请求),另一个以/exec结尾,用于正常访问 我已经部署了web应用程序,这两个URL都可以在我的浏览器中访问和响应(可以在不登录的情况下以匿名方式查看exec),

一直在尝试在GoogleSheets应用程序脚本中设置一个webhook,当Trello中发生更改时,该脚本将做出响应。为此,建议将脚本部署为web应用程序(需要返回HTML的
doGet
doPost
函数),以创建用于接收
post
get
请求的URL目的地

web应用程序生成两个URL,一个以
/dev
结尾,用于开发目的(不响应
post
请求),另一个以
/exec
结尾,用于正常访问

我已经部署了web应用程序,这两个URL都可以在我的浏览器中访问和响应(可以在不登录的情况下以匿名方式查看exec),应用程序被发布为“我”执行,“任何人,甚至匿名”都可以访问

我已经能够成功地使用下面的代码为
/dev
URL创建web钩子,但没有为
/exec
URL创建web钩子

function create() {
  var url = 'https://api.trello.com/1/tokens/ae6ebe60b45abcd2d4aa945c9ab4c4571bd6b6f7856b1df0cd387fbffc649579/webhooks/?key=a211f4aca7fb3e521d652730dd231cb6'

  var payload = { 
    "key": "xxxxxxxxxxx",
    "token" : "xxxxxxxxxxxxx",
    "callbackURL": "https://script.google.com/macros/s/AKfycbw51TYGWHe95hKdcAs4l7E2eg0AtBi8e48lf_iafKYI/dev",
    "idModel":"xxxxxxxx",
    "description": "GW Test"  
  }
  var options = {"method" : "post",
                 "payload" : payload,
                 "muteHttpExceptions": true
                 };

  var response = UrlFetchApp.fetch(url,options);
}
使用
/dev
URL时,我可以看到在我的Trello中添加了一个新的web钩子,但是
/exec
URL返回以下错误:

{“message”:“URL()未返回200状态码,获取403”,“error”:“error”}

因此Trello希望返回一个“200状态码”来验证脚本是否正常运行,但收到的却是403。让我困惑的是,为什么在使用
/dev
时不会发生这种情况?如何让它接受我的
/exec
URL

更多信息:


当我直接在浏览器中使用或加载URL时,我可以让我的代码响应
put
get
请求。它通过填充电子表格中的前六(6)个单元格进行响应

我已经重新发布了一个新版本,并验证了代码仍然有效,但我仍然从Trello那里收到错误消息,说他们收到的是403而不是200代码。我只在使用
/exec
而不是
/dev
时收到此错误。而且由于
/dev
无法接收
post
请求,因此它不会有任何帮助:(

下面是一个示例的剩余部分:


function doSomething() {
  var values = [11,12];
  SpreadsheetApp.getActiveSheet().getRange("A1:B1").setValue(values);
}


function create() {
  var url = 'https://api.trello.com/1/tokens/ae6ebe60b45abcd2d4aa945c9ab4c4571bd6b6f7856b1df0cd387fbffc649579/webhooks/?key=a211f4aca7fb3e521d652730dd231cb6'  
  var payload = { 
    "key": "xxxxxxxxxxxxxxxxxx",
    "token" : "xxxxxxxxxxxxxxxxxxx": "https://script.google.com/macros/s/AKfycbw51TYGWHe95hKdcAs4l7E2eg0AtBi8e48lf_iafKYI/dev",
    "idModel":"xxxxxxxxxxxxxxxxxxxxxxxx",
    "description": "GW Test"  
  }
  var options = {"method" : "delete",
                 "payload" : payload,
              // "muteHttpExceptions": true
                 };

  var response = UrlFetchApp.fetch(url,options);           // creates webhook
}


// function that fires when the webapp receives a GET request
function doGet(e) {
  doSomething();
  var values = [21,22];
  SpreadsheetApp.getActiveSheet().getRange("A2:B2").setValue(values);
  return HtmlService.createHtmlOutput("something Get-ed");
}

function doPost(e) {
  doSomething();
  var values = [31,32];
  SpreadsheetApp.getActiveSheet().getRange("A3:B3").setValue(values);
  return ContentService.createTextOutput("something Posted");
  //var params = JSON.stringify(e);
}


这个答案怎么样

问题: 根据您的问题,API返回了以下错误

{“message”:“URL()未返回200状态码,获取403”,“error”:“error”}

关于上述错误的原因,起初我认为最新的脚本可能不会反映到Web应用程序中。但从您的回复评论中,发现最新的脚本会反映到Web应用程序中。在这种情况下,我尝试从部署的Web应用程序中检索
403
的错误

准备: 作为准备工作,Web应用程序分别以“作为执行应用程序”和“谁有权访问应用程序”作为
Me
任何人(甚至匿名)部署。Web应用程序的示例脚本如下所示

function doGet(e) {return ContentService.createTextOutput("GET: Done.")}
function myFunction() {
  var url_exec = "https://script.google.com/macros/s/###/exec";
  var url_dev = "https://script.google.com/macros/s/###/dev";
  var res = UrlFetchApp.fetchAll([{url: url_exec}, {url: url_dev}]);
  res.forEach(function(e) {
    Logger.log(e.getResponseCode());
  });
}
实验: 使用Google应用程序脚本: 首先,我使用GoogleApps脚本检查状态代码,当它请求Web应用时

function doGet(e) {return ContentService.createTextOutput("GET: Done.")}
function myFunction() {
  var url_exec = "https://script.google.com/macros/s/###/exec";
  var url_dev = "https://script.google.com/macros/s/###/dev";
  var res = UrlFetchApp.fetchAll([{url: url_exec}, {url: url_dev}]);
  res.forEach(function(e) {
    Logger.log(e.getResponseCode());
  });
}
在这种情况下,为
exec
dev
的两个端点获取了
200
的状态代码。使用Google Apps脚本,无法检索到
403
的状态代码

使用Curl: 为了用curl检索状态代码,
curl-s-o/dev/null-w“{http_-code}”http://www.example.org/使用了
。这是从。在这里,使用curl命令调查状态代码。因为curl可以通过如下所示的选项通过两种请求进行访问

  • :在输出中包括HTTP响应头。HTTP响应头可以包括服务器名称、cookies、文档日期、HTTP版本等内容

  • :(HTTP FTP文件)仅获取标题!HTTP服务器具有命令头,该命令头仅用于获取文档的标题。当用于FTP或文件时,curl仅显示文件大小和上次修改时间

  • 使用上述选项,调查了以下4种模式

  • 使用选项
    --include
    请求
    exec
    的端点。
    • curl-sL--include-o/dev/null-w“{http_-code}”https://script.google.com/macros/s/###/exec“
    • 已返回
      200
  • 使用选项
    --include
    请求
    dev
    的端点。
    • curl-sL--include-o/dev/null-w“{http_-code}”https://script.google.com/macros/s/###/dev“
    • 已返回
      200
  • 使用选项
    --head
    请求
    exec
    的端点。
    • curl-sL--head-o/dev/null-w“{http_-code}”https://script.google.com/macros/s/###/exec“
    • 403
      已返回。
  • 使用选项
    --head
    请求
    dev
    的端点。
    • curl-sL--head-o/dev/null-w“{http_-code}”https://script.google.com/macros/s/###/dev“
    • 已返回
      200
  • 结果发现,当使用选项
    --head
    请求
    exec
    端点的Web应用程序时,获得了
    403
    的状态代码

    结果和讨论: 当选项
    --head
    用于curl命令时,从文档中,这意味着它只请求header而不请求body。由此,发现返回了
    403
    的状态代码

    这里,为什么当它请求
    dev
    的端点时,
    -include
    -head
    的两个选项都返回了
    200
    的状态代码?我们认为这是因为返回了登录屏幕。当访问
    dev
    的端点时,它是必需的