27

我无法从 Strava 的 api 文档中的 url 访问所有运动员活动(我自己的)。

我能够获得自己的年初至今统计数据:

https://www.strava.com/api/v3/athletes/XXXXXXXX/stats?access_token=ACCESSTOKEN

我可以获取我的个人资料信息:

https://www.strava.com/api/v3/athlete?access_token=ACCESSTOKEN

但是当我尝试进行所有活动时:

https://www.strava.com/api/v3/athlete/activities?access_token=ACCESSTOKEN

我收到以下错误:

{
    "message": "Authorization Error",
    "errors": [
        {
            "resource": "AccessToken",
             "field": "activity:read_permission",
             "code": "missing"
        }
    ]
}

我是否需要在 url 中的某处包含我的客户端 ID 或密钥?我已登录,所以不明白为什么我无法访问自己的信息。请指教

4

3 回答 3

34

2018 年 10 月 15 日,Strava 增强了授权流程,引入了新的范围列表。

您是否使用在https://www.strava.com/settings/api上找到的访问令牌?

这个令牌scope:read可能不足以做你想做的事(即你的活动是公开的还是私人的?)。

如果您需要具有不同范围的新令牌,则必须执行以下步骤

STEP 1:将用户重定向到 Strava 的授权页面:

https://www.strava.com/oauth/authorize?
    client_id=YOUR_CLIENT_ID&
    redirect_uri=YOUR_CALLBACK_DOMAIN&
    response_type=code&
    scope=YOUR_SCOPE

code第 2 步:从响应中读取参数:

http://YOUR_CALLBACK_DOMAIN/?
    state=&
    code=AUTHORIZATION_CODE_FROM_STRAVA&
    scope=YOUR_SCOPE

POST第 3 步:使用包含授权码的 a 请求新的访问令牌;您会access_token在 JSON 响应中找到新的。

https://www.strava.com/oauth/token?
    client_id=YOUR_CLIENT_ID&
    client_secret=YOUR_CLIENT_SECRET&
    code=AUTHORIZATION_CODE_FROM_STRAVA&
    grant_type=authorization_code

您可以在您的应用程序页面中找到客户端 ID、客户端密码和回调域。

您可以在本文档中找到新范围的列表。

如果您是唯一使用您的应用程序的人,您可以使用浏览器并http://localhost作为回调域手动执行前两个步骤。

于 2018-10-19T08:34:08.733 回答
11

我没有足够的积分来评论,但我最近确实做到了!

为了使其工作,您必须在步骤 1中设置scope=activity:read(而不是 ' ')。scope=read

于 2019-10-23T17:41:32.373 回答
1

Strava api 访问... 这个简短的 youtube 视频将引导您完成这些步骤。https://www.youtube.com/watch?v=sgscChKfGyg这里是 github 上的一个文本文件,它有相应的链接。 https://github.com/franchyze923/Code_From_Tutorials/blob/master/Strava_Api/request_links.txt

/// get a new access token because it changes. Step 3 in the text file
        var value = new Dictionary<string, string>
         {
            { "client_id", "abc" },
            { "client_secret", "defg" },
            { "refresh_token", "highlmnop" },
            { "grant_type", "refresh_token" }
         };

        var content = new FormUrlEncodedContent(value);
        var result = await client.PostAsync("https://www.strava.com/oauth/token", content);
        string resultContent = await result.Content.ReadAsStringAsync();
        var stravaDetails = JsonConvert.DeserializeObject<StravaRoot>(resultContent);
        // end get new access token


 public class StravaRoot
    {
        public string token_type { get; set; }
        public string access_token { get; set; }
        public int expires_at { get; set; }
        public int expires_in { get; set; }
        public string refresh_token { get; set; }
    }
于 2021-04-15T23:16:40.267 回答