前言
在使用网络请求库时,有时会遇到连接错误的问题,其中几种可能的原因是SSL证书问题、网络代理问题等。
1. 主要问题与报错信息
1.1 主要问题
遇到SSL证书的问题时,如果是直接使用requests发送请求还能直接设置 verify=False 来禁用SSL证书验证(注:禁用SSL证书可能不安全),但如果是使用类似OpenAI这种封装过的网络请求库应该怎么禁用SSL证书验证呢?
1.2 报错信息
主要报错的问题是:httpx.ConnectError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1000)
只要是和SSL相关的报错都可以尝试一下这个思路,当前报错的原因是本地没有SSL证书
2. 解决办法
2.1 SSL证书问题
虽然封装的网络请求库无法直接在requests请求方法上设置 verify=False 参数,但是一般封装的网络请求库都提供了设置请求客户端的参数,比如OpenAI库的OpenAI Client实例化方法中有一个http_client参数,通过指定请求客户端并在客户端的实例化方法中传入 verify=False 就可以同样禁用SSL证书验证,示例代码如下:
import httpx
from openai import OpenAI
client = OpenAI(
base_url="https://xxxx.api-forwards.com/v1",
api_key="Your OpenAI API Key",
http_client=httpx.Client(verify=False)
)
解决问题的关键就是
http_client=httpx.Client(verify=False)
如果不是OpenAI库也可以参照这个思路,查阅相关的文档找到设置请求客户端的参数并传入禁用SSL证书验证的客户端
2.2 网络代理问题
如果API需要代理才能访问,则要指定HTTP和HTTPS请求的代理服务器,如下代码:
os.environ["http_proxy"] = "http://localhost:代理端口"
os.environ["https_proxy"] = "http://localhost:代理端口"
代理端口一般为7890或7897,可自行在代理软件内查看或逐个尝试
3. 其他问题
正如前面所提到的,一般封装的网络请求库都提供了设置请求客户端(代理)的参数。就算同是OpenAI库的Python版本和Node.js版本的参数也不太一样。这里提供一种解决问题的思路!
3.1 Node.js版本解决方法
鉴于有的小伙伴可能已经被这个魂牵梦绕的问题困扰了一整天甚至几天,先直接摆出代码来提提神!
JavaScript / CommonJS 版本
const https = require('https');
const OpenAI = require('openai');
const agent = new https.Agent({
rejectUnauthorized: false
});
const openai = new OpenAI({
baseURL: 'https://xxxx.api-forwards.com/v1',
apiKey: 'Your OpenAI API Key',
httpAgent: agent
});
TypeScript / ESModule 版本
import https from "https";
import OpenAI from 'openai';
const agent = new https.Agent({
rejectUnauthorized: false
});
const openai = new OpenAI({
baseURL: 'https://xxxx.api-forwards.com/v1',
apiKey: 'Your OpenAI API Key',
httpAgent: agent
});
注意提前安装相关依赖,https库是Node.js自带的,无需专门安装
baseURL是指定的API请求地址,需要替换为自己的,使用OpenAI官方的则不传入
3.2 解决问题思路
博主博主你的文章确实很好,但还是解决不了我的问题,有没有更加简单又强大的解决方法?
有的兄弟,有的!
授人以鱼不如授人以渔,这里提供一种解决这种类型问题的通法,也是我实践过几次的方法
3.2.1 提取关键信息
无论是使用搜索引擎还是大语言模型,搜索什么问什么是第一个问题,这就涉及到信息提取和抽象的能力,上面的问题最直接的信息就是几个报错信息:
1. openai.apiconnectionerror: connection error.
2. httpx.ConnectError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate
这时候有一定的英语基础或者把报错拿去百度一搜就知道,这是在“SSL证书验证失败”的错误,我们就得到了核心的报错信息
3.2.2 擅用搜索引擎
知道搜什么了之后就可以去带着问题找答案了,直接百度搜索“openai.apiconnectionerror: connection error.”
出来四五篇文章,看完了,试过了,没用。。
再直接百度搜索“httpx.ConnectError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate”
只出来两篇文章,看完了,没用。。
再再百度搜索“OpenAI库怎么关闭SSL证书验证”
终于!找到解决方法了!也就是下面的参考文章中的内容。但是问题又来了,我是用serverless技术的云对象去调用OpenAI库,是Node.js库,代码一写天塌了,参数不一样,一眼也看不到类似功能的参数
再再再百度搜索“nodejs openai 关闭SSL证书验证”,您猜怎么着?
搜到我自己的文章了...哈哈哈哈哈开玩笑的,没有一篇相关的内容
这时候就有人问了,博主博主你都走投无路了,还有什么办法挣一下吗?
有的兄弟,有的!包挣的。
3.2.3 擅用人工智能
都到这一步了,搜索引擎已经不能满足我了,我反手就把问题甩给ChatGPT,他给我了一个办法,有效但不完全有效
对比我上面给出的代码就会发现ChatGPT给出的代码是有错误的,可能和相关依赖的版本问题有关,在最新版的OpenAI库上不能正常运行。但是!他给出的httpsAgent的代码居然没问题!而且能达到我想要的效果!
3.2.4 总结
如果你看到这里了,那么恭喜你看完了一大半废话[/doge],其实我想说的就是用 AI 可以很方便的解决问题哈哈哈哈哈。但是前面提到的一个能力确实非常非常重要——抽象能力,没错,就是抽象[/doge]