使用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
相关产品推荐
相关产品推荐

