本文目录导读:

是的,脚本完全可以自动刷新API令牌,这是现代API交互中的常见做法,主要通过以下几种方式实现:
常见的自动刷新策略
使用刷新令牌(Refresh Token)
import requests
import time
class TokenManager:
def __init__(self, client_id, client_secret, refresh_token):
self.client_id = client_id
self.client_secret = client_secret
self.refresh_token = refresh_token
self.access_token = None
self.expires_at = 0
def get_valid_token(self):
if time.time() >= self.expires_at:
self.refresh_access_token()
return self.access_token
def refresh_access_token(self):
response = requests.post('https://api.example.com/oauth/token', {
'grant_type': 'refresh_token',
'refresh_token': self.refresh_token,
'client_id': self.client_id,
'client_secret': self.client_secret
})
data = response.json()
self.access_token = data['access_token']
# 设置过期时间(提前5分钟刷新)
self.expires_at = time.time() + data['expires_in'] - 300
定时刷新模式
import schedule
import threading
def refresh_token_job():
# 刷新令牌的逻辑
print("令牌已自动刷新")
# 每小时刷新一次
schedule.every(1).hours.do(refresh_token_job)
# 在后台运行
def run_schedule():
while True:
schedule.run_pending()
time.sleep(60)
thread = threading.Thread(target=run_schedule)
thread.start()
请求拦截器模式(适用于频繁请求)
import requests
from requests.adapters import HTTPAdapter
class AutoRefreshAdapter(HTTPAdapter):
def send(self, request, **kwargs):
response = super().send(request, **kwargs)
if response.status_code == 401: # 令牌过期
# 自动刷新令牌
new_token = refresh_token()
request.headers['Authorization'] = f'Bearer {new_token}'
# 重试请求
response = super().send(request, **kwargs)
return response
实际应用示例(GitHub API)
import requests
import base64
import json
from datetime import datetime, timedelta
class GitHubTokenRefresher:
def __init__(self, app_id, private_key):
self.app_id = app_id
self.private_key = private_key
self.jwt_token = None
self.installation_token = None
self.token_expires = datetime.now()
def get_installation_token(self):
if datetime.now() >= self.token_expires:
# 生成新的JWT
jwt = self._generate_jwt()
# 获取安装令牌
response = requests.post(
'https://api.github.com/app/installations/{installation_id}/access_tokens',
headers={'Authorization': f'Bearer {jwt}'}
)
data = response.json()
self.installation_token = data['token']
# 设置过期时间(提前10分钟刷新)
self.token_expires = datetime.now() + timedelta(seconds=data['expires_in'] - 600)
return self.installation_token
def make_authenticated_request(self, url):
token = self.get_installation_token()
response = requests.get(url, headers={'Authorization': f'Bearer {token}'})
return response
关键要点
- 存储安全:敏感令牌应加密存储,避免硬编码
- 状态监控:记录令牌状态,避免无效请求
- 重试机制:失败时应有重试策略
- 并发处理:多线程环境下注意令牌的并发更新
- 提前刷新:建议在过期前几分钟就刷新,避免服务中断
最佳实践
- 使用 装饰器模式 包装API调用函数
- 集成主动监控,记录令牌刷新频率和成功/失败情况
- 实现降级策略,当刷新失败时如何处理
- 使用本地缓存记录令牌状态
这样的脚本可以显著提升API调用的稳定性和自动化程度,避免因令牌过期导致的服务中断,需要针对具体的API认证机制选择合适的实现方式。