def rest(api_path, **kargs): """REST API""" host = 'api.twitter.com' path = buildpath(api_path, kargs) ret = None while True: try: resp = api_call(host, path, True) ret = json.loads(resp.read()) return ret except APIError as twe: if twe.code == 400: rate = int(twe.resp.getheader('X-RateLimit-Remaining', 0)) if rate < 1: sleeptime = int(twe.resp.getheader('X-RateLimit-Reset')) \ - int(time.time()) logging.warning( \ 'Rate limits exceeded, retry after {0} sec'.format( \ sleeptime)) sleep(sleeptime) elif twe.code == 503: logging.warning('Service Unavailable. Retry after 1 min') sleep(60) else: raise twe
def search(**kargs): """Search API""" host = 'search.twitter.com' api_path = '/search.json' kargs['result_type'] = 'recent' path = buildpath(api_path, kargs) statuses = list() while True: try: resp = api_call(host, path, True) jresp = json.loads(resp.read()) statuses.extend(jresp['results']) if 'next_page' in jresp: path = api_path + jresp['next_page'] continue except APIError as twe: if twe.code == 420: if twe.resp.read().find('limited') > 0: sleeptime = int(twe.resp.getheader('Retry-After')) + 1 logging.warning( 'Rate limits exceeded, retry after {0} sec'.format(\ sleeptime)) sleep(sleeptime) continue elif twe.code == 403: #if PAGE.search(twe.resp.read())!=None: #break if twe.resp.read().find('since_id') > 0: path = SINCEID_PATTERN.sub(r'\1', path) continue break return statuses