1

我正在尝试创建一个 Strava webhook 订阅,以接收来自已授权我的 Strava 应用程序的用户的事件。我能够使用本 Strava 教程中的代码成功创建订阅。但是,我不懂 Javascript,所以无法根据我的需要调整代码。因此,我尝试使用 Django 在 Python 中复制它的功能。

我的基本方法是遵循本网页Django 部分中概述的设置,然后将文件views.py中的代码替换为以下代码。我试图使代码功能与我上面链接的教程中的 Javascript 函数尽可能相似。但是,我对 Web 应用程序非常陌生,因此在几个地方都采取了捷径/“在不了解原因的情况下放弃了有效的方法”。

from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt
from django.views.decorators.clickjacking import xframe_options_exempt
import json

@csrf_exempt
@xframe_options_exempt
def example(request):
    if request.method == "GET":
        verify_token = "STRAVA"
        str_request = str(request)
        try:
            mode      = str_request[str_request.find("hub.mode=") + 9 : len(str_request) - 2]
            token     = str_request[str_request.find("hub.verify_token=") + 17 : str_request.find("&hub.challenge")]
            challenge = str_request[str_request.find("hub.challenge=") + 14 : str_request.find("&hub.mode")]
        except:
            return HttpResponse('Could not verify. Mode, token or challenge not valid.')
        
        if (mode == 'subscribe' and token == verify_token):
            resp = json.dumps({"hub.challenge":challenge},separators=(',', ':'))
            return HttpResponse(resp, content_type='application/json; charset=utf-8')
        else:
            return HttpResponse('Could not verify mode or token.')

Strava 文档说回调 url 必须在 2 秒内以 json 字符串的状态和回显响应GET请求200hub.challenge这个功能似乎做到了。然而,当我尝试创建一个等效于以下请求的 POST 请求时:

$  curl -X POST https://www.strava.com/api/v3/push_subscriptions \
      -F client_id=[MY-CLIENT-ID] \
      -F client_secret=[MY-CLIENT-SECRET] \
      -F 'callback_url=http://[MY-IP-ADDRESS]:8000/webhooks/example/' \
      -F 'verify_token=STRAVA'

我得到以下回复:

{
    "message": "Bad Request",
    "errors": [
        {
            "resource": "PushSubscription",
            "field": "callback url",
            "code": "not verifiable"
        }
    ]
}

有谁知道可能出了什么问题?


PS如果我能做些什么来使这个例子更具可重复性,请告诉我。我不太了解这个领域,不知道我是否遗漏了一些重要信息!
4

0 回答 0