仅过滤 tweepy.Stream 中的原始推文

Filtering Only Original Tweets in a tweepy.Stream

我正在编写一个 Twitter 机器人,使用 Tweepy 来转发具有特定关键字的推文。

使用方法is_not_a_reply,我试图只转发那些不是对另一条推文的回复的推文。几乎 99% 的时间它都能正常工作,但很少有一些回复仍然被转发。

我真的不知道我的代码有什么问题!!!

import os
import tweepy
from dotenv import load_dotenv

# take environment variables from .env.
load_dotenv()

# get environment variables for Twitter API
consumer_key = os.environ.get("CONSUMER_KEY")
consumer_secret = os.environ.get("CONSUMER_SECRET")
access_token = os.environ.get("ACCESS_TOKEN")
access_token_secret = os.environ.get("ACCESS_TOKEN_SECRET")


def twitter_api_authenticate():
    auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
    auth.set_access_token(access_token, access_token_secret)
    return tweepy.API(auth, wait_on_rate_limit=True)


class MyStream(tweepy.Stream):
    def __init__(
        self, consumer_key, consumer_secret, access_token, access_token_secret
    ):
        super().__init__(
            consumer_key, consumer_secret, access_token, access_token_secret
        )
        self.twitterApi = twitter_api_authenticate()

    # when a new tweet is posted on Twitter with my filtered keywords
    def on_status(self, status):

        # If the found tweet is not a reply to another tweet
        if self.is_not_a_reply(status):

            # Retweet the found tweet (status)
            self.retweet(status)
            # Like the found tweet (status)
            self.like(status)

    def retweet(self, status):
        # Retweet the tweet
        self.twitterApi.retweet(status.id)

    def like(self, status):
        # Like the tweet
        self.twitterApi.create_favorite(status.id)

    def is_not_a_reply(self, status):
        if status.in_reply_to_status_id == None:
            return True
        else:
            return False


if __name__ == "__main__":

    trackList = ["Keyword1", "Keyword2"]

    stream = MyStream(
        consumer_key, consumer_secret, access_token, access_token_secret
    )
    stream.filter(track=trackList, languages=["fa"])

Tweepy version: 4.1.0
Python version: 3.8.10

我不完全确定问题出在哪里,但您始终可以尝试简化 is_not_a_reply 方法中的逻辑。对于调试,我还建议记录 status 对象和 in_reply_to_status_id 属性,例如。

def is_not_a_reply(self, status):
    return not status.in_reply_to_status_id

请注意,在原始版本中,您正在与 None 进行 == 比较,但如果您使用 IDE,它会建议您使用 is ] 和 is not,因为这是与 None 或布尔值进行比较的理想方式。在这种情况下,我刚刚更新它以处理任何“虚假”值,如 0 值或空列表 - 同样,这完全取决于类型 in_reply_to_status_id 来了。

我发现了我的错误。不需要的推文本身不是回复,而是回复的转发!

这是因为我对tweet object in Twitter API的理解不够。在 Twitter API 中转发回复不被视为回复本身。

所以我必须先检查过滤后的推文是否是“转推”,然后再检查它是否是“回复”。

根据rv.kvetch mentioned in his 点,我修改了is_not_a_reply方法如下:

    def is_not_a_reply(self, status):
        if hasattr(status, "retweeted_status"):
            # Check the original tweet if it was a retweet
            originalStatus = self.twitterApi.get_status(id=status.retweeted_status.id)
            return not originalStatus.in_reply_to_status_id
        else:
            # Check the tweet itself
            return not status.in_reply_to_status_id