简单搭建一个墙内环境能用的 ChatGPT

ChatGPT-Next-Web & Openai-Proxy

  • ❗ 请注意 deno 官方说明 反向代理是 Not Fair Use,所以还是用着玩玩就好,不要进行过多请求,小心被封号;同理 Vercel 也可以达到和 deno 一样的反向代理效果,但是也是同样被禁止的。
  • 想直接尝试的朋友直接访问我搭建好的 -示例网站- 并且在左下角设置中设定好自己的 apiKey 即可使用 ChatGPT 服务,整个过程在墙内环境即可,速度也不错。
目录

前言

最近 ChatGPT 有多火不用去证明了,然而现在使用 ChatGpt 的方法有这么几种:

  • 使用官方的 ChatGPT,然而缺点则是需要魔法✨,并且最近(2023.04.01~now)开始封大量账号,并且有时候可能因为节点不稳定问题出现 IP 限制不能使用的情况,总之,难,使用不稳定。
  • 使用别人搭建好的稳定自制版套壳 ChatGPT,当然稳定的前提是这个人绝大可能是使用了一台服务器来进行反向代理,从而在我们填入我们自己的 apiKey 之后能够使用他的服务器进行请求,从而去尽可能降低被封禁的概率。
  • 完全使用别人提供的服务(免费次数+有需求付费充值),这种之前很多,但是最近少之又少了,因为最近墙内对这方面把控很严格,我之前也有在用类似的服务,最后负责人因 “通过技术手段调用境外 ChatGPT 服务器向境内提供服务” 而被迫将产品下架。

所以,有没有可能有一套较为稳定的方案并且尽可能地由自己把控?(这里仅讨论使用自己 apiKey 的情况)我们使用下面两个开源项目:

  1. 使用 Openai-Proxy 提供的 deno 方案(deno 服务器在国外,但是没有被墙)搭建一个代理,用于访问 OpenAI/ChatGPT 的 API,解决墙内无法使用 apiKey 构建请求或者代理不稳定导致无法使用 ChatGPT 服务的问题。

  2. 搭建了反向代理,并且拿着我们的 apiKey ,剩下的就是去图形化聊天界面,我们使用到 ChatGPT-Next-Web,一个可以一键部署的私人 ChatGPT 网页应用。

搭建反向代理

作者是 vscode_deno 的开发者,目前也是 deno 的 contributor,所以也是想到了用自己的熟悉产品去搭建一个代理。作者给出了自己搭建好的:https://closeai.deno.dev,并且也给出了一键部署的方案,个人推荐是用自己部署的。部署方式见上面项目详情,点击部署按钮即可。

点击这个链接,可以快速一键部署到 Deno Deploy 上。然后在 Settings 选项卡里可以设置自定义二级域名,或者绑定自己的域名。

搭建成功则如下图,deno 会自动给我们分配域名(如下图黑色框中的域名)并且可以对其进行修改,此外还可以绑定自己的域名,得到这个域名,实际上我们通过访问这个域名对其发请求就是对我们搭建好的这个反向代理服务器发请求。

image.png

那么整个过程可以简单理解为:使用 ChatGPT 服务时,我使用自己的 apiKey 先向上面 deno 部署好的 “代理服务器” 发请求,这个请求再转发到官方的 api.openai.com 进行请求。

其实代码也很简单,也只有一个 main.ts

import { serve } from "https://deno.land/[email protected]/http/server.ts";
const OPENAI_API_HOST = "api.openai.com";
serve(async (request) => {
const url = new URL(request.url);
if (url.pathname === "/") {
return fetch(new URL("./Readme.md", import.meta.url));
}
url.host = OPENAI_API_HOST;
return await fetch(url, request);
});

代码的含义是:使用 Deno 编写了一个 HTTP 代理 API,来自客户端的请求被代理到 api.openai.com 主机,也就是将所有的 HTTP 请求转发到 OpenAI 服务。它使用 serve() 函数在本地启动了一个 HTTP 服务器,然后在回调函数中接受来自客户端的请求并进行处理。在每个收到的请求中,我们首先解析 URL,然后检查 URL 的路径是否为根路径 / 。如果是,返回当前程序的 Readme.md 文件(这里可以理解为我只是单纯的访问该网址,并不是真正地用 apiKey 进行 ChatGPT 服务);否则,我们将请求的目标主机设置为 api.openai.com ,然后通过 fetch() 函数将请求转发到这个主机。最后,我们将 OpenAI API 的响应返回给客户端。

部署私人 ChatGPT 网页应用

这个开源项目在官方 ChatGPT 的基础上加上了很多很实用的功能,并且提供了 Vercel 的一键部署,部署过程参见此链接或者项目详情。

值得注意的是我们如何利用上面部署好的服务器配合该网页应用进行部署呢?部署过程也有提到,在 Vercel 一键部署过程中,可以设置环境变量:BASE_URL 的 value 值来手动配置 OpenAI 接口代理,我们把我们上面得到的 deno 域名或者自己绑定好的域名填上即可,如下图,最后按下 Deploy 就算部署到 Vercel 成功,部署成功 Vercel 也会给我们分配一个域名,但是这里建议绑定自己的域名,因为 .vercel.app 域名被污染,也就是在墙内基本上是打不开了,当然官方有给出了解决方法:在进行域名解析的时候,将 CNAME 记录改为 cname-china.vercel-dns.com,A 记录地址改为:76.223.126.88,那么在墙内也能正常访问。

image.png

效果展示

效果如图。此外针对 ChatGPT-Next-Web 的部署过程可添加的环境变量,这里提醒一下:

  • OPENAI_API_KEY 你的 apiKey 值,官方文档说是必填的,但是我好像没有填也可以;
  • CODE 这个密码是指访问密码,意义在于当你 OPENAI_API_KEYCODE 都填了的情况下,只要访问你部署好的网站在设置里正确填写这个访问密码,就可以使用 ChatGPT 服务,不需要再填写 apiKey,无论在哪台设备也是如此,只要正确填写访问密码,相当于保护了你部署的这个网页;而如果 OPENAI_API_KEY 没有填,CODE 没有填,其实就相当于搭建了一个公用的只需要填写自己的 apiKey 就可以使用 ChatGPT 服务的网页(到时候在设置里面需要填写 apiKey );
  • BASE_URL 就是我们刚才部署好的代理服务器地址.

配合我们所部署好的 OpenAI 接口代理,就能在墙内环境下比较稳定地使用 ChatGPT。

总结

其实核心还是寻找一种办法来代理 OpenAI 的 API 地址,所以无论是使用一台服务器来进行反向代理(成本添加了),还是说利用一些零成本的解决方案(上面的 deno 提供的服务)又或者使用 Cloudflare Worker (使用 Cloudflare Workers 让 OpenAI API 绕过 GFW 且避免被封禁 #9)等等其实都是可以的。目前 deno 的免费用户每天有 10 万次请求,是足够使用的,并且目前看来速度也是挺快的,此方法可以试试。另外页面实现部分另外一个开源框架也不错:Chatbot UI。而对于苹果用户有客户端需求,OpenCat 也是一个不错的应用,同样也可以设置代理 OpenAI 的 API 地址,该应用支持 Mac、iPhone、iPad。

OpenCat
OpenCat
View★★★★☆
Some rights reserved
Except where otherwise noted, content on this page is licensed under a Creative Commons Attribution-NonCommercial 4.0 International license.