如何让Python的requests库等待Twitter API速率限制重置?
解决Requests调用Twitter API触发速率限制的问题
核心思路
Twitter API触发速率限制时会返回429 Too Many Requests状态码,同时响应头包含两个关键字段:
x-rate-limit-reset:限流重置的Unix时间戳(秒级)x-rate-limit-remaining:剩余可请求次数
我们可以通过检测429状态码,计算需要等待的时长,待限流重置后自动重试请求。
修改后的可运行代码
import requests import time def get_user_location(user_id): BEARER_TOKEN = "my_bearer_token" endpoint = f'https://api.twitter.com/2/users/{user_id}' headers = {'authorization': f'Bearer {BEARER_TOKEN}'} params = {'user.fields': 'location'} while True: response = requests.get(endpoint, params=params, headers=headers) # 处理速率限制 if response.status_code == 429: # 取限流重置时间,默认等待60秒(防止响应头缺失) reset_timestamp = int(response.headers.get('x-rate-limit-reset', time.time() + 60)) # 计算等待时长,加1秒确保完全过了限流期 wait_time = reset_timestamp - time.time() + 1 print(f"触发限流,等待{round(wait_time, 1)}秒后重试") time.sleep(wait_time) continue # 处理其他请求失败情况 if response.status_code != 200: print(f"请求失败,状态码:{response.status_code}") return None # 安全解析响应数据 try: user_data = response.json().get('data', {}) return user_data.get('location') except (ValueError, KeyError): print("响应数据解析出错") return None
关键细节说明
- 用
while True循环实现自动重试,直到请求成功或遇到不可恢复的错误 - 从响应头获取重置时间,额外加1秒等待是为了避免因网络延迟提前发起请求
- 增加了非200状态码的处理,避免程序因其他错误直接崩溃
- 用
try-except包裹JSON解析逻辑,防止响应格式异常导致报错
内容的提问来源于stack exchange,提问作者Been-H
相关产品推荐
相关产品推荐

