Мне трудно удержать моего бота в Твиттере от превышения ограничения скорости в Твиттере, и мне было интересно, могу ли я помочь с реализацией способа решения этой проблемы.
API Tweepy и многие поисковые запросы в Google рекомендуют использовать функцию 'def limit_handled (курсор)', чтобы ограничить это.
# Prevents sending too many requests to Twitter's servers
def limit_handled(cursor):
while True:
try:
yield cursor.next()
except tweepy.RateLimitError:
time.sleep(15 * 60)
Итак, как я решил реализовать это, изменив
search_results = api.search(q="#henny",count=10000,
lang="en",
since_id=last_seen_id,tweet_mode='extended')
до
search_results = limit_handled(tweepy.Cursor(api.search,q="#henny",count=10000,
lang="en", since_id=last_seen_id,tweet_mode='extended').items())
Использование tweepy.Cursor, казалось, было единственным способом использования функции limit_handled, потому что для этой функции нужен курсор в качестве ввода. Из этой реализации возникли две проблемы:
1.)
Я получил эту ошибку:
Traceback (most recent call last):
File "henny_twitter_bot.py", line 39, in limit_handled
yield cursor.next()
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/tweepy/cursor.py", line 197, in next
self.current_page = self.page_iterator.next()
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/tweepy/cursor.py", line 134, in next
raise StopIteration
StopIteration
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "henny_twitter_bot.py", line 84, in <module>
respond_to_search(search_results, tweet_list)
File "henny_twitter_bot.py", line 60, in respond_to_search
for result in search_results:
RuntimeError: generator raised StopIteration
Может быть, эта ошибка была тем, что я искал? Когда я запустил код таким образом и вошел в свой Твиттер, я не получил уведомление о том, что я спамил их серверы, как при первом запуске этой программы, не учитывая ограничение скорости.
2.)
Похоже, что программа больше не обращает внимания на мою переменную 'last_seen_id', которая не позволяет моей программе отправлять повторяющиеся ответы.
Вот мой код:
CONSUMER_KEY = config.CONSUMER_KEY
CONSUMER_SECRET = config.CONSUMER_SECRET
ACCESS_KEY = config.ACCESS_KEY
ACCESS_SECRET = config.ACCESS_SECRET
# Twitter authorization
auth = tweepy.OAuthHandler(CONSUMER_KEY,CONSUMER_SECRET)
auth.set_access_token(ACCESS_KEY, ACCESS_SECRET)
api = tweepy.API(auth,wait_on_rate_limit = True)
FILE_NAME = 'last_seen_id.txt'
# Methods for updating the last seen tweet to prevent duplicate posts
def retrieve_last_seen_id(file_name):
f_read = open(file_name, 'r')
last_seen_id = int(f_read.read().strip())
f_read.close()
return last_seen_id
def store_last_seen_id(last_seen_id, file_name):
f_write = open(file_name, 'w')
f_write.write(str(last_seen_id))
f_write.close()
return
# Prevents sending too many requests to Twitter's servers
def limit_handled(cursor):
while True:
try:
yield cursor.next()
except tweepy.RateLimitError:
time.sleep(15 * 60)
last_seen_id = retrieve_last_seen_id(FILE_NAME)
# Create list of tweets
tweet_list = []
tweet_list.append("Follow me for a free bottle of henny! Hit my DMs!")
tweet_list.append("Want a free bottle of henny?? Follow my account and shoot me a DM!")
tweet_list.append("Free bottle of henny to the next 50 people that follow me!")
# Search Twitter for tweets including keyword
search_results = api.search(q="#henny",count=10000,
lang="en",
since_id=last_seen_id,tweet_mode='extended')
def respond_to_search(search_results, tweet_list):
# Loops through resulting tweets
for result in reversed(search_results):
# Chooses random tweet from list
tweet = random.choice(tweet_list)
# Prints
print(result.id)
print("HENNY BOT INITIATED")
# Posts resulting tweets and shows what the bot will tweet
print("@" + result.user.screen_name + ": '" + result.full_text + "'")
print("@TheDJHenny: '@" + result.user.screen_name + " " + tweet + "'\n")
# Updated last_seen_id to prevent responding to the same tweet
last_seen_id = result.id
store_last_seen_id(last_seen_id, FILE_NAME)
# Posts Tweet
api.update_status('@' + result.user.screen_name +
" " + random.choice(tweet_list), result.id)
return None
# Runs function
respond_to_search(search_results, tweet_list)
Если бы кто-нибудь мог помочь мне разобраться с этой проблемой, это было бы очень признательно! Я создаю этого бота исключительно в образовательных целях.