Проблема при создании подписки на веб-перехватчик Strava с помощью скрипта Google Apps - PullRequest
1 голос
/ 25 мая 2020

РЕДАКТИРОВАТЬ 2 - Теперь я предоставил свой собственный ответ на этот вопрос - любые дальнейшие мысли или предложения будут оценены

РЕДАКТИРОВАТЬ 1 - ПОТЕНЦИАЛЬНАЯ СООТВЕТСТВУЮЩАЯ ИНФОРМАЦИЯ :

Я нашел эту сноску внизу страницы документации Content Service , которая гласит:

По соображениям безопасности содержимое, возвращаемое Служба контента не обслуживается с script.google.com, а вместо этого перенаправляется на одноразовый URL-адрес script.googleusercontent.com. Это означает, что если вы используете службу содержимого для возврата данных в другое приложение, вы должны убедиться, что HTTP-клиент настроен на выполнение перенаправлений. Например, в утилите командной строки cURL добавьте флаг -L. Дополнительную информацию о том, как включить такое поведение, см. В документации вашего HTTP-клиента.

Это кажется актуальным, поскольку я использую ContentService для передачи данных в запрос GET Strava - не будет ли это означать, что ответ получает приходит с другого URL-адреса и, следовательно, не с указанного URL-адреса обратного вызова?


Я пытался использовать Google Apps Script для создания подписки на веб-перехватчик Strava, и мне кажется, что я очень близок чтобы понять это, но я столкнулся с одним последним препятствием, которое, похоже, не могу преодолеть.

Документация для создания подписки на веб-перехватчик Strava указана здесь , и я дошел до этапа, на котором я отправляю POST в Strava API с запросом подписки. Затем Strava отправляет HTTP-запрос GET на указанный мной callback_url, который содержит некоторые параметры, наиболее важным из которых является параметр 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-запросами.

В документации указано:

Ваш обратный адрес должен ответить в течение двух секунд на запрос GET от службы подписки Strava. В ответе должен быть указан код состояния 200 и должно отображаться поле hub.challenge в теле ответа как application/json тип содержимого: { “hub.challenge”:”15f7d1a91c1f40f8a748fd134752feb3” }

Однако, когда я отправляю POST в API подписки на веб-перехватчик Я получил этот ответ на Postman:

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

Я проверил совет по устранению неполадок, который предлагается на странице do c, элемент которой дает образец запроса GET, который вы можете отправить себе, чтобы узнать, что ваш адрес обратного вызова предлагает взамен:

Убедитесь, что ответ на вышеуказанный запрос показывает состояние 200 и правильно повторяет hub.challenge в теле JSON. Тело ответа на приведенный выше пример запроса curl должно выглядеть так: { “hub.challenge”:”15f7d1a91c1f40f8a748fd134752feb3” }

со следующим фиктивным запросом GET:

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

Подключение моего обратного вызова url и отправка запроса GET через Postman возвращает мне следующее:

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

Вместе с отображением кода состояния 200 OK и менее чем через 2 секунды.

Я действительно не вижу что я сделал здесь неправильно, так как кажется, что я выполняю критерии, изложенные для создания подписки. Стоит отметить, что я не очень хорошо знаком с Google Apps Script, поэтому вполне возможно и даже вероятно, что я упускаю что-то basi c, но я не вижу этого всю жизнь.

Я изучил все советы по устранению неполадок и не смог найти ответ в Интернете, несмотря на то, что вчера провел целый день и вечер поиска. Любая помощь будет чрезвычайно признательна - спасибо.

Ответы [ 2 ]

1 голос
/ 26 мая 2020

Я считаю, что наконец-то понял свою проблему, и, к сожалению, кажется, что невозможно настроить подписку на веб-перехватчик Strava с помощью Google Apps Script - по крайней мере, при использовании ContentService для передачи данных в запросы Strava GET.

В конце документации ContentService говорится:

По соображениям безопасности контент, возвращаемый службой Content, не обслуживается из script.google.com, а вместо этого перенаправляется на одноразовую URL в script.googleusercontent.com. Это означает, что если вы используете службу содержимого для возврата данных в другое приложение, вы должны убедиться, что HTTP-клиент настроен на выполнение перенаправлений. Например, в утилите командной строки cURL добавьте флаг -L. Дополнительную информацию о том, как включить это поведение, см. В документации вашего HTTP-клиента.

Проблема в том, что Strava ожидает и принимает только код состояния 200, прикрепленный к ответу на свой запрос GET. , однако ContentService отправляет 302 редирект на этот одноразовый URL. Я смог проверить это в Postman, отключив «Автоматически следовать перенаправлениям» в настройках моего фиктивного запроса GET:

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

Поскольку у меня автоматическое перенаправление включено по умолчанию в Postman, я не видел 302 ни разу при отправке моих собственных запросов, что привело к тому, что все выглядело в порядке.

Если есть способ обойти эту проблему ContentService, тогда пожалуйста, сообщите мне , так как в результате мне придется опросить Strava на предмет новых данных (буу), которые сделают мой готовый продукт значительно более неуклюжим.

Надеюсь этот пост теперь поможет всем, кто столкнется с моей проблемой в будущем, и избавит их от нескольких дней путаницы!

0 голосов
/ 25 мая 2020

Я не знаком со скриптом приложений Goole (кстати, очень круто!), Но похоже, что у вас есть хорошо изученные веб-перехватчики Strava.

Похоже, ваш метод doGet возвращает что-то, кроме 200 . Есть ли у вас функция ведения журнала, которая может выводить то, что метод doGet отправляет, что он отправляет обратно, et c?

Если вы еще этого не сделали, вы можете ознакомиться с руководством Strava по подписке на веб-перехватчики с использованием Node, Express и Ngrok . Несколько дополнительных шагов, но их довольно легко выполнить и отладить.

...