Example #1
0
        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'])
Example #2
0
        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'])
Example #3
0
 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']
Example #4
0
    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)
Example #5
0
    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)
Example #6
0
        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'])
Example #7
0
        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'])
Example #8
0
        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'])
Example #9
0
        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'])
Example #10
0
 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']
Example #11
0
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