Tweepy: AttributeError: 'tuple' object has no attribute 'followed_by'
Tweepy: AttributeError: 'tuple' object has no attribute 'followed_by'
我正在尝试制作一个 "simple" 脚本,该脚本将使用 Python 3.5 的 Tweepy 模块取消关注我关注但未关注我的用户。
import sys, time, tweepy
auth = tweepy.OAuthHandler('Consumer Key', 'Consumer Secret')
auth.set_access_token('Access Token', 'Access Token Secret')
api = tweepy.API(auth)
for page in tweepy.Cursor(api.friends, screen_name='My Twitter Handle').pages():
for friend in page:
relationship = api.show_friendship(source_screen_name='My Twitter Handle', target_screen_name=friend.screen_name)
print(relationship.followed_by)
time.sleep(13)
print('\nDone.')
sys.exit()
目前,上述代码的目的是简单地打印出没有关注我的用户。执行代码时,Python 向我抛出这个:
AttributeError: 'tuple' object has no attribute 'followed_by'
我知道这不是真的,因为 Twitter 的文档提到了它 here。
但是,我不是专家,所以我在这里问这个问题。知道我做错了什么吗?
首先,如果你仔细阅读推特文档,原始 API returns {target: .., source: ..}, not {followed_by: .., ..}
.
其次,您正在使用 Tweepy,它是原始 API 的包装器。根据 Tweepy 文档,它 returns 一个 friendship
对象(http://tweepy.readthedocs.org/en/v3.2.0/api.html#API.show_friendship). However, it does not explain how we can use this object. Going to its source, https://github.com/tweepy/tweepy/blob/master/tweepy/models.py#L237,它 returns 一个元组 source, target
。
source
和 target
都有一个 followed_by
属性。我不确定您要查找的是哪一个,但您可以通过以下方式访问它们:
source, target = relationship
print(source.followed_by)
print(target.followed_by)
直接回答您的疑问和实现目标的替代方法(下)
对于较新版本的 Tweepy (3.5.0),show_friendship()
returns 两个元素的元组,每个元素属于每个用户.例如:
result = api.show_friendship(A, B)
result
Returns元组
(Friendship(blocked_by=False, muting=False,..., screen_name = A, ...), Friendship(blocked_by=False, muting=False,..., screen_name = B, ...)
然后如果你想访问属性 followed_by
只需执行以下操作:
result[0].followed_by
你会得到你想要的属性。
实现目标的替代方法:
如果您需要它来检查谁在关注您,谁没有关注您,发现它的一种简单方法是获取您关注的人和关注您的人之间的设置差异。为此,您可以应用我在下面提供的代码:
import tweepy
Consumer Key = 'XXXXXXXXXXXX'
ConsumerSecret = 'XXXXXXXXXXXX'
AccessToken = 'XXXXXXXXXXXX'
AccessTokenSecret = 'XXXXXXXXXXXX'
#Keys for the program
auth = tweepy.OAuthHandler(ConsumerKey, ConsumerSecret)
auth.set_access_token(AccessToken, AccessTokenSecret)
#Inialize the API:
api = tweepy.API(auth)
#Get your followers and friends:
friendNames, followNames = [], []
for friend, follower in zip(tweepy.Cursor(api.friends).items(),
tweepy.Cursor(api.followers).items()):
friendNames.append(friend.name)
followNames.append(follower.name)
#Create sets to see who is not following you:
friendset = set(friendNames)
followset = set(followNames)
not_fback = friendset.difference(followset)
并且变量 not_fback
将是一个包含所有未关注您的用户的集合。
@Jzbach 的代码有错误,for cicles 必须分开,因为你不可能拥有相同数量的关注者和好友。
使用这个补丁,脚本提取正确的子集
#Get your followers and friends:
friendNames, followNames = [], []
for friend in tweepy.Cursor(api.friends).items():
friendNames.append(friend.screen_name)
for follower in tweepy.Cursor(api.followers).items():
followNames.append(follower.screen_name)
您可以像下面这样更改代码。
而不是这个
print(relationship.followed_by)
使用这行代码:
print(relationship[0].followed_by)
我正在尝试制作一个 "simple" 脚本,该脚本将使用 Python 3.5 的 Tweepy 模块取消关注我关注但未关注我的用户。
import sys, time, tweepy
auth = tweepy.OAuthHandler('Consumer Key', 'Consumer Secret')
auth.set_access_token('Access Token', 'Access Token Secret')
api = tweepy.API(auth)
for page in tweepy.Cursor(api.friends, screen_name='My Twitter Handle').pages():
for friend in page:
relationship = api.show_friendship(source_screen_name='My Twitter Handle', target_screen_name=friend.screen_name)
print(relationship.followed_by)
time.sleep(13)
print('\nDone.')
sys.exit()
目前,上述代码的目的是简单地打印出没有关注我的用户。执行代码时,Python 向我抛出这个:
AttributeError: 'tuple' object has no attribute 'followed_by'
我知道这不是真的,因为 Twitter 的文档提到了它 here。
但是,我不是专家,所以我在这里问这个问题。知道我做错了什么吗?
首先,如果你仔细阅读推特文档,原始 API returns {target: .., source: ..}, not {followed_by: .., ..}
.
其次,您正在使用 Tweepy,它是原始 API 的包装器。根据 Tweepy 文档,它 returns 一个 friendship
对象(http://tweepy.readthedocs.org/en/v3.2.0/api.html#API.show_friendship). However, it does not explain how we can use this object. Going to its source, https://github.com/tweepy/tweepy/blob/master/tweepy/models.py#L237,它 returns 一个元组 source, target
。
source
和 target
都有一个 followed_by
属性。我不确定您要查找的是哪一个,但您可以通过以下方式访问它们:
source, target = relationship
print(source.followed_by)
print(target.followed_by)
直接回答您的疑问和实现目标的替代方法(下)
对于较新版本的 Tweepy (3.5.0),show_friendship()
returns 两个元素的元组,每个元素属于每个用户.例如:
result = api.show_friendship(A, B)
result
Returns元组
(Friendship(blocked_by=False, muting=False,..., screen_name = A, ...), Friendship(blocked_by=False, muting=False,..., screen_name = B, ...)
然后如果你想访问属性 followed_by
只需执行以下操作:
result[0].followed_by
你会得到你想要的属性。
实现目标的替代方法:
如果您需要它来检查谁在关注您,谁没有关注您,发现它的一种简单方法是获取您关注的人和关注您的人之间的设置差异。为此,您可以应用我在下面提供的代码:
import tweepy
Consumer Key = 'XXXXXXXXXXXX'
ConsumerSecret = 'XXXXXXXXXXXX'
AccessToken = 'XXXXXXXXXXXX'
AccessTokenSecret = 'XXXXXXXXXXXX'
#Keys for the program
auth = tweepy.OAuthHandler(ConsumerKey, ConsumerSecret)
auth.set_access_token(AccessToken, AccessTokenSecret)
#Inialize the API:
api = tweepy.API(auth)
#Get your followers and friends:
friendNames, followNames = [], []
for friend, follower in zip(tweepy.Cursor(api.friends).items(),
tweepy.Cursor(api.followers).items()):
friendNames.append(friend.name)
followNames.append(follower.name)
#Create sets to see who is not following you:
friendset = set(friendNames)
followset = set(followNames)
not_fback = friendset.difference(followset)
并且变量 not_fback
将是一个包含所有未关注您的用户的集合。
@Jzbach 的代码有错误,for cicles 必须分开,因为你不可能拥有相同数量的关注者和好友。
使用这个补丁,脚本提取正确的子集
#Get your followers and friends:
friendNames, followNames = [], []
for friend in tweepy.Cursor(api.friends).items():
friendNames.append(friend.screen_name)
for follower in tweepy.Cursor(api.followers).items():
followNames.append(follower.screen_name)
您可以像下面这样更改代码。
而不是这个
print(relationship.followed_by)
使用这行代码:
print(relationship[0].followed_by)