使用 Google Apps 脚本创建 Strava webhook 订阅时出现问题

Problem creating a Strava webhook subscription using Google Apps Script


编辑 2 - 我现在已经提供了我自己的问题答案 - 任何进一步的想法或意见仍然会受到赞赏

编辑 1 - 潜在相关信息:

我在 Content Service 文档页面的底部找到了这个脚注,上面写着:

For security reasons, content returned by the Content service isn't served from script.google.com, but instead redirected to a one-time URL at script.googleusercontent.com. This means that if you use the Content service to return data to another application, you must ensure that the HTTP client is configured to follow redirects. For example, in the cURL command line utility, add the flag -L. Check the documentation for your HTTP client for more information on how to enable this behavior.

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


我一直在尝试使用 Google Apps 脚本来创建对 Strava 的网络钩子订阅,我觉得我已经非常接近解决这个问题了,但我遇到了最后一个障碍好像过不了

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

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 请求的函数。

在文档中指出:

Your callback address must respond within two seconds to the GET request from Strava’s subscription service. The response should indicate status code 200 and should echo the hub.challenge field in the response body as application/json content type: { “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 请求,您可以发送给自己以查看您的回调地址在 return 中提供的内容:

Check that the response to the above request shows a 200 status and correctly echos the hub.challenge in the JSON body. The response body to the above sample curl request should look like { “hub.challenge”:”15f7d1a91c1f40f8a748fd134752feb3” }

使用以下虚拟 GET 请求:

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

插入我的回调 url 并通过 Postman return 向我发送 GET 请求:

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

在不到 2 秒的时间内显示 200 OK 状态代码。

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

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

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

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

如果您还没有,您可能需要查看 Strava tutorial on subscribing to webhooks using Node, Express and Ngrok。一些额外的步骤,但相当容易遵循和调试。

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

在 ContentService 文档的末尾,它说:

For security reasons, content returned by the Content service isn't served from script.google.com, but instead redirected to a one-time URL at script.googleusercontent.com. This means that if you use the Content service to return data to another application, you must ensure that the HTTP client is configured to follow redirects. For example, in the cURL command line utility, add the flag -L. Check the documentation for your HTTP client for more information on how to enable this behavior.

这个问题是 Strava 期望并且只会接受附加到其 GET 请求响应的 200 状态代码,但是 ContentService 发送一个 302 重定向到这个一次性 URL。我可以通过在我的虚拟 GET 请求的请求设置中关闭 "Automatically follow redirects" 来在 Postman 中验证这一点:

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

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

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

希望这个 post 现在可以帮助将来遇到我的问题的其他人,并让他们免去几天的困惑!