Использование Tweepy в python и его отслеживание заданным пользователем, но не выход из цикла - PullRequest
0 голосов
/ 31 января 2019

Принимает заданный идентификатор твита и будет пытаться подписаться на пользователя этого твита.Когда я проверяю твиттер, я вижу, что он успешно последовал за пользователем, но мой цикл 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()

Ответы [ 4 ]

0 голосов
/ 01 февраля 2019

Есть несколько проблем с этим.

Атрибут follow_request_sent объекта Пользователь , насколько я могу судить, недокументирован, но, кажется, только True, когдаВы отправили запрос на отслеживание в защищенную учетную запись, и соответствующий пользователь еще не принял его, поэтому даже если вы уже подписаны на пользователя, это будет False и не будет True прилюбая точка для учетной записи, которая не защищена.Это то, что вызывает бесконечный цикл.
Вместо этого вы должны использовать атрибут following, как вы сделали в своем ответе.Однако обратите внимание, что этот атрибут устарел, поэтому было бы разумно использовать вместо него API.show_friendship.
not также следует использовать вместо == False, если вы не ожидаете каких-либодругие ложные значения, которые я не думаю follow_request_sent возвращает и которые following определенно не возвращает.Обратите внимание, что following имеет значение NULL, что означает, что API Twitter может возвращать значение «NULL», но Tweepy преобразует его в False.

Вы также рекурсивно вызываете функцию.
Это, вместе с циклом, совершенно ненужно и очень плохая практика.

Поскольку у вас уже есть объект User, вам следует просто использовать его вспомогательную функцию follow вместо использования API.create_friendship.Это также устанавливает для атрибута following значение True, поэтому объект User будет обновляться.

Я не уверен, какова цель tweet = api.get_status(tweet.id), если tweet уже является объектом Status.Вы выполняете ненужный запрос API для получения того же объекта Status, который у вас уже есть.Вам не нужно обновлять объект Status следующим образом.

В вашем ответе у вас также есть id = tweet.retweeted_status.user.id.Обратите внимание, что это приведет к ошибке, если рассматриваемый статус не является ретвитом.Вы также следуете за автором исходного твита вместо ретвита и выполняете еще один ненужный запрос API, чтобы получить тот же объект пользователя, который у вас уже есть.

Примечание, @ Moshe Slavi ответ будет бесконечно повторяться, потому что counter не уменьшается и всегда равен 100, и оба ответа @Moshe Slavi и @ user15051990 * answer будут бесконечно повторяться, еслипользователь, за которым вы пытаетесь подписаться, не имеет защищенной учетной записи.

Для получения дополнительной информации см. мой ответ на GitHub .

0 голосов
/ 31 января 2019

Как @ Haroldo_OK предложил использовать if Я добавил счетчик:

def followUser(tweet): # Follows a user
    counter = 100
    while counter >= 0:
        tweet = api.get_status(tweet.id)
        # as [@harmon758][2] pointed out I forgot to subtract from the counter...
        counter -= 1
        if tweet.user.follow_request_sent == False:
            api.create_friendship(tweet.user.id)
            followUser(tweet)
            print("Successful follow")

Надеюсь, это поможет вам!

0 голосов
/ 01 февраля 2019

Это должно работать.Я выделил часть обновления, так как я звоню так же и в другие части программы.

def followUser(tweet):#Follows a user given a tweet id input
    id = tweet.retweeted_status.user.id
    if api.get_user(id).following == False:
        try:
            api.create_friendship(id)
            return followUser(refresh(tweet))
        except tweepy.TweepError as e:
            pass

def refresh(tweet):
    return api.get_status(tweet.id)
0 голосов
/ 31 января 2019

Попробуйте это:

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)
        break
    print("Successful follow")
...