首页 > 解决方案 > 在 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()

标签: pythontweepy

解决方案


这有多个问题。

据我所知,User 对象follow_request_sent属性没有记录,但似乎只有当您向受保护帐户发送关注请求并且相关用户尚未接受它时,即使您已经在关注用户,这将是并且对于不受保护的帐户在任何时候都不会。这就是导致无限循环的原因。 相反,您应该像在答案中那样使用该属性。但是,请注意,此属性已被弃用,因此使用它可能是谨慎的。如果您不期望任何其他虚假值,也应该使用它来代替,我认为这些值不会返回并且TrueFalseTrue
followingAPI.show_friendship
not== Falsefollow_request_sentfollowing绝对不回来。注意,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 counterSlavi 的答案和@user15051990答案都将无限递归帐户。

有关更多信息,请参阅我在 GitHub 上的回复


推荐阅读