def filter(self, track=None, follow=None, locations=None, event=None,
               record_keepalive=False):
        """
        Returns an iterator for tweets that match a given filter track from
        the livestream of tweets happening right now.

        If a threading.Event is provided for event and the event is set,
        the filter will be interrupted.
        """
        if locations is not None:
            if type(locations) == list:
                locations = ','.join(locations)
            locations = locations.replace('\\', '')

        url = 'https://stream.twitter.com/1.1/statuses/filter.json'
        params = {
            "stall_warning": True,
            "include_ext_alt_text": True
        }
        if track:
            params["track"] = track
        if follow:
            params["follow"] = follow
        if locations:
            params["locations"] = locations
        headers = {'accept-encoding': 'deflate, gzip'}
        errors = 0
        while True:
            try:
                log.info("connecting to filter stream for %s", params)
                resp = self.post(url, params, headers=headers, stream=True)
                errors = 0
                for line in resp.iter_lines(chunk_size=1024):
                    if event and event.is_set():
                        log.info("stopping filter")
                        # Explicitly close response
                        resp.close()
                        return
                    if not line:
                        log.info("keep-alive")
                        if record_keepalive:
                            yield "keep-alive"
                        continue
                    try:
                        yield json.loads(line.decode())
                    except Exception as e:
                        log.error("json parse error: %s - %s", e, line)
            except requests.exceptions.HTTPError as e:
                errors += 1
                log.error("caught http error %s on %s try", e, errors)
                if self.http_errors and errors == self.http_errors:
                    log.warning("too many errors")
                    raise e
                if e.response.status_code == 420:
                    if interruptible_sleep(errors * 60, event):
                        log.info("stopping filter")
                        return
                else:
                    if interruptible_sleep(errors * 5, event):
                        log.info("stopping filter")
                        return
            except Exception as e:
                errors += 1
                log.error("caught exception %s on %s try", e, errors)
                if self.http_errors and errors == self.http_errors:
                    log.warning("too many exceptions")
                    raise e
                log.error(e)
                if interruptible_sleep(errors, event):
                    log.info("stopping filter")
                    return
def filter ( self , track = None , follow = None , locations = None , event = None , record_keepalive = False ) : if locations is not None : if type ( locations ) == list : locations = ',' . join ( locations ) locations = locations . replace ( '\\' , '' ) url = 'https://stream.twitter.com/1.1/statuses/filter.json' params = { "stall_warning" : True , "include_ext_alt_text" : True } if track : params [ "track" ] = track if follow : params [ "follow" ] = follow if locations : params [ "locations" ] = locations headers = { 'accept-encoding' : 'deflate, gzip' } errors = 0 while True : try : log . info ( "connecting to filter stream for %s" , params ) resp = self . post ( url , params , headers = headers , stream = True ) errors = 0 for line in resp . iter_lines ( chunk_size = 1024 ) : if event and event . is_set ( ) : log . info ( "stopping filter" ) resp . close ( ) return if not line : log . info ( "keep-alive" ) if record_keepalive : yield "keep-alive" continue try : yield json . loads ( line . decode ( ) ) except Exception as e : log . error ( "json parse error: %s - %s" , e , line ) except requests . exceptions . HTTPError as e : errors += 1 log . error ( "caught http error %s on %s try" , e , errors ) if self . http_errors and errors == self . http_errors : log . warning ( "too many errors" ) raise e if e . response . status_code == 420 : if interruptible_sleep ( errors * 60 , event ) : log . info ( "stopping filter" ) return else : if interruptible_sleep ( errors * 5 , event ) : log . info ( "stopping filter" ) return except Exception as e : errors += 1 log . error ( "caught exception %s on %s try" , e , errors ) if self . http_errors and errors == self . http_errors : log . warning ( "too many exceptions" ) raise e log . error ( e ) if interruptible_sleep ( errors , event ) : log . info ( "stopping filter" ) return
Returns an iterator for tweets that match a given filter track from
        the livestream of tweets happening right now.

        If a threading.Event is provided for event and the event is set,
        the filter will be interrupted.