2013-01-24 14 views
5

Dlaczego otrzymuję ten błąd? i oto jak nazywam streaming API.Twitter Streaming na GAE

import tweepy 
import sys 

creds = json.loads(open('credential.json').read()) 
tw_consumer_key = creds['tw_consumer_key'] 
tw_consumer_secret = creds['tw_consumer_secret'] 
tw_access_token = creds['tw_access_token'] 
tw_access_token_secret = creds['tw_access_token_secret'] 

try: 
    auth = tweepy.OAuthHandler(tw_consumer_key, tw_consumer_secret) 
    auth.set_access_token(tw_access_token, tw_access_token_secret) 
    api = tweepy.API(auth) 
except Exception: 
    service = None 
    api = None  

# Query terms 
Q = "Better" 

class CustomStreamListener(tweepy.StreamListener): 
    def on_status(self, status): 
     try: 
      print "%s\n%s\n%s\n%s\n\n" % (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 



class LiveStream(webapp2.RequestHandler): 
    def get(self): 
     streaming_api = tweepy.streaming.Stream(auth, CustomStreamListener(), timeout=60) 
     self.response.out.write(streaming_api.filter(track=Q)) 

Prawdopodobnie przyczyną przez GAE nie wolno gniazdo, nie jestem pewien, jak zastosować termin zapytania, aby uzyskać konkretne filtrowane tweets strumieniowych. Moim celem w tej części kodu jest uzyskanie transmisji na żywo za pomocą oznaczonych słów kluczowych. Jeśli istnieją jakieś alternatywne metody, prosimy o przypomnienie.

+0

Niektórzy mówili, że Google nie pozwala nam używać gniazda w GAE, czy jest jakaś alternatywna metoda z przykładem, proszę przypomnienie. Dzięki – 1myb

Odpowiedz

3

w App Engine, httplib połączenia (i urllib) używa Google URL pobrać usługę. URL Fetch service oznacza, że ​​inne serwery (a nie instancja obsługująca mechanizm aplikacji) wykonują żądanie i zwracają odpowiedź do instancji mechanizmu aplikacji, zamiast do samego procesu otwierania gniazda.

Wydaje mi się, że zauważyłeś, że wariant httplib działający na GAE nie zapewnia atrybutu skarpet używanego do ustawiania limitu czasu. Podstawowym problemem jest jednak to, że nie ma sposobu, aby uzyskać strumień, nie otrzymasz żadnych wyników z powrotem do silnika aplikacji, dopóki odpowiedź nie zostanie zakończona. Nie testowałem, jak to się nie powiedzie, ale spodziewam się, że otrzymasz Deadline ExceedError z usługi URL, ponieważ Twitter nie zamknie odpowiedzi strumieniowej.

W tej chwili nie ma alternatywnych metod uzyskiwania strumienia na GAE. Może działać z obsługą gniazd wychodzących na zapleczu. Obsługa gniazd jest obecnie dostępna tylko dla testerów.

+0

dzięki za odpowiedź. Czy mogę wiedzieć, w jaki sposób mogę być ich testerem lub uzyskać konto testera? Ponieważ strumień jest częścią wymagań, co jest obowiązkowe. Czy naprawdę nie ma innej metody, aby to osiągnąć? – 1myb

+2

[tutaj] (https://docs.google.com/spreadsheet/viewform?formkey=dF9QR3pnQ2pNa0dqalViSTZoenVkcHc6MQ#gid=0) formularz rejestracyjny dla gniazd wychodzących. Jak powiedział @tesdal, obecnie nie ma sposobu na utrzymywanie długotrwałych powiązań na GAE. Widziałem aplikacje korzystające z prostych UrlFetch'ów z wysokimi terminami z kolejki zadań, pomyślał. Ale nawet jeśli sprawisz, że zadziała, będzie to niezgodne z zasadami usługi Twitter API na Twitterze. –

+0

Jeśli będziesz w stanie obsłużyć strumień przez pojedynczą instancję, możesz rozważyć uruchomienie tej instancji na EC2 lub podobnej i komunikowanie się z GAE. Zależy od tego, do czego będziesz używać danych. – tesdal

1

Uważam, że GAE nie obsługuje protokołu httplib.HTTPSConnection. Zamiast tego, spróbuj niezabezpieczonych połączeń przez dodanie parametru secure = False do konstruktora Stream:

class LiveStream(webapp2.RequestHandler): 
    def get(self): 
     streaming_api = tweepy.streaming.Stream(auth, CustomStreamListener(), timeout=60, secure=False) 
     self.response.out.write(streaming_api.filter(track=Q)) 
+0

nie koleś szczęścia. nadal ten sam zwrot dla HTTP AttributeError: instancja HTTPConnection nie ma atrybutu "skarpety" – 1myb