Потоковое API с tweepy только возвращает второй последний твит, а НЕ сразу последний твит

Я новичок не только в Python, но и в программировании, поэтому я очень ценю вашу помощь!

Я пытаюсь фильтровать обнаружение всех твитов из потокового API Twitter, используя Tweepy.

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

HOWEVERкажется, что толькоsecond last Твит собирается в режиме реального времени, в отличие от самого последнего твита.

Ребята, вы можете помочь?

<code>import tweepy
import webbrowser
import time
import sys

consumer_key = 'xyz'
consumer_secret = 'zyx'


## Getting access key and secret
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth_url = auth.get_authorization_url()
print 'From your browser, please click AUTHORIZE APP and then copy the unique PIN: ' 
webbrowser.open(auth_url)
verifier = raw_input('PIN: ').strip()
auth.get_access_token(verifier)
access_key = auth.access_token.key
access_secret = auth.access_token.secret


## Authorizing account privileges
auth.set_access_token(access_key, access_secret)


## Get the local time
localtime = time.asctime( time.localtime(time.time()) )


## Status changes
api = tweepy.API(auth)
api.update_status('It worked - Current time is %s' % localtime)
print 'It worked - now go check your status!'


## Filtering the firehose
user = []
print 'Follow tweets from which user ID?'
handle = raw_input(">")
user.append(handle)

keywords = []
print 'What keywords do you want to track? Separate with commas.'
key = raw_input(">")
keywords.append(key)

class CustomStreamListener(tweepy.StreamListener):

    def on_status(self, status):

        # We'll simply print some values in a tab-delimited format
        # suitable for capturing to a flat file but you could opt 
        # store them elsewhere, retweet select statuses, etc.



        try:
            print "%s\t%s\t%s\t%s" % (status.text, 
                                      status.author.screen_name, 
                                      status.created_at, 
                                      status.source,)
        except Exception, e:
            print >> sys.stderr, 'Encountered Exception:', e
            pass

    def on_error(self, status_code):
        print >> sys.stderr, 'Encountered error with status code:', status_code
        return True # Don't kill the stream

    def on_timeout(self):
        print >> sys.stderr, 'Timeout...'
        return True # Don't kill the stream

# Create a streaming API and set a timeout value of ??? seconds.

streaming_api = tweepy.streaming.Stream(auth, CustomStreamListener(), timeout=None)

# Optionally filter the statuses you want to track by providing a list
# of users to "follow".

print >> sys.stderr, "Filtering public timeline for %s" % keywords

streaming_api.filter(follow=handle, track=keywords)
</code>

Ответы на вопрос(2)

-u (небуферизованный), чтобы предотвратить это.

Или вы можете принудительно очистить буфер, выполнивsys.stdout.flush() после вашего печатного заявления.

Увидетьэтот ответ для большего количества идей.

 snakesNbronies10 апр. 2012 г., 16:20
Спасибо! Я знал, что это было что-то незначительное.
Решение Вопроса

как запуск python без буферизации в моем случае, и я предполагаю, что он также не решил проблему оригинального постера. Проблема на самом деле в коде пакета tweepy в файле streaming.py и функции _read_loop (), который, я думаю, необходимо обновить, чтобы отразить изменения в формате, который Twitter выводит данные из своих потоковых API.

Решением для меня было загрузить новейший код для tweepy с github,https://github.com/tweepy/tweepy    в частности, файл streaming.py. Вы можете просмотреть изменения, которые были сделаны недавно, чтобы попытаться решить эту проблему в истории фиксации для этого файла.

Я изучил детали класса tweepy, и возникла проблема с тем, как класс streaming.py читает в потоке твита json. Я думаю, что это связано с тем, что твиттер обновляет свои потоковые API, чтобы включить количество бит входящего статуса. Короче говоря, здесь была функция, которую я заменил в streaming.py для решения этого вопроса.

def _read_loop(self, resp):

    while self.running and not resp.isclosed():

        # Note: keep-alive newlines might be inserted before each length value.
        # read until we get a digit...
        c = '\n'
        while c == '\n' and self.running and not resp.isclosed():
            c = resp.read(1)
        delimited_string = c

        # read rest of delimiter length..
        d = ''
        while d != '\n' and self.running and not resp.isclosed():
            d = resp.read(1)
            delimited_string += d

        try:
            int_to_read = int(delimited_string)
            next_status_obj = resp.read( int_to_read )
            # print 'status_object = %s' % next_status_obj
            self._data(next_status_obj)
        except ValueError:
            pass 

    if resp.isclosed():
        self.on_closed(resp)

Это решение также требует изучения, как загрузить исходный код для пакета tweepy, изменить его, а затем установить измененную библиотеку в python. Это можно сделать, перейдя в каталог tweepy верхнего уровня и напечатав что-то вроде sudo setup.py install в зависимости от вашей системы.

Я также прокомментировал кодировщикам на github этот пакет, чтобы они знали, что происходит.

 snakesNbronies17 июн. 2012 г., 23:26
@robbrit - спасибо! Я действительно ценю это. притяжение уже сделано?
 18 мая 2012 г., 15:30
Я разбудил их репо и вставил это исправление, просто ожидая запроса на извлечение. В настоящее время вы можете получить фиксированную версию здесь:github.com/robbrit/tweepy

Ваш ответ на вопрос