pycurl - python throwing an error HTTP 401 while accessing https://stream.twitter.com/1.1/statuses/filter.json -
this code running stream of tweets using streaming api accessing stream.twitter url mentioned in title. throwing error (http error 401) in code trying track multiple terms
import time import pycurl import urllib import json import oauth2 api_endpoint_url = 'https://stream.twitter.com/1.1/statuses/filter.json' user_agent = 'twitterstream 1.0' oauth_keys = {'consumer_key': 'abc', 'consumer_secret': 'abc', 'access_token_key': 'abc', 'access_token_secret': 'abc'} post_params = {'include_entities': 0, 'stall_warning': 'true', 'track': 'iphone,ipad,ipod'} class twitterstream(): def __init__(self, timeout=false): #self.oauth_token = token(key=oauth_keys['access_token_key'], secret=oauth_keys['access_token_secret']) self.oauth_consumer = oauth2.consumer(key=oauth_keys['consumer_key'], secret=oauth_keys['consumer_secret']) self.oauth_token = oauth2.token(key=oauth_keys['access_token_key'], secret=oauth_keys['access_token_secret']) self.conn = none #pycurl.curl() self.buffer = '' self.timeout = timeout self.setup_connection() def setup_connection(self): """ create persistant http connection streaming api endpoint using curl. """ if self.conn: self.conn.close() self.buffer = '' self.conn = pycurl.curl() # restart connection if less 1 byte/s received during "timeout" seconds if isinstance(self.timeout, int): self.conn.setopt(pycurl.low_speed_limit, 1) self.conn.setopt(pycurl.low_speed_time, self.timeout) self.conn.setopt(pycurl.url, api_endpoint_url) self.conn.setopt(pycurl.useragent, user_agent) # using gzip optional saves bandwidth. self.conn.setopt(pycurl.encoding, 'deflate, gzip') self.conn.setopt(pycurl.post, 1) self.conn.setopt(pycurl.postfields, urllib.urlencode(post_params)) self.conn.setopt(pycurl.httpheader, ['host: stream.twitter.com', 'authorization: %s' % self.get_oauth_header()]) # self.handle_tweet method called when new tweets arrive self.conn.setopt(pycurl.writefunction, self.handle_tweet) def get_oauth_header(self): """ create , return oauth header. """ params = {'oauth2_version': '1.0', 'oauth2_nonce': oauth2.generate_nonce(), 'oauth2_timestamp': int(time.time())} req = oauth2.request(method='post', parameters=params, url='%s?%s' % (api_endpoint_url, urllib.urlencode(post_params))) req.sign_request(oauth2.signaturemethod_hmac_sha1(), self.oauth_consumer, self.oauth_token) return req.to_header()['authorization'].encode('utf-8') def start(self): """ start listening streaming endpoint. handle exceptions according twitter's recommendations. """ backoff_network_error = 0.25 backoff_http_error = 5 backoff_rate_limit = 60 while true: self.setup_connection() try: self.conn.perform() except: # network error, use linear off 16 seconds print 'network error: %s' % self.conn.errstr() print 'waiting %s seconds before trying again' % backoff_network_error time.sleep(backoff_network_error) backoff_network_error = min(backoff_network_error + 1, 16) continue # http error sc = self.conn.getinfo(pycurl.http_code) if sc == 420: # rate limit, use exponential off starting 1 minute , double each attempt print 'rate limit, waiting %s seconds' % backoff_rate_limit time.sleep(backoff_rate_limit) backoff_rate_limit *= 2 else: # http error, use exponential off 320 seconds print 'http error %s, %s' % (sc, self.conn.errstr()) print 'waiting %s seconds' % backoff_http_error time.sleep(backoff_http_error) backoff_http_error = min(backoff_http_error * 2, 320) def handle_tweet(self, data): """ method called when data received through streaming endpoint. """ self.buffer += data if data.endswith('\r\n') , self.buffer.strip(): # complete message received message = json.loads(self.buffer) self.buffer = '' msg = '' if message.get('limit'): print 'rate limiting caused miss %s tweets' % (message['limit'].get('track')) elif message.get('disconnect'): raise exception('got disconnect: %s' % message['disconnect'].get('reason')) elif message.get('warning'): print 'got warning: %s' % message['warning'].get('message') else: print 'got tweet text: %s' % message.get('text') if __name__ == '__main__': ts = twitterstream() ts.setup_connection() ts.start()
please me resolve it.
you try updating clock.
sudo ntpdate ntp.ubuntu.com
Comments
Post a Comment