第三方API Token每3天过期,如何实现永久有效?(附Python请求代码)
解决方案:自动管理Bearer Token,避免手动刷新
首先得明确核心逻辑:第三方API的Token过期机制是平台设定的,没法真的让Token“永久有效”,但可以通过自动刷新/重新生成Token来替代手动操作,实现无感知使用。
分两种场景处理
场景1:第三方API支持Refresh Token机制
这是最优方案,先去查API文档,看有没有获取Refresh Token的接口(一般首次获取Token时会同时返回Access Token和Refresh Token)。流程是:
- 首次手动获取一对Access Token(3天过期)和Refresh Token(有效期更长)
- 每次请求前检查Access Token是否即将过期,过期就用Refresh Token调用刷新接口,获取新的Access Token
示例代码
import requests import json from datetime import datetime, timedelta # 配置项,根据你的实际情况修改 TOKEN_STORE = "local_token.json" API_BASE = "你的第三方API基础地址" INITIAL_REFRESH_TOKEN = "首次手动获取的Refresh Token" def get_valid_token(): """加载或刷新有效Token""" try: # 读取本地存储的Token信息 with open(TOKEN_STORE, "r") as f: token_info = json.load(f) # 提前1小时刷新,避免刚好过期时请求失败 expire_time = datetime.fromisoformat(token_info["expire_time"]) if datetime.now() >= expire_time - timedelta(hours=1): return refresh_access_token() return token_info["access_token"] except (FileNotFoundError, KeyError): # 本地无存储或格式错误,直接刷新Token return refresh_access_token() def refresh_access_token(): """调用刷新接口获取新的Access Token""" refresh_url = f"{API_BASE}/refresh-token" # 替换为API实际的刷新接口 headers = { "Authorization": f"Bearer {INITIAL_REFRESH_TOKEN}" # 如果需要X-CSRFToken,这里也要加上对应的值 } resp = requests.post(refresh_url, headers=headers) resp.raise_for_status() # 请求失败时抛出异常,方便排查 new_token_data = resp.json() # 计算并存储新Token的过期时间 expire_time = datetime.now() + timedelta(seconds=new_token_data["expires_in"]) with open(TOKEN_STORE, "w") as f: json.dump({ "access_token": new_token_data["access_token"], "expire_time": expire_time.isoformat() }, f) return new_token_data["access_token"] def call_api(): """发起API请求,自动处理Token刷新""" valid_token = get_valid_token() headers = { 'X-CSRFToken': 'token', # 如果这个值也会过期,要同步处理刷新逻辑 'Authorization': f'Bearer {valid_token}' } url = '你的API请求地址' resp = requests.get(url, headers=headers, timeout=20) resp.raise_for_status() return resp.json() # 调用示例 if __name__ == "__main__": api_result = call_api() print(api_result)
场景2:第三方API不支持Refresh Token
如果平台没有刷新机制,只能定期自动调用Token生成接口来更新Token。比如每2天半自动跑一次生成逻辑,替换本地存储的Token。
示例代码
import requests import json from datetime import datetime, timedelta # 配置项修改为你的实际信息 TOKEN_STORE = "local_token.json" TOKEN_GENERATE_URL = "第三方API的Token生成接口地址" GENERATE_PARAMS = { "username": "你的账号", "password": "你的密码" # 或者其他生成Token需要的参数 } def get_valid_token(): """加载或重新生成有效Token""" try: with open(TOKEN_STORE, "r") as f: token_info = json.load(f) create_time = datetime.fromisoformat(token_info["create_time"]) # 3天过期,提前12小时重新生成 if datetime.now() >= create_time + timedelta(days=2, hours=12): return generate_new_token() return token_info["access_token"] except (FileNotFoundError, KeyError): return generate_new_token() def generate_new_token(): """调用生成接口获取新Token""" resp = requests.post(TOKEN_GENERATE_URL, data=GENERATE_PARAMS) resp.raise_for_status() new_token_data = resp.json() # 存储新Token和生成时间 with open(TOKEN_STORE, "w") as f: json.dump({ "access_token": new_token_data["access_token"], "create_time": datetime.now().isoformat() }, f) return new_token_data["access_token"] # 后续API请求逻辑和场景1一致 def call_api(): valid_token = get_valid_token() headers = { 'X-CSRFToken': 'token', 'Authorization': f'Bearer {valid_token}' } url = '你的API请求地址' resp = requests.get(url, headers=headers, timeout=20) resp.raise_for_status() return resp.json()
注意事项
- 存储Token的本地文件要做好权限控制,别泄露敏感信息
- 可以给刷新/生成Token的逻辑加重试机制,避免网络波动导致失败
- 如果
X-CSRFToken也会过期,要同步处理它的刷新逻辑 - 严格按照第三方API的调用规则来,别触发平台的限流或封禁机制
内容的提问来源于stack exchange,提问作者user10518674
相关产品推荐
相关产品推荐

