python - 在 python 中使用 Tweepy 及其跟随给定用户但不退出循环
问题描述
获取给定的推文 ID,并将尝试关注该推文的用户。当我查看 twitter 时,我可以看到它已成功关注用户,但我的 while 循环永远不会退出。(这一切都在控制台中)
def followUser(tweet):#Follows a user
tweet = api.get_status(tweet.id)
while tweet.user.follow_request_sent == False:
api.create_friendship(tweet.user.id)
followUser(tweet)
print("Successful follow")
这是我 ctrl-c 时的错误消息
File "<stdin>", line 2, in followUser
File "/home/user1/.local/lib/python2.7/site-packages/tweepy/binder.py", line 250, in _call
return method.execute()
File "/home/user1/.local/lib/python2.7/site-packages/tweepy/binder.py", line 190, in execute
proxies=self.api.proxy)
File "/home/user1/.local/lib/python2.7/site-packages/requests/sessions.py", line 533, in request
resp = self.send(prep, **send_kwargs)
File "/home/user1/.local/lib/python2.7/site-packages/requests/sessions.py", line 646, in send
r = adapter.send(request, **kwargs)
File "/home/user1/.local/lib/python2.7/site-packages/requests/adapters.py", line 449, in send
timeout=timeout
File "/home/user1/.local/lib/python2.7/site-packages/urllib3/connectionpool.py", line 600, in urlopen
chunked=chunked)
File "/home/user1/.local/lib/python2.7/site-packages/urllib3/connectionpool.py", line 343, in _make_request
self._validate_conn(conn)
File "/home/user1/.local/lib/python2.7/site-packages/urllib3/connectionpool.py", line 839, in _validate_conn
conn.connect()
File "/home/user1/.local/lib/python2.7/site-packages/urllib3/connection.py", line 344, in connect
ssl_context=context)
File "/home/user1/.local/lib/python2.7/site-packages/urllib3/util/ssl_.py", line 344, in ssl_wrap_socket
return context.wrap_socket(sock, server_hostname=server_hostname)
File "/usr/lib/python2.7/ssl.py", line 369, in wrap_socket
_context=self)
File "/usr/lib/python2.7/ssl.py", line 617, in __init__
self.do_handshake()
File "/usr/lib/python2.7/ssl.py", line 846, in do_handshake
self._sslobj.do_handshake()
解决方案
这有多个问题。
据我所知,User 对象的follow_request_sent
属性没有记录,但似乎只有当您向受保护帐户发送关注请求并且相关用户尚未接受它时,即使您已经在关注用户,这将是并且对于不受保护的帐户在任何时候都不会。这就是导致无限循环的原因。
相反,您应该像在答案中那样使用该属性。但是,请注意,此属性已被弃用,因此使用它可能是谨慎的。如果您不期望任何其他虚假值,也应该使用它来代替,我认为这些值不会返回并且True
False
True
following
API.show_friendship
not
== False
follow_request_sent
following
绝对不回来。注意,following
可以为空,这意味着 Twitter 的 API 可以返回“null”,但Tweepy 会将其转换为False
.
您还递归地调用该函数。
这与循环一起是完全不必要的,也是非常糟糕的做法。
由于您已经拥有 User 对象,因此您应该只使用它的follow
辅助函数而不是使用API.create_friendship
. 这也将following
属性设置为True
,因此 User 对象将保持更新。
我不确定tweet = api.get_status(tweet.id)
如果tweet
已经是 Status 对象的目的是什么。您正在执行不必要的 API 请求以获取您已有的相同状态对象。您不需要像这样刷新 Status 对象。
在您的回答中,您也有id = tweet.retweeted_status.user.id
. 请注意,如果相关状态不是转推,这将出错。您还关注原始推文的作者而不是转推,并执行另一个不必要的 API 请求以获取您已经拥有的相同用户对象。
请注意,@Moshe Slavi的答案将无限循环,因为它不会递减并且始终为 100,如果您尝试关注的用户没有受保护,@Moshe counter
Slavi 的答案和@user15051990的答案都将无限递归帐户。
有关更多信息,请参阅我在 GitHub 上的回复。
推荐阅读
- python - 为什么我会收到“AttributeError:'NoneType'对象没有属性”?
- c# - 从具有只读值的抽象类调用构造函数
- php - 为php上传文件脚本添加条件
- amazon-web-services - 在 Apache Velocity 模板语言中附加字符串变量
- javascript - JavaScript 对象的键是否存储在内存中?
- email - 如何强制用户注册使用工作电子邮件?
- c# - 当 CultureInfo 设置为其他语言时,字符串未被识别为有效日期时间
- python - Heroku 构建成功但部署失败
- spring - Spring Boot 调用 Spring Batch Job
- android - 在 Android APK 文件上处理手机架构和处理器类型