2013-01-24 41 views
5

Tại sao tôi gặp phải lỗi này? và đây là cách tôi gọi API truyền trực tuyến.Twitter Truyền trực tuyến trên 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)) 

Có thể do GAE không cho phép ổ cắm, tôi không chắc chắn cách áp dụng cụm từ truy vấn để nhận các tweet được lọc cụ thể. Mục đích của tôi với phần mã này là nhận luồng trực tiếp với các từ khóa được chỉ định. Nếu có bất kỳ phương pháp thay thế, xin vui lòng hướng dẫn.

+0

Một số người cho biết Google không cho phép chúng tôi sử dụng ổ cắm trong GAE, có bất kỳ phương pháp thay thế nào với ví dụ hay không, vui lòng hướng dẫn. Cảm ơn – 1myb

Trả lời

3

Mở App Engine, httplib kết nối (và urllib) sẽ sử dụng URL Google lấy dịch vụ. URL Fetch service nghĩa là các máy chủ khác (không phải là phiên bản phục vụ công cụ ứng dụng) thực hiện yêu cầu và trả về phản hồi cho cá thể của ứng dụng, thay vì quá trình tự mở một ổ cắm.

Tôi tin rằng bạn đang nhận thấy rằng biến thể httplib chạy trên GAE không cung cấp thuộc tính sock được sử dụng để đặt thời gian chờ. Vấn đề cơ bản mặc dù là không có cách nào để có được một luồng, bạn sẽ không nhận được bất kỳ kết quả nào trở lại vào công cụ ứng dụng cho đến khi phản hồi hoàn tất. Tôi đã không thử nghiệm như thế nào nó không thành công, nhưng tôi hy vọng bạn sẽ nhận được một DeadlineExceededError từ dịch vụ URL như Twitter sẽ không đóng các phản ứng trực tuyến.

Hiện không có phương pháp thay thế nào để nhận luồng trên GAE. Nó có thể làm việc với hỗ trợ socket outbound trên backend. Hỗ trợ socket hiện chỉ khả dụng cho người thử nghiệm.

+0

cảm ơn trả lời. Tôi có thể biết làm cách nào để tôi có thể trở thành người kiểm tra của họ hoặc có được tài khoản người kiểm tra không? Bởi vì luồng là một phần của yêu cầu, đó là bắt buộc .. là có thực sự không có phương pháp thay thế để đạt được nó? – 1myb

+2

[Ở đây] (https://docs.google.com/spreadsheet/viewform?formkey=dF9QR3pnQ2pNa0dqalViSTZoenVkcHc6MQ#gid=0) là biểu mẫu đăng ký cho các ổ cắm đi. Như @tesdal cho biết, hiện không có cách nào để có kết nối lâu dài trên GAE. Tôi đã nhìn thấy các ứng dụng sử dụng UrlFetch'es đơn giản với thời hạn cao từ Hàng đợi nhiệm vụ, suy nghĩ. Nhưng ngay cả khi bạn làm cho nó hoạt động, nó vẫn chống lại các chính sách Stream API của Twitter. –

+0

Nếu bạn có thể xử lý luồng theo một cá thể đơn lẻ, bạn có thể xem xét chạy cá thể đó trên EC2 hoặc tương tự và giao tiếp với GAE. Phụ thuộc vào những gì bạn sẽ sử dụng dữ liệu cho. – tesdal

1

Tôi tin rằng GAE không hỗ trợ httplib.HTTPSConnection. Thay vào đó, hãy thử kết nối không an toàn bằng cách thêm tham số secure = False để các nhà xây dựng 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

không may mắn. vẫn có cùng một lợi nhuận cho HTTP Thuộc tínhError: Ví dụ về kết nối HTTPC không có thuộc tính 'sock' – 1myb

Các vấn đề liên quan