Python 未捕获Twitter V2 API 429 HTTP错误 背景和代码

Python 未捕获Twitter V2 API 429 HTTP错误 背景和代码,python,twitterapi-python,Python,Twitterapi Python,我有下面的函数来处理Twitter V2 API中基于的速率限制 从日期时间导入日期时间 从osometweet.utils导入暂停直到 def管理费率限制(响应): “”“管理Twitter V2速率限制 此方法在查询后接收“requests”响应对象 Twitter并使用标题[“x-rate-limit-remaining”]和 headers[“x-rate-limit-reset”]用于管理Twitter的 最常见的、与时间相关的HTTP错误。 维基参考:https://github.c

我有下面的函数来处理Twitter V2 API中基于的速率限制

从日期时间导入日期时间
从osometweet.utils导入暂停直到
def管理费率限制(响应):
“”“管理Twitter V2速率限制
此方法在查询后接收“requests”响应对象
Twitter并使用标题[“x-rate-limit-remaining”]和
headers[“x-rate-limit-reset”]用于管理Twitter的
最常见的、与时间相关的HTTP错误。
维基参考:https://github.com/osome-iu/osometweet/wiki/Info:-HTTP状态代码和错误
推特参考:https://developer.twitter.com/en/support/twitter-api/error-troubleshooting
"""
尽管如此:
#x-rate-limit-remaining参数并不总是存在。
#如果是,我们想使用它。
尝试:
#使用令牌获取剩余的请求数
剩余的请求=int(response.headers[“x-rate-limit-remaining”])
#如果这个数字是1,我们得到重置时间
#然后再等15秒(欢迎你的Twitter)。
#下面还捕获了常规429异常,
#然而,我们希望在可能的情况下进行防御计划。
如果剩余的_请求==1:
缓冲区等待时间=15
resume\u time=datetime.fromtimestamp(int(response.headers[“x-rate-limit-reset”])+缓冲区等待时间)
打印(f“速率受限的一个请求。正在Twitter上等待。\n\t使用时间:{resume\u Time}”)
暂停直到(恢复时间)
例外情况除外,如e:
打印(“可能缺少x速率限制-*参数…”)
打印(e)
#显式检查与时间相关的错误。
#大多数错误都可以通过等待来解决
#过了一会儿,我们又在推特上发ping——我们就是这么做的。
if response.status_代码!=200:
#错误请求太多
如果response.status_code==429:
缓冲区等待时间=15
resume\u time=datetime.fromtimestamp(int(response.headers[“x-rate-limit-reset”])+缓冲区等待时间)
打印(f“请求太多。正在Twitter上等待。\n\t暂停时间:{resume\u Time}”)
暂停直到(恢复时间)
#Twitter内部服务器错误
elif response.status_code==500:
#推特需要休息,所以我们等30秒
resume_time=datetime.now().timestamp()+30
打印(f“内部服务器错误@Twitter.Giving Twitter暂停…\n\t暂停时间:{resume\u Time}”)
暂停直到(恢复时间)
#Twitter服务不可用错误
elif response.status_code==503:
#推特需要休息,所以我们等30秒
resume_time=datetime.now().timestamp()+30
打印(f“推特服务不可用。请暂停推特…\n\t暂停时间:{resume\u Time}”)
暂停直到(恢复时间)
#如果我们走到这一步,我们做错了什么,应该退出
引发异常(
请求返回错误:{}{}(
response.status_代码,response.text
)
)
#每次我们得到一个200响应时,退出函数并返回响应对象
如果response.ok:
返回响应
此函数由
请求
调用提供一个响应对象,如下所示

response=requests.get(
网址,
页眉=自身。\页眉,
参数=有效载荷
)
响应=管理费率限制(响应)
在上述响应调用中,参数如下所示:

在哪里

  • url
    =Twitter的基本端点url(在本例中,它是完整的学术搜索存档)
  • params
    /
    payload
    =端点搜索运算符的组合(这些运算符应该是无关的,但如有必要,我可以包括在内)
  • headers
    /
    self.\u-bearer\u-token
    是一个用户
    bearer\u-token
    ,其格式如下所示
self.\u头={“授权”:f“承载者{MY\u承载者{u令牌}”
问题与错误: 使用上面的代码,我得到一个长时间运行的脚本,它从
rate\u limit\u manager
函数返回以下错误

回溯(最近一次呼叫最后一次):
文件“/scratch/mdeverna/Superspreaders/src/get_rts_of_user.py”,第218行,在get_rts_of_user.py中
完整存档搜索=真
文件“/nfs/nfs5/home/scratch/mdeverna/osometweet/osometweet/api.py”,第248行,搜索中
response=self.\u oauth.make\u请求(url,有效负载)
文件“/nfs/nfs5/home/scratch/mdeverna/osometweet/osometweet/oauth.py”,在make_请求中的第181行
响应=管理费率限制(响应)
文件“/nfs/nfs5/home/scratch/mdeverna/osometweet/osometweet/rate\u limit\u manager.py”,第67行,在manage\u rate\u limits中
response.status_代码,response.text
异常:请求返回错误:429{“title”:“请求太多”,“type”:“about:blank”,“status”:429,“detail”:“请求太多”}
我不明白的是打印此异常的行是

# If we get this far, we've done something wrong and should exit
raise Exception(
    "Request returned an error: {} {}".format(
        response.status_code, response.text
         )
。。。这说明了
响应。status_code
打印(equals)
429
,但是,该函数前面的条件语句检查的正是该状态代码,但似乎没有找到它。这似乎是一种检查状态代码=429是否被跳过的条件,只是在下面打印状态代码为429


这里发生了什么?

即使状态代码是429、500或503,您也将从if/elif/elif序列的底部流出,并直接进入
上升
。您是否打算在每次结束时
返回
?还是你的意思是加薪<