예제 #1
0
파일: base.py 프로젝트: TaylorHere/wechatpy
 def _decode_result(self, res):
     try:
         result = json.loads(res.content.decode('utf-8', 'ignore'), strict=False)
     except (TypeError, ValueError):
         # Return origin response object if we can not decode it as JSON
         return res
     return result
예제 #2
0
 def _decode_result(self, res):
     try:
         result = json.loads(res.body)
     except (TypeError, ValueError):
         # Return origin response object if we can not decode it as JSON
         return res
     return result
예제 #3
0
    def _handle_result(self, res, method=None, url=None, **kwargs):
        result = json.loads(res.content.decode('utf-8', 'ignore'),
                            strict=False)
        if 'errcode' in result:
            result['errcode'] = int(result['errcode'])

        if 'errcode' in result and result['errcode'] != 0:
            errcode = result['errcode']
            errmsg = result['errmsg']
            if errcode == 42001:
                logger.info(
                    'Component access token expired, fetch a new one and retry request'
                )
                self.fetch_access_token()
                kwargs['params']['component_access_token'] = self.session.get(
                    'component_access_token')
                return self._request(method=method,
                                     url_or_endpoint=url,
                                     **kwargs)
            elif errcode == 45009:
                # api freq out of limit
                raise APILimitedException(errcode,
                                          errmsg,
                                          client=self,
                                          request=res.request,
                                          response=res)
            else:
                raise WeChatClientException(errcode,
                                            errmsg,
                                            client=self,
                                            request=res.request,
                                            response=res)

        return result
예제 #4
0
    def _request(self, method, url_or_endpoint, **kwargs):
        if not url_or_endpoint.startswith(('http://', 'https://')):
            url = '{base}{endpoint}'.format(base=self.API_BASE_URL,
                                            endpoint=url_or_endpoint)
        else:
            url = url_or_endpoint

        if isinstance(kwargs.get('data', ''), dict):
            body = json.dumps(kwargs['data'], ensure_ascii=False)
            body = body.encode('utf-8')
            kwargs['data'] = body

        res = self._http.request(method=method, url=url, **kwargs)
        try:
            res.raise_for_status()
        except requests.RequestException as reqe:
            raise WeChatOAuthException(errcode=None,
                                       errmsg=None,
                                       client=self,
                                       request=reqe.request,
                                       response=reqe.response)
        result = json.loads(res.content.decode('utf-8', 'ignore'),
                            strict=False)

        if 'errcode' in result and result['errcode'] != 0:
            errcode = result['errcode']
            errmsg = result['errmsg']
            raise WeChatOAuthException(errcode,
                                       errmsg,
                                       client=self,
                                       request=res.request,
                                       response=res)

        return result
예제 #5
0
 def _decode_result(self, res):
     res.encoding = 'utf-8'
     try:
         result = json.loads(res.content.decode('utf-8', errors='ignore'))
     except (TypeError, ValueError):
         # Return origin response object if we can not decode it as JSON
         return res
     return result
예제 #6
0
파일: base.py 프로젝트: jxtech/wechatpy
 def _decode_result(self, res):
     try:
         result = json.loads(res.content.decode('utf-8', 'ignore'), strict=False)
     except (TypeError, ValueError):
         # Return origin response object if we can not decode it as JSON
         logger.warning('Can not decode response as JSON', exc_info=True)
         return res
     return result
예제 #7
0
 def _decode_result(self, res):
     try:
         result = json.loads(res.content.decode('utf-8', 'ignore'),
                             strict=False)
     except (TypeError, ValueError):
         # Return origin response object if we can not decode it as JSON
         return res
     return result
예제 #8
0
파일: base.py 프로젝트: xs0502/wechatpy
 def _decode_result(self, res):
     try:
         result = json.loads(res.content.decode('utf-8', 'ignore'),
                             strict=False)
     except (TypeError, ValueError):
         # Return origin response object if we can not decode it as JSON
         logger.warning('Can not decode response as JSON', exc_info=True)
         return res
     return result
예제 #9
0
        def next_openid_mock(url, request):
            """伪造第二页的请求"""
            data = json.loads(request.body.decode())
            if not data.get('next_openid'):
                return wechat_api_mock(url, request)

            # 根据拿到的第二页请求响应 是没有data和next_openid的
            content = {"count": 0}
            headers = {'Content-Type': 'application/json'}
            return response(200, content, headers, request=request)
예제 #10
0
파일: base.py 프로젝트: nudepig/yfc_wx
 def get(self, key, default=None):
     try:
         with open('%s-%s' % (self.file_dir, key), 'r') as f:
             _dict = json.loads(to_text(f.read()))
             timestamp = time.time()
             expires_at = _dict.get('expires_at', 0)
             if expires_at == 0 or expires_at - timestamp > 60:
                 return _dict['val']
     except:
         traceback.print_exc()
         return default
예제 #11
0
def wechat_api_mock(url, request):
    path = url.path[1:].replace("/", "_")
    res_file = os.path.join(_FIXTURE_PATH, "%s.json" % path)
    content = {"errcode": 99999, "errmsg": "can not find fixture: %s" % res_file}
    headers = {"Content-Type": "application/json"}
    try:
        with open(res_file) as f:
            content = json.loads(f.read())
    except (IOError, ValueError):
        content["errmsg"] = "Fixture %s json decode error" % res_file
    return response(200, content, headers, request=request)
예제 #12
0
def wechat_api_mock(url, request):
    path = url.path[1:].replace('/', '_')
    res_file = os.path.join(_FIXTURE_PATH, '%s.json' % path)
    content = {
        'errcode': 99999,
        'errmsg': 'can not find fixture: %s' % res_file
    }
    headers = {'Content-Type': 'application/json'}
    try:
        with open(res_file) as f:
            content = json.loads(f.read())
    except (IOError, ValueError):
        content['errmsg'] = 'Fixture %s json decode error' % res_file
    return response(200, content, headers, request=request)
예제 #13
0
def wechat_api_mock(url, request):
    path = url.path.replace('/cgi-bin/component/', '').replace('/', '_')
    res_file = os.path.join(_FIXTURE_PATH, '%s.json' % path)
    content = {
        'errcode': 99999,
        'errmsg': 'can not find fixture %s' % res_file,
    }
    headers = {'Content-Type': 'application/json'}
    try:
        with open(res_file, 'rb') as f:
            content = json.loads(f.read().decode('utf-8'))
    except (IOError, ValueError):
        pass
    return response(200, content, headers, request=request)
예제 #14
0
def wechat_api_mock(url, request):
    path = url.path[1:].replace('/', '_')
    res_file = os.path.join(_FIXTURE_PATH, '%s.json' % path)
    content = {
        'errcode': 99999,
        'errmsg': 'can not find fixture: %s' % res_file
    }
    headers = {
        'Content-Type': 'application/json'
    }
    try:
        with open(res_file) as f:
            content = json.loads(f.read())
    except (IOError, ValueError):
        content['errmsg'] = 'Fixture %s json decode error' % res_file
    return response(200, content, headers, request=request)
예제 #15
0
def wechat_api_mock(url, request):
    path = url.path.replace('/cgi-bin/component/', '').replace('/', '_')
    res_file = os.path.join(_FIXTURE_PATH, '%s.json' % path)
    content = {
        'errcode': 99999,
        'errmsg': 'can not find fixture %s' % res_file,
    }
    headers = {
        'Content-Type': 'application/json'
    }
    try:
        with open(res_file, 'rb') as f:
            content = json.loads(f.read().decode('utf-8'))
    except (IOError, ValueError):
        pass
    return response(200, content, headers, request=request)
def wechat_api_mock(url, request):
    path = url.path.replace('/cgi-bin/', '').replace('/', '_')
    if path.startswith('_'):
        path = path[1:]
    res_file = os.path.join(_FIXTURE_PATH, '%s.json' % path)
    content = {
        'errcode': 99999,
        'errmsg': 'can not find fixture %s' % res_file,
    }
    headers = {'Content-Type': 'application/json'}
    try:
        with open(res_file, 'rb') as f:
            content = json.loads(f.read().decode('utf-8'))
    except (IOError, ValueError) as e:
        content['errmsg'] = 'Loads fixture {0} failed, error: {1}'.format(
            res_file, e)
    return response(200, content, headers, request=request)
예제 #17
0
파일: __init__.py 프로젝트: loocor/wechatpy
    def _request(self, method, url_or_endpoint, **kwargs):
        if not url_or_endpoint.startswith(('http://', 'https://')):
            url = '{base}{endpoint}'.format(
                base=self.API_BASE_URL,
                endpoint=url_or_endpoint
            )
        else:
            url = url_or_endpoint

        if isinstance(kwargs.get('data', ''), dict):
            body = json.dumps(kwargs['data'], ensure_ascii=False)
            body = body.encode('utf-8')
            kwargs['data'] = body

        res = self._http.request(
            method=method,
            url=url,
            **kwargs
        )
        try:
            res.raise_for_status()
        except requests.RequestException as reqe:
            raise WeChatOAuthException(
                errcode=None,
                errmsg=None,
                client=self,
                request=reqe.request,
                response=reqe.response
            )
        result = json.loads(res.content.decode('utf-8', 'ignore'), strict=False)

        if 'errcode' in result and result['errcode'] != 0:
            errcode = result['errcode']
            errmsg = result['errmsg']
            raise WeChatOAuthException(
                errcode,
                errmsg,
                client=self,
                request=res.request,
                response=res
            )

        return result
예제 #18
0
def wechat_api_mock(url, request):
    path = url.path.replace('/cgi-bin/', '').replace('/', '_')
    if path.startswith('_'):
        path = path[1:]
    res_file = os.path.join(_FIXTURE_PATH, '%s.json' % path)
    content = {
        'errcode': 99999,
        'errmsg': 'can not find fixture %s' % res_file,
    }
    headers = {
        'Content-Type': 'application/json'
    }
    try:
        with open(res_file, 'rb') as f:
            content = json.loads(f.read().decode('utf-8'))
    except (IOError, ValueError) as e:
        content['errmsg'] = 'Loads fixture {0} failed, error: {1}'.format(
            res_file,
            e
        )
    return response(200, content, headers, request=request)
예제 #19
0
    def _handle_result(self, res, method=None, url=None, **kwargs):
        result = json.loads(res.content.decode('utf-8', 'ignore'), strict=False)
        if 'errcode' in result:
            result['errcode'] = int(result['errcode'])

        if 'errcode' in result and result['errcode'] != 0:
            errcode = result['errcode']
            errmsg = result.get('errmsg', errcode)
            if self.auto_retry and errcode in (
                    WeChatErrorCode.INVALID_CREDENTIAL.value,
                    WeChatErrorCode.INVALID_ACCESS_TOKEN.value,
                    WeChatErrorCode.EXPIRED_ACCESS_TOKEN.value):
                logger.info('Component access token expired, fetch a new one and retry request')
                self.fetch_access_token()
                kwargs['params']['component_access_token'] = self.session.get(
                    'component_access_token'
                )
                return self._request(
                    method=method,
                    url_or_endpoint=url,
                    **kwargs
                )
            elif errcode == WeChatErrorCode.OUT_OF_API_FREQ_LIMIT.value:
                # api freq out of limit
                raise APILimitedException(
                    errcode,
                    errmsg,
                    client=self,
                    request=res.request,
                    response=res
                )
            else:
                raise WeChatClientException(
                    errcode,
                    errmsg,
                    client=self,
                    request=res.request,
                    response=res
                )
        return result
예제 #20
0
    def _handle_result(self, res, method=None, url=None, **kwargs):
        result = json.loads(res.content.decode('utf-8', 'ignore'), strict=False)
        if 'errcode' in result:
            result['errcode'] = int(result['errcode'])

        if 'errcode' in result and result['errcode'] != 0:
            errcode = result['errcode']
            errmsg = result.get('errmsg', errcode)
            if self.auto_retry and errcode in (
                    WeChatErrorCode.INVALID_CREDENTIAL.value,
                    WeChatErrorCode.INVALID_ACCESS_TOKEN.value,
                    WeChatErrorCode.EXPIRED_ACCESS_TOKEN.value):
                logger.info('Component access token expired, fetch a new one and retry request')
                self.fetch_access_token()
                kwargs['params']['component_access_token'] = self.session.get(
                    'component_access_token'
                )
                return self._request(
                    method=method,
                    url_or_endpoint=url,
                    **kwargs
                )
            elif errcode == WeChatErrorCode.OUT_OF_API_FREQ_LIMIT.value:
                # api freq out of limit
                raise APILimitedException(
                    errcode,
                    errmsg,
                    client=self,
                    request=res.request,
                    response=res
                )
            else:
                raise WeChatClientException(
                    errcode,
                    errmsg,
                    client=self,
                    request=res.request,
                    response=res
                )
        return result
예제 #21
0
    def _handle_result(self, res, method=None, url=None, **kwargs):
        result = json.loads(res.content.decode('utf-8', 'ignore'), strict=False)
        if 'errcode' in result:
            result['errcode'] = int(result['errcode'])

        if 'errcode' in result and result['errcode'] != 0:
            errcode = result['errcode']
            errmsg = result['errmsg']
            if errcode == 42001:
                # access_token expired, fetch a new one and retry request
                self.fetch_component_access_token()
                kwargs['params']['component_access_token'] = self.session.get(
                    'component_access_token'
                )
                return self._request(
                    method=method,
                    url_or_endpoint=url,
                    **kwargs
                )
            elif errcode == 45009:
                # api freq out of limit
                raise APILimitedException(
                    errcode,
                    errmsg,
                    client=self,
                    request=res.request,
                    response=res
                )
            else:
                raise WeChatClientException(
                    errcode,
                    errmsg,
                    client=self,
                    request=res.request,
                    response=res
                )

        return result
예제 #22
0
 def get(self, key, default=None):
     key = self.key_name(key)
     value = self.mc.get(key)
     if value is None:
         return default
     return json.loads(to_text(value))
예제 #23
0
 def get(self, key, default=None):
     key = self.key_name(key)
     value = self.mc.get(key)
     if value is None:
         return default
     return json.loads(to_text(value))