Tweepy ответ на последний твит идет в цикле - PullRequest
0 голосов
/ 29 мая 2018

У меня есть следующий код, где я запускаю поток для пользователя, и когда он делает новый твит, я хочу сделать 3 ответа на этот твит, по порядку.Тем не менее, бот работает нормально, он находит последний твит и начинает отвечать как сумасшедший, случайно, без остановки.Что я делаю не так?

class MyStreamListener(StreamListener):

    def on_data(self, data):
        ### here i get the statusid from json
        ### I have 3 replies in messages.txt which i want to reply 1 by 1 to the latest tweet (statusid)
        file = open("messages.txt", "r")
        content = file.readlines()
        for line in content:
            api.update_status(line, statusid)

    def on_error(self, status):
        print(status)

if __name__ == '__main__':
    listener = MyStreamListener()
    twitterStream = Stream(auth, listener)
    twitterStream.filter(follow=['xxxx'])

Спасибо!

Ответы [ 2 ]

0 голосов
/ 17 ноября 2018

Причина цикла заключается в том, что поток 'follow' возвращает все ответы последующему пользователю (а также ретвиты пользователя и от пользователя), поэтому вам необходимо исключить их, прежде чем переходить к строкам ответа.См. Твиттерскую документацию.

Например, если вы используете on_data() вместо on_status(), отметьте этот from_creator(), прежде чем переходить к остальной функции on_status() (обратите внимание, чтоon_status() возвращает удаления и т. Д., Что приведет к ошибке в этой функции, поэтому обрабатывайте ее соответствующим образом):

def from_creator(status):
    status = json.loads(status)
    if "retweeted_status" in status:
        return False
    elif status["in_reply_to_status_id"] != None:
        return False
    elif status["in_reply_to_screen_name"] != None:
        return False
    elif status["in_reply_to_user_id"] != None:
        return False
    else:
        # status is an origin Tweet by the followed user!
        return True

При использовании on_status() это будет:

def from_creator(status):
    if hasattr(status, 'retweeted_status'):
        return False
    elif status.in_reply_to_status_id != None:
        return False
    elif status.in_reply_to_screen_name != None:
        return False
    elif status.in_reply_to_user_id != None:
        return False
    else:
        # status is an origin Tweet by the followed user!
        return True
0 голосов
/ 29 мая 2018

Совет: чтобы правильно ответить, вы должны указать пользователя в начале ответа.Вот полный код:

import tweepy

class MyStreamListener(tweepy.StreamListener):

    def on_status(self, status):
        file = open("messages.txt", "r")
        content = file.readlines()
        for line in content:
            print("answering @" + status.user.screen_name + " tweetID " + status.id_str + " with : " + line.rstrip())
            api.update_status(status="@" + status.user.screen_name + " " + line, in_reply_to_status_id=status.id)            

consumer_key = '***'
consumer_secret = '***'
access_token = '***'
access_token_secret = '***'

auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
api = tweepy.API(auth)
myStream = tweepy.Stream(auth, MyStreamListener())
myStream.filter(follow=['xxx'])
...