仅过滤 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
我正在编写一个 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