2013-01-24 75 views
5

爲什麼我得到這個錯誤?這裏是我如何調用流媒體API。Twitter上的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)) 

大概到GAE引起不容許的插座,我不知道如何申請查詢檢索詞來獲得特定的過濾流的鳴叫。我使用這部分代碼的目的是通過指定關鍵字實現直播。如果有其他方法,請指導。

+0

有人說Google不允許我們在GAE中使用套接字,有沒有別的方法可以用例子來指導。謝謝 – 1myb

回答

3

在App Engine上,httplib的連接(和urllib的)將使用谷歌網址提取服務。 URL Fetch service表示其他服務器(不是應用引擎服務實例)執行請求並將響應返回給應用引擎實例,而不是進程本身打開套接字。

我相信你注意到在GAE上運行的httplib變體沒有提供用於設置超時的sock屬性。但根本問題在於無法獲取流,直到響應完成後,纔會將任何結果返回到應用程序引擎。我沒有測試它是如何失敗的,但我希望你會從URL服務中獲得DeadlineExceededError,因爲Twitter不會關閉流式響應。

目前沒有其他方法可以在GAE上獲取流。它可能在後端支持出站套接字。套接字支持目前僅供測試人員使用。

+0

感謝您的回覆。我可以知道我怎麼能成爲他們的測試人員或獲得測試人員帳戶?因爲流是需求的一部分,這是強制性的..是否真的沒有其他方法來實現它? – 1myb

+2

[這裏](https://docs.google.com/spreadsheet/viewform?formkey=dF9QR3pnQ2pNa0dqalViSTZoenVkcHc6MQ#gid=0)是出站套接字的註冊表單。 正如@tesdal所言,目前在GAE上無法建立長久的聯繫。我認爲應用程序使用簡單的UrlFetch's,並在Task Queue的截止日期很長的情況下使用。但即使你做到了這一點,也違背了Twitter的Stream API策略。 –

+0

如果您可以通過單個實例處理流,則可以考慮在EC2或類似環境中運行該實例,並與GAE進行通信。取決於你要使用哪些數據。 – tesdal

1

我相信GAE不支持httplib.HTTPSConnection。相反,嘗試通過將secure = False參數的構造函數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

沒有好運的傢伙。 HTTP 的返回值仍然相同AttributeError:HTTPConnection實例沒有屬性'sock' – 1myb