def _do_api_request(self, url, method="GET", body=None, headers=None): headers = headers or {} response, content = OAuth2Request(self.api).make_request(url, method=method, body=body, headers=headers) if response['status'] == '503': raise InstagramAPIError(response['status'], "Rate limited", "Your client is making too many request per second") try: content_obj = simplejson.loads(content) except ValueError: raise InstagramClientError('Unable to parse response, not valid JSON.') api_responses = [] status_code = content_obj['meta']['code'] if status_code == 200: if not self.objectify_response: return content_obj, None if self.response_type == 'list': for entry in content_obj['data']: if self.return_json: api_responses.append(entry) else: obj = self.root_class.object_from_dictionary(entry) api_responses.append(obj) elif self.response_type == 'entry': data = content_obj['data'] if self.return_json: api_responses = data else: api_responses = self.root_class.object_from_dictionary(data) elif self.response_type == 'empty': pass return api_responses, content_obj.get('pagination', {}) # Why wouldn't we want all of this? .get('next_url') else: raise InstagramAPIError(status_code, content_obj['meta']['error_type'], content_obj['meta']['error_message'])
def _do_api_request(self, url, method="GET", body=None, headers=None): headers = headers or {} response, content = OAuth2Request(self.api).make_request( url, method=method, body=body, headers=headers) if response['status'] == '503': raise InstagramAPIError( response['status'], "Rate limited", "Your client is making too many request per second") try: content_obj = simplejson.loads(content) except ValueError: raise InstagramClientError( 'Unable to parse response, not valid JSON.', status_code=response['status']) # Handle OAuthRateLimitExceeded from Instagram's Nginx which uses different format to documented api responses if not content_obj.has_key('meta'): if content_obj.get('code') == 420: error_message = content_obj.get( 'error_message' ) or "Your client is making too many request per second" raise InstagramAPIError(420, "Rate limited", error_message) raise InstagramAPIError(content_obj.has_key('code'), content_obj.has_key('error_type'), content_obj.has_key('error_message')) api_responses = [] status_code = content_obj['meta']['code'] self.api.x_ratelimit_remaining = response.get( "x-ratelimit-remaining", None) self.api.x_ratelimit = response.get("x-ratelimit-limit", None) if status_code == 200: if not self.objectify_response: return content_obj, None if self.response_type == 'list': for entry in content_obj['data']: if self.return_json: api_responses.append(entry) else: obj = self.root_class.object_from_dictionary(entry) api_responses.append(obj) elif self.response_type == 'entry': data = content_obj['data'] if self.return_json: api_responses = data else: api_responses = self.root_class.object_from_dictionary( data) elif self.response_type == 'empty': pass return api_responses, content_obj.get('pagination', {}).get('next_url') else: raise InstagramAPIError(status_code, content_obj['meta']['error_type'], content_obj['meta']['error_message'])
def exchange_for_access_token(self, code=None, username=None, password=None, scope=None, user_id=None): data = self._data_for_exchange(code, username, password, scope=scope, user_id=user_id) http_object = Http(disable_ssl_certificate_validation=True) url = self.api.access_token_url response, content = http_object.request(url, method="POST", body=data) parsed_content = simplejson.loads(content) if int(response['status']) != 200: raise OAuth2AuthExchangeError(parsed_content.get("error_message", "")) return parsed_content['access_token'], parsed_content['user']
def process(self, client_secret, raw_response, x_hub_signature): if not self._verify_signature(client_secret, raw_response, x_hub_signature): raise SubscriptionVerifyError("X-Hub-Signature and hmac digest did not match") try: response = simplejson.loads(raw_response) except ValueError: raise SubscriptionError('Unable to parse response, not valid JSON.') for update in response: self._process_update(update)
def _do_api_request(self, url, method="GET", body=None, headers=None): headers = headers or {} if self.signature and self.api.client_ips != None and self.api.client_secret != None: secret = self.api.client_secret ips = self.api.client_ips signature = hmac.new(secret, ips, sha256).hexdigest() headers['X-Insta-Forwarded-For'] = '|'.join([ips, signature]) response, content = OAuth2Request(self.api).make_request(url, method=method, body=body, headers=headers) if response['status'] == '503' or response['status'] == '429': raise InstagramAPIError(response['status'], "Rate limited", "Your client is making too many request per second") try: content_obj = simplejson.loads(content) except ValueError: raise InstagramClientError('Unable to parse response, not valid JSON.', status_code=response['status']) # Handle OAuthRateLimitExceeded from Instagram's Nginx which uses different format to documented api responses if not content_obj.has_key('meta'): if content_obj.get('code') == 420 or content_obj.get('code') == 429: error_message = content_obj.get('error_message') or "Your client is making too many request per second" raise InstagramAPIError(content_obj.get('code'), "Rate limited", error_message) raise InstagramAPIError(content_obj.get('code'), content_obj.get('error_type'), content_obj.get('error_message')) api_responses = [] status_code = content_obj['meta']['code'] self.api.x_ratelimit_remaining = response.get("x-ratelimit-remaining",None) self.api.x_ratelimit = response.get("x-ratelimit-limit",None) if status_code == 200: if not self.objectify_response: return content_obj, None if self.response_type == 'list': for entry in content_obj['data']: if self.return_json: api_responses.append(entry) else: obj = self.root_class.object_from_dictionary(entry) api_responses.append(obj) elif self.response_type == 'entry': data = content_obj['data'] if self.return_json: api_responses = data else: api_responses = self.root_class.object_from_dictionary(data) elif self.response_type == 'empty': pass return api_responses, self._build_pagination_info(content_obj) else: raise InstagramAPIError(status_code, content_obj['meta']['error_type'], content_obj['meta']['error_message'])
def _do_api_request(self, url, method="GET", body=None, headers=None): headers = headers or {} if self.signature and self.api.client_ips != None and self.api.client_secret != None: secret = self.api.client_secret ips = self.api.client_ips signature = hmac.new(secret, ips, sha256).hexdigest() headers['X-Insta-Forwarded-For'] = '|'.join([ips, signature]) response, content = OAuth2Request(self.api).make_request(url, method=method, body=body, headers=headers) if response['status'] == '503' or response['status'] == '429': raise InstagramAPIError(response['status'], "Rate limited", "Your client is making too many request per second") try: content_obj = simplejson.loads(content) except ValueError: raise InstagramClientError('Unable to parse response, not valid JSON.', status_code=response['status']) # Handle OAuthRateLimitExceeded from Instagram's Nginx which uses different format to documented api responses if not content_obj.has_key('meta'): if content_obj.get('code') == 420 or content_obj.get('code') == 429: error_message = content_obj.get('error_message') or "Your client is making too many request per second" raise InstagramAPIError(content_obj.get('code'), "Rate limited", error_message) raise InstagramAPIError(content_obj.has_key('code'), content_obj.has_key('error_type'), content_obj.has_key('error_message')) api_responses = [] status_code = content_obj['meta']['code'] self.api.x_ratelimit_remaining = response.get("x-ratelimit-remaining",None) self.api.x_ratelimit = response.get("x-ratelimit-limit",None) if status_code == 200: if not self.objectify_response: return content_obj, None if self.response_type == 'list': for entry in content_obj['data']: if self.return_json: api_responses.append(entry) else: obj = self.root_class.object_from_dictionary(entry) api_responses.append(obj) elif self.response_type == 'entry': data = content_obj['data'] if self.return_json: api_responses = data else: api_responses = self.root_class.object_from_dictionary(data) elif self.response_type == 'empty': pass return api_responses, self._build_pagination_info(content_obj) else: raise InstagramAPIError(status_code, content_obj['meta']['error_type'], content_obj['meta']['error_message'])
def _do_api_request(self, url, method="GET", body=None, headers=None): headers = headers or {} response, content = OAuth2Request(self.api).make_request(url, method=method, body=body, headers=headers) if response['status'] == '503': raise InstagramAPIError(response['status'], "Rate limited", "Your client is making too many request per second") try: content_obj = simplejson.loads(content) except ValueError: raise InstagramClientError('Unable to parse response, not valid JSON.', status_code=response['status']) # Handle OAuthRateLimitExceeded from Instagram's Nginx which uses different format to documented api responses if not content_obj.has_key('meta'): if content_obj.get('code') == 420: error_message = content_obj.get('error_message') or "Your client is making too many request per second" raise InstagramAPIError(420, "Rate limited", error_message) raise InstagramAPIError(content_obj.has_key('code'), content_obj.has_key('error_type'), content_obj.has_key('error_message')) api_responses = [] status_code = content_obj['meta']['code'] self.api.x_ratelimit_remaining = response.get("x-ratelimit-remaining",None) self.api.x_ratelimit = response.get("x-ratelimit-limit",None) if status_code == 200: if not self.objectify_response: return content_obj, None if self.response_type == 'list': for entry in content_obj['data']: if self.return_json: api_responses.append(entry) else: obj = self.root_class.object_from_dictionary(entry) api_responses.append(obj) elif self.response_type == 'entry': data = content_obj['data'] if self.return_json: api_responses = data else: api_responses = self.root_class.object_from_dictionary(data) elif self.response_type == 'empty': pass return api_responses, content_obj.get('pagination', {}).get('next_url') else: raise InstagramAPIError(status_code, content_obj['meta']['error_type'], content_obj['meta']['error_message'])
def _do_api_request(self, url, method="GET", body=None, headers=None): headers = headers or {} response, content = OAuth2Request(self.api).make_request( url, method=method, body=body, headers=headers) if response['status'] == '503': raise InstagramAPIError( response['status'], "Rate limited", "Your client is making too many request per second") try: content_obj = simplejson.loads(content) except ValueError: raise InstagramClientError( 'Unable to parse response, not valid JSON.') #self.response_type = 'list' api_responses = [] status_code = content_obj['meta']['code'] if status_code == 200: if not self.objectify_response: return content_obj, None if self.response_type == 'list': for entry in content_obj['data']: if self.return_json: api_responses.append(entry) else: obj = self.root_class.object_from_dictionary(entry) api_responses.append(obj) elif self.response_type == 'entry': data = content_obj['data'] if self.return_json: api_responses = data else: api_responses = self.root_class.object_from_dictionary( data) elif self.response_type == 'empty': pass return api_responses, content_obj.get('pagination', {}).get('next_url') else: print 'error:%s' % url raise InstagramAPIError(status_code, content_obj['meta']['error_type'], content_obj['meta']['error_message'])
def exchange_for_access_token(self, code=None, username=None, password=None, scope=None, user_id=None): data = self._data_for_exchange(code, username, password, scope=scope, user_id=user_id) http_object = Http(disable_ssl_certificate_validation=True) url = self.api.access_token_url response, content = http_object.request(url, method="POST", body=data) parsed_content = simplejson.loads(content.decode()) if int(response['status']) != 200: raise OAuth2AuthExchangeError( parsed_content.get("error_message", "")) return parsed_content['access_token'], parsed_content['user']
def get_data(url): # 异常捕获 处理的时候暂时不抛出,返回错误给前端 try: response = requests.get(url, timeout=TIME_OUT) # 数据解码解析 parsed_content = simplejson.loads(response.content.decode()) # 超时 except (ConnectTimeout, ReadTimeout): parsed_content = { "errcode": 40800, } # 链接错误 except _ConnectionError: parsed_content = { "errcode": 40801, } # 解码异常 except ContentDecodingError: parsed_content = { "result": 50000, } # 返回的内容 return parsed_content