def _oauth_client_default(self): return OAuthClient( self.client_id, rsa_key=self.rsa_key, signature_method=SIGNATURE_RSA, signature_type=SIGNATURE_TYPE_QUERY, )
async def _connect( self, method, endpoint, params={}, headers=None, body=None ): oauth_client = OAuthClient(self.consumer_key, self.consumer_secret, self.access_token, self.access_token_secret) url = f"https://stream.twitter.com/1.1/{endpoint}.json" url = str(URL(url).with_query(sorted(params.items()))) url, headers, body = oauth_client.sign( url, http_method=method, headers=headers, body=body ) await super()._connect(method, url, headers=headers, body=body)
async def _connect(self, method, endpoint, params={}, headers=None, body=None): error_count = 0 # https://developer.twitter.com/en/docs/twitter-api/v1/tweets/filter-realtime/guides/connecting stall_timeout = 90 network_error_wait = network_error_wait_step = 0.25 network_error_wait_max = 16 http_error_wait = http_error_wait_start = 5 http_error_wait_max = 320 http_420_error_wait_start = 60 oauth_client = OAuthClient(self.consumer_key, self.consumer_secret, self.access_token, self.access_token_secret) if self.session is None or self.session.closed: self.session = aiohttp.ClientSession( headers={"User-Agent": self.user_agent}, timeout=aiohttp.ClientTimeout(sock_read=stall_timeout)) url = f"https://stream.twitter.com/1.1/{endpoint}.json" url = str(URL(url).with_query(sorted(params.items()))) try: while error_count <= self.max_retries: request_url, request_headers, request_body = oauth_client.sign( url, method, body, headers) try: async with self.session.request(method, request_url, headers=request_headers, data=request_body, proxy=self.proxy) as resp: if resp.status == 200: error_count = 0 http_error_wait = http_error_wait_start network_error_wait = network_error_wait_step await self.on_connect() async for line in resp.content: line = line.strip() if line: await self.on_data(line) else: await self.on_keep_alive() await self.on_closed(resp) else: await self.on_request_error(resp.status) error_count += 1 if resp.status == 420: if http_error_wait < http_420_error_wait_start: http_error_wait = http_420_error_wait_start await asyncio.sleep(http_error_wait) http_error_wait *= 2 if resp.status != 420: if http_error_wait > http_error_wait_max: http_error_wait = http_error_wait_max except (aiohttp.ClientConnectionError, aiohttp.ClientPayloadError) as e: await self.on_connection_error() await asyncio.sleep(network_error_wait) network_error_wait += network_error_wait_step if network_error_wait > network_error_wait_max: network_error_wait = network_error_wait_max except asyncio.CancelledError: return except Exception as e: await self.on_exception(e) finally: await self.session.close() await self.on_disconnect()