【问题标题】:Tweepy reply to latest tweet goes in a loop对最新推文的 Tweepy 回复进入循环
【发布时间】:2018-11-08 08:55:54
【问题描述】:

我有以下代码,我在其中开始向用户发送流,当他发布新推文时,我想按顺序对该推文进行 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'])

谢谢!

【问题讨论】:

  • 使用 print(statusid) 检查 statusid,因为从您的代码中,它来自任何地方。两者都不是:api。

标签: python api twitter streaming tweepy


【解决方案1】:

提示:您必须在答案的开头提及用户才能正确回复。这是完整的代码:

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'])

【讨论】:

  • 代码可以工作,但它仍然会循环并发布,直到您停止机器人。
  • 问题是机器人也会回复自己的回复,这就是它进入循环的方式
【解决方案2】:

循环的原因是“关注”流将所有回复返回给关注的用户(以及用户的转发和转发),因此您需要在继续回复行之前排除这些回复。见Twitter Documentation.

例如,如果使用on_data() 而不是on_status(),请在继续使用on_status() 函数的其余部分之前检查此from_creator()(注意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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-28
    • 2012-03-08
    • 2016-11-04
    • 2021-07-25
    • 2016-10-20
    • 1970-01-01
    相关资源
    最近更新 更多