1

编辑 2 - 我现在已经对这个问题提供了我自己的答案 - 任何进一步的想法或意见仍将不胜感激

编辑 1 - 潜在的相关信息:

我在内容服务文档页面的底部找到了这个脚注,上面写着:

出于安全原因,内容服务返回的内容不是从 提供的script.google.com,而是重定向到位于 的一次性 URL script.googleusercontent.com。这意味着,如果您使用内容服务将数据返回到另一个应用程序,则必须确保将 HTTP 客户端配置为遵循重定向。例如,在 cURL 命令行实用程序中,添加标志 -L。有关如何启用此行为的更多信息,请查看您的 HTTP 客户端的文档。

这似乎是相关的,因为我正在使用 ContentService 为 Strava 的 GET 请求提供数据 - 这是否意味着它收到的响应来自不同的 URL,因此不是来自指定的回调 URL?


我一直在尝试使用 Google Apps 脚本创建一个对 Strava 的 webhook 订阅,我觉得我非常接近解决它,但我遇到了最后一个我似乎无法通过的障碍。

此处列出了用于创建对 Strava 的 webhook 订阅的文档,并且我已经到了向 Strava API 发出 POST 请求订阅的阶段。然后,Strava 向我指定的 callback_url 发送一个 HTTP GET 请求,其中包含一些参数——其中最重要的是hub.challenge参数。这个参数必须在 2 秒内通过我的回调地址发回,以便验证链接。这是我有些悲伤的地方。

function doGet(e) {

  var hubChal = e.parameter["hub.challenge"];

  var result = {
    "hub.challenge": hubChal
  };

  return ContentService.createTextOutput(JSON.stringify(result))
    .setMimeType(ContentService.MimeType.JSON);

}

以上是我当前处理传入 GET 请求的函数。

在文档中它指出:

您的回调地址必须在两秒内响应来自 Strava 订阅服务的 GET 请求。响应应指示状态代码 200,并应将hub.challenge响应正文中的字段作为application/json内容类型回显:{ “hub.challenge”:”15f7d1a91c1f40f8a748fd134752feb3” }

但是,当我将 POST 发送到 webhook 订阅 API 时,我会在 Postman 上收到以下响应:

{
    "message": "Bad Request",
    "errors": [
        {
            "resource": "PushSubscription",
            "field": "callback url",
            "code": "GET to callback URL does not return 200"
        }
    ]
}

我检查了文档页面上提供的故障排除建议,其中的一个元素提供了一个示例 GET 请求,供您发送给自己,以查看您的回调地址提供的回报:

检查对上述请求的响应是否显示状态并在 JSON 正文中200正确回显。hub.challenge上述示例 curl 请求的响应正文应如下所示{ “hub.challenge”:”15f7d1a91c1f40f8a748fd134752feb3” }

使用以下虚拟 GET 请求:

{your-callback-url}?hub.verify_token=test&hub.challenge=15f7d1a91c1f40f8a748fd134752feb3&hub.mode=subscribe

插入我的回调 url 并通过 Postman 发送 GET 请求会向我返回以下内容:

{
    "hub.challenge": "15f7d1a91c1f40f8a748fd134752feb3"
}

除了显示 200 OK 状态代码外,还不到 2 秒。

我真的看不出我在这里做错了什么,因为我似乎满足了设置订阅的标准。值得一提的是,我对 Google Apps 脚本不是很熟悉,所以我完全有可能甚至很可能遗漏了一些基本的东西,但我一辈子都看不到它。

尽管昨天搜索了整个下午和晚上,我已经阅读了所有故障排除建议,但仍然无法在线找到答案。任何帮助将不胜感激 - 谢谢。

4

2 回答 2

1

我相信我终于找到了我的问题,不幸的是,似乎不可能使用 Google Apps 脚本设置对 Strava 的 webhook 订阅 - 至少在使用 ContentService 向 Strava GET 请求提供数据时是不可能的。

在 ContentService 文档的末尾,它说:

出于安全原因,内容服务返回的内容不是从 提供的script.google.com,而是重定向到位于 的一次性 URL script.googleusercontent.com。这意味着,如果您使用内容服务将数据返回到另一个应用程序,则必须确保将 HTTP 客户端配置为遵循重定向。例如,在 cURL 命令行实用程序中,添加标志 -L。有关如何启用此行为的更多信息,请查看您的 HTTP 客户端的文档。

这样做的问题是 Strava 期望并且只会接受附加到其 GET 请求响应的 200 状态代码,但是 ContentService 会向这个一次性 URL 发送 302 重定向。通过在我的虚拟 GET 请求的请求设置中关闭“自动遵循重定向”,我能够在 Postman 中验证这一点:

https://i.stack.imgur.com/vAvIm.png

由于我在 Postman 上默认启用了自动重定向,因此在发送我自己的请求时,我在任何时候都没有看到 302,导致一切看起来都井井有条。

如果有解决此 ContentService 问题的方法,请通知我,因为这样做的结果是我现在必须轮询 Strava 以获取新数据(嘘),这将使我的成品更加笨拙。

希望这篇文章现在能够帮助任何其他发现自己在未来遇到我的问题的人,并为他们节省几天的困惑!

于 2020-05-26T10:22:32.157 回答
0

我对 Goole Apps Script 不熟悉(顺便说一句,非常酷!),但听起来您对 Strava webhooks 非常了解。

听起来您的 doGet 方法返回的不是 200。您是否具有日志功能,可以输出 doGet 方法正在发送的内容、发送回的内容等?

如果您还没有,您可能需要查看有关使用 Node、Express 和 Ngrok 订阅 webhook 的 Strava 教程。一些额外的步骤,但相当容易遵循和调试。

于 2020-05-25T18:15:44.223 回答