Exemple #1
0
 def _oauth_client_default(self):
     return OAuthClient(
         self.client_id,
         rsa_key=self.rsa_key,
         signature_method=SIGNATURE_RSA,
         signature_type=SIGNATURE_TYPE_QUERY,
     )
Exemple #2
0
 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)
Exemple #3
0
    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()