• facebook graph api 报错SSLError(1, u'[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:661)')


    使用facebook graph api,报错如下

    一开始以为是https证书验证失败,查了一下午源码,没有看到问题,于是把Python27libsite-packages equestsadapters.py文件的如下位置异常处理注释掉了,看看异常到底从哪来的

        def send(self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None):
            """Sends PreparedRequest object. Returns Response object.
    
            :param request: The :class:`PreparedRequest <PreparedRequest>` being sent.
            :param stream: (optional) Whether to stream the request content.
            :param timeout: (optional) How long to wait for the server to send
                data before giving up, as a float, or a :ref:`(connect timeout,
                read timeout) <timeouts>` tuple.
            :type timeout: float or tuple or urllib3 Timeout object
            :param verify: (optional) Either a boolean, in which case it controls whether
                we verify the server's TLS certificate, or a string, in which case it
                must be a path to a CA bundle to use
            :param cert: (optional) Any user-provided SSL certificate to be trusted.
            :param proxies: (optional) The proxies dictionary to apply to the request.
            :rtype: requests.Response
            """
    
            conn = self.get_connection(request.url, proxies)
    
            self.cert_verify(conn, request.url, verify, cert)
            url = self.request_url(request, proxies)
            self.add_headers(request)
    
            chunked = not (request.body is None or 'Content-Length' in request.headers)
    
            if isinstance(timeout, tuple):
                try:
                    connect, read = timeout
                    timeout = TimeoutSauce(connect=connect, read=read)
                except ValueError as e:
                    # this may raise a string formatting error.
                    err = ("Invalid timeout {0}. Pass a (connect, read) "
                           "timeout tuple, or a single float to set "
                           "both timeouts to the same value".format(timeout))
                    raise ValueError(err)
            elif isinstance(timeout, TimeoutSauce):
                pass
            else:
                timeout = TimeoutSauce(connect=timeout, read=timeout)
    
            try:
                if not chunked:
                    resp = conn.urlopen(
                        method=request.method,
                        url=url,
                        body=request.body,
                        headers=request.headers,
                        redirect=False,
                        assert_same_host=False,
                        preload_content=False,
                        decode_content=False,
                        retries=self.max_retries,
                        timeout=timeout
                    )
    
                # Send the request.
                else:
                    if hasattr(conn, 'proxy_pool'):
                        conn = conn.proxy_pool
    
                    low_conn = conn._get_conn(timeout=DEFAULT_POOL_TIMEOUT)
    
                    try:
                        low_conn.putrequest(request.method,
                                            url,
                                            skip_accept_encoding=True)
    
                        for header, value in request.headers.items():
                            low_conn.putheader(header, value)
    
                        low_conn.endheaders()
    
                        for i in request.body:
                            low_conn.send(hex(len(i))[2:].encode('utf-8'))
                            low_conn.send(b'
    ')
                            low_conn.send(i)
                            low_conn.send(b'
    ')
                        low_conn.send(b'0
    
    ')
    
                        # Receive the response from the server
                        try:
                            # For Python 2.7+ versions, use buffering of HTTP
                            # responses
                            r = low_conn.getresponse(buffering=True)
                        except TypeError:
                            # For compatibility with Python 2.6 versions and back
                            r = low_conn.getresponse()
    
                        resp = HTTPResponse.from_httplib(
                            r,
                            pool=conn,
                            connection=low_conn,
                            preload_content=False,
                            decode_content=False
                        )
                    except:
                        # If we hit any problems here, clean up the connection.
                        # Then, reraise so that we can handle the actual exception.
                        low_conn.close()
                        raise
    
            except (ProtocolError, socket.error) as err:
                raise ConnectionError(err, request=request)
    
            except MaxRetryError as e:
                if isinstance(e.reason, ConnectTimeoutError):
                    # TODO: Remove this in 3.0.0: see #2811
                    if not isinstance(e.reason, NewConnectionError):
                        raise ConnectTimeout(e, request=request)
    
                if isinstance(e.reason, ResponseError):
                    raise RetryError(e, request=request)
    
                if isinstance(e.reason, _ProxyError):
                    raise ProxyError(e, request=request)
    
                raise ConnectionError(e, request=request)
    
            except ClosedPoolError as e:
                raise ConnectionError(e, request=request)
    
            except _ProxyError as e:
                raise ProxyError(e)
    
           # except (_SSLError, _HTTPError) as e:
           #     if isinstance(e, _SSLError):
           #         raise SSLError(e, request=request)
           #     elif isinstance(e, ReadTimeoutError):
           #         raise ReadTimeout(e, request=request)
           #     else:
           #         raise
    
            return self.build_response(request, resp)

    注释后报错

     于是把Python27libsite-packagesurllib3connectionpool.py625到630行注释掉

    报错

    最后估计是proxy的问题,找了一个墙外的服务器试一下果然好了,不翻墙就办不成事,shit

    祝病魔早日战胜方校长

  • 相关阅读:
    the selected directory is not a TomEE home
    java 获取当前年份 月份,当月第一天和最后一天
    java jwt工具类,生成和解析token
    Thymeleaf嵌套循环,每次循环显示固定数量
    oracle 非正常关机 错误1033解决办法
    webService简单记录
    好用的json工具
    org.apache.ws.commons.schema.XmlSchemaForm.getValue()Ljava/lang/String;
    webservice获取ip地址
    JSP(一)
  • 原文地址:https://www.cnblogs.com/wuxie1989/p/7081744.html
Copyright © 2020-2023  润新知