这篇文章特别适合有下列特征的读者朋友:
-
嫌 US 代理慢,担心挂代理访问 ChatGPT 被封控封号。
-
想用 GPT-4,但嫌 ChatGPT Plus 贵。
-
经常更换 api token(懂的都懂)。
众所周知,在 Open AI 苛刻的风控下,玩 ChatGPT 得要用 US 代理。而作者本人特别嫌弃 US 代理,因为时延高,用起来不丝滑。因此要频繁地切代理,来换取丝滑的网上冲浪体验,不胜其烦。恰逢虚拟信用卡被封控,花去上百刀手续费仍然无法续费 Plus,因此一度放弃使用 ChatGPT。
最近去听了腾讯大佬关于 GPT 低代码项目实现细节的演讲,深受启发,跃跃欲试,但先要解决上面这些恼人的问题。
纵观全网,已经有非常多的基于 api 实现的 ChatGPT 客户端,遂想了个办法:在海外计算机上部署代理 api,通过 ChatGPT 客户端访问代理 api 来玩。
一来解决了频繁切换代理的琐事,只要我能直连或者用 HK 代理访问海外计算机。二来降低了账号被封的概率。
近日,Open AI 还发布了这样一则解释:
On July 6, 2023 , we gave all API users who have a history of successful payments access to the GPT-4 API (8k). We plan to open up access to new developers by the end of July 2023, and then start raising rate-limits after that depending on compute availability.
Open AI
简单地说就是,7 月 6 日起,会给成功付费过的 api 用户开放 GPT-4 的访问权限。当然这不是重点,因为大多数中国人根本就没有付费渠道。重点是后面一句话,计划在 7 月底,把 GPT-4 的访问权限开放给新开发者,也就是新创建的用户,新用户有 5 刀的免费额度,这就给无法付费的你我他创造了白嫖空间。
注册一个账号的成本要比订阅 Plus 的成本低得多。至于怎么注册,之前在博客里已经详细讲过了。
就算你有付费渠道,仍然建议用 api 替代订阅,因为用 ChatGPT 肯定是日常使用,而日常使用的 api 成本必然显著低于订阅费。
方案看起来很完美,剩下的就是实施了。
“海外计算机”我选择 Cloudflare Workers,原因无它,免费且稳定,这比什么都强。部署起来也很方便,还自带代码版本管理,支持一键回滚。
那么如何创建 Cloudflare Workers 呢?
首先你要有 Cloudflare 账号和自己的域名,然后在 Cloudflare 后台用自己的域名添加站点。
创建好站点以后,在 Workers 和 Pages 标签页下面,创建应用程序,根据提示创建好 Worker 并部署。
接下来就是编辑 Worker 代码(实现参考了网上截图),我只讲要点部分,完整的代码获取方式见文末。
第一,我们是代理,所以要把请求 Host 更换为真正要访问的 Host,就是 api.openai.com:
const url = new URL(request.url);
const fetchAPI = request.url.replace(url.host, 'api.openai.com');
第二,在接收到请求后,要判断是否是 preflight 请求,是的话要正确响应,否则后续的请求无法进行。原因是这些请求来自于浏览器的跨域策略,部分客户端会用到:
const corsHeaders = {'Access-Control-Allow-Origin': '*','Access-Control-Allow-Methods': 'OPTIONS','Access-Control-Allow-Headers': '*'
};
if (request.method === 'OPTIONS') {return new Response(null, { headers: corsHeaders });
}
第三,客户端的 API Token 会放在 Authentication header 中,这里我们要变通一下,客户端中填写的 API-Token 是自己生成的随机字符串,代码中对其进行校验,并用正确的 API Token 调用 Open AI 接口:
let authKey = request.headers.get('Authorization');
if (authKey !== 'Bearer sk-2wn8z7f4BxIyX1GvLfQ3c9tDqbR5UaWjA0oZpVh6sYgEiMkN') {return new Response('Forbidden', { status: 403 })
}const payload = {method: request.method,headers: {'Content-Type': 'application/json',Authorization: 'Bearer ' + API_TOKEN,},body: typeof body === 'object' ? JSON.stringify(body) : '{}',
};
上面的代码中,sk-2wn8z7f4BxIyX1GvLfQ3c9tDqbR5UaWjA0oZpVh6sYgEiMkN 是我们自己生成随机字符串,而全局变量 API_TOKEN 才是真正的 Token。
这么做的话,一来可以放心的用第三方客户端,因为在客户端输入的 Token 只能在 Worker 中用。二来,后续真 Token 有变化的话,只用更新 API_TOKEN 的值,不必再把所有客户端的 Token 都更新一遍,省时省力。
那么,全局变量 API_TOKEN 在哪设置呢?在 Worker 控制台的设置中,添加环境变量。
第四,如果是 HEAD 或者 GET 请求,要把 body 删掉,否则 Cloudflare 会报错:
if (['HEAD', 'GET'].includes(request.method)) {delete payload.body;
}
第五,把请求代理到 Open AI,并返回 Open AI 返回的内容:
const response = await fetch(fetchAPI, payload);
return new Response(response.body, {status: response.status,statusText: response.statusText,headers: response.headers,
});
代码完成后,点击保存并部署,然后在 Worker 控制台的触发器里面添加自定义域,Cloudflare 会自动完成 DNS 解析,几分钟后,就可以在自己喜欢的客户端里玩耍了。
(本文完)
最后是代码获取方式,只需简单两步:
-
关注微信公众号:湾区码农
-
回复关键词cfworker即可获得