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

如何让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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 01:08:28