You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python调用Strava API时遭遇401无效访问令牌认证错误

使用Python调用Strava API时遭遇401无效访问令牌认证错误

我太懂这种踩OAuth坑的挫败感了!看你的描述和错误日志,核心问题是你把Strava跳转回来的授权码(code)直接当成了访问令牌(access_token)——这俩完全不是一回事,Strava的OAuth2流程需要先拿授权码去换真正的访问令牌才行。

问题根源拆解

你从http://localhost/?state=&code=XXXXXXXXXXXXX里拿到的code只是一个临时授权凭证,不是可以直接用的access_token。Strava的API只认通过OAuth令牌交换接口拿到的正式access_token,直接用code自然会返回:

{"message":"Authorization Error","errors":[{"resource":"Athlete","field":"access_token","code":"invalid"}]}

解决步骤

1. 完成令牌交换,获取真正的access_token

你需要用拿到的code,搭配你的Strava应用的客户端ID和客户端密钥(在Strava开发者后台的应用详情里可以找到),发送POST请求到Strava的令牌交换接口:

import requests

# 替换成你自己的信息
CLIENT_ID = "你的客户端ID"
CLIENT_SECRET = "你的客户端密钥"
AUTH_CODE = "你从跳转URL里拿到的code"

response = requests.post(
    "https://www.strava.com/oauth/token",
    data={
        "client_id": CLIENT_ID,
        "client_secret": CLIENT_SECRET,
        "code": AUTH_CODE,
        "grant_type": "authorization_code"
    }
)

# 解析响应,拿到access_token
token_data = response.json()
print("获取到的令牌信息:")
print(token_data)
# 真正的access_token在这里
ACCESS_TOKEN = token_data["access_token"]

执行这段代码后,你会得到包含access_token、refresh_token和过期时间的JSON响应,把这个access_token填入你的原代码即可。

2. 修正原代码的参数错误

另外看你的原代码里,private、trainer、commute这些参数被设成了56,但Strava API要求这些是布尔值(1表示True,0表示False),错误的参数值也可能引发问题,一起修正:

from __future__ import print_function
import time
import strava_api_v3
from strava_api_v3.rest import ApiException
from pprint import pprint

# 替换成刚才拿到的真正的access_token
strava_api_v3.configuration.access_token = "你的正式access_token"

api_instance = strava_api_v3.ActivitiesApi()
name = 'Morning Run'  # 替换成你的活动名称
type = 'Run'  # 活动类型,比如Run/Ride等
start_date_local = '2025-06-18T08:00:00Z'  # ISO 8601格式的时间
elapsed_time = 1800  # 耗时,单位秒(比如30分钟)
description = 'My first Strava API activity'  # 活动描述(可选)
distance = 5000  # 距离,单位米(可选)
private = 1  # 1表示私有,0表示公开(可选)
trainer = 0  # 0表示非训练模式,1表示训练模式(可选)
commute = 0  # 0表示非通勤,1表示通勤(可选)

try:
    # 创建活动
    api_response = api_instance.create_activity(
        name, 
        type, 
        start_date_local, 
        elapsed_time, 
        description=description, 
        distance=distance, 
        private=private, 
        trainer=trainer, 
        commute=commute
    )
    pprint(api_response)
except ApiException as e:
    print("Exception when calling ActivitiesApi->create_activity: %s\n" % e)

额外提醒

  • access_token是有过期时间的(通常6小时),如果过期了,你可以用返回的refresh_token去重新获取新的access_token,不用再走一遍授权流程
  • 确保你的Strava应用申请的权限包含write或者activity:write,因为创建活动需要写权限,否则也会触发403或者401错误

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 08:52:59