Как я могу запретить моему боту Tweepy Twitter превышать ограничение скорости Twitter? - PullRequest
2 голосов
/ 02 апреля 2019

Мне трудно удержать моего бота в Твиттере от превышения ограничения скорости в Твиттере, и мне было интересно, могу ли я помочь с реализацией способа решения этой проблемы.

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)



Если бы кто-нибудь мог помочь мне разобраться с этой проблемой, это было бы очень признательно! Я создаю этого бота исключительно в образовательных целях.

...