def request(self, resource, params=None, files=None):
"""Request a Twitter REST API or Streaming API resource.
:param resource: A valid Twitter endpoint (ex. "search/tweets")
:param params: Dictionary with endpoint parameters or None (default)
:param files: Dictionary with multipart-encoded file or None (default)
:returns: TwitterResponse
:raises: TwitterConnectionError
"""
resource, endpoint = self._get_endpoint(resource)
if endpoint not in ENDPOINTS:
raise Exception('Endpoint "%s" unsupported' % endpoint)
session = requests.Session()
session.auth = self.auth
session.headers = {'User-Agent': USER_AGENT}
method, subdomain = ENDPOINTS[endpoint]
url = self._prepare_url(subdomain, resource)
if 'stream' in subdomain:
session.stream = True
timeout = STREAMING_TIMEOUT
# always use 'delimited' for efficient stream parsing
if not params:
params = {}
params['delimited'] = 'length'
params['stall_warning'] = 'true'
else:
session.stream = False
timeout = REST_TIMEOUT
if method == 'POST':
data = params
params = None
else:
data = None
try:
r = session.request(
method,
url,
data=data,
params=params,
timeout=(CONNECTION_TIMEOUT,timeout),
files=files,
proxies=self.proxies)
except (ConnectionError, ProtocolError, ReadTimeout, ReadTimeoutError,
SSLError, ssl.SSLError, socket.error) as e:
raise TwitterConnectionError(e)
return TwitterResponse(r, session.stream)
评论列表
文章目录