我不想从头开始研究代码,而是想从输出开始,显示相关代码,然后然后问我的问题。
接收直接消息时,每15分钟限制为15 dm呼叫。每个developer.twitter
15分钟Windows
费率上限分为15分钟间隔。所有端点都需要身份验证,因此没有未经身份验证的呼叫和速率限制的概念。 最初有两个存储段可用于GET请求:每15分钟15个呼叫,每15分钟180个呼叫。
以下是显示我所在位置的输出
[D]irect Message Read Tries left: 300/300
[*] Exception | Hit rate limit. Waiting 15m before trying again | [{u'message': u'Rate limit exceeded.', u'code': 88}]
| 4.75m/15m complete | Attetmpt 2
要接收消息,请运行以下命令:
def make_dm(_count):
dm_obj = api.direct_messages(count=_count)
cr_at = []
for _m in dm_obj:
cr_at.append(str(_m.__dict__['created_at']))
return dm_obj,cr_at
make_dm(5)[0]
使接收错误变得有趣的是,我准备好了这两部分,可以防止我超出限制。首先在这里定义api,并显式设置它以等待速率限制
api = tweepy.API(auth, wait_on_rate_limit=True)
然后在这里,我捕获到输出中看到的速率限制异常,并等待超过15m的时间段,此时我对direct_messages()
可用的尝试次数应重新设置。
except tweepy.error.RateLimitError as e:
print '[*] Exception\t\t| Hit rate limit. Waiting 15m before trying again \t| {}'.format(e)
send_attempts += 1
counter = float(0)
while counter < 15.25:
time.sleep(15)
counter += .25
c = '\r | {}m/15m complete\t| Attetmpt {}'.format(counter,send_attempts)
sys.stdout.write(str('\r'+' '*60))
sys.stdout.flush()
sys.stdout.write(str(c))
sys.stdout.flush()
print
continue
在这里,while
循环的顶部是try语句,该语句获取直接消息资源值
while True:
os.system('cls')
res_left = api.rate_limit_status()['resources']['direct_messages']['/direct_messages']
print '\n[D]irect Message Read Tries left:\t{}/{}\n'.format(res_left['remaining'],res_left['limit'])
try:
[D]irect Message Read Tries left: 300/300
的来源。
我所说的所有问题是, 还有其他我可能错过的原因可以解释为什么出现限速例外吗?如果没有,那么我到目前为止显示的内容有问题吗?
我尝试阅读API文档并查看了类似的问题,但是它们似乎没有答案,或者对我而言没有用。
代码中未显示的是make_dm()
在15分钟的等待时间结束后被调用,并且 before 开始了循环。最初的direct_messages会预先加载,然后会侦听任何新内容。在等待期过后再次调用它以刷新结果(无论结果如何都存在等待),并且在15分钟之前再次运行循环时,它的确显示剩余的GET调用减少了。
没有包括try:
中的任何内容,因为它所做的只是与dm_obj
进行交互,但自身不会进行任何GET
调用
更新 我将其运行了一个小时,并得到一个指示,表明它不再收到错误。我不确定是什么问题,但这是一个大约6个小时的问题。