用Cloudflare Workers搭建OpenAI的API代理(适合个人使用)

6,222 阅读3分钟

一、前言

大家都知道ChatGPT有多火暴,从最开始能正常访问(chat.openai.com/chat),到后来被墙…

可能很多人没有使用过Cloudflare(官网:www.cloudflare-cn.com/),这里将使用 Cloudflare的worker来实现代理。主要思路是使用 Cloudflare 的 Workers 来代理 OpenAI 的 API 地址,配合自己的域名即可在境内实现访问。因为 Cloudflare Workers 有每天免费 10 万次的请求额度,也可以找到免费注册的域名,所以几乎可以说是零成本。

二、使用这个方案需要你有以下东西

1、一个没有被 GFW 认证的域名,可以自行注册,或者找免费的。

2、一个 Cloudflare帐号,如果没有话,可以注册一个。

三、操作过程

由于 Cloudflare 创建的Worker作为http代理时,生成的xx.xx.workers.dev的域名已被GFW认证,所以必须替换为不被GFW认证的域名。如果要在 Cloudflare的workers上替换成自己的域名,Cloudflare要求顶级域名必须托管在他的平台上,所以第一步先要在Cloudflare上添加自己的域名,然后到域名解析那里调整对的DNS。

1、在Cloudflare上添加域名

 登录帐号到Cloudflare的控制台上,如下图:

点击上图的红框,进入到“网站”管理的界面

点击添加按钮,按要求填写上你的域名。

选择Free的版本,然后点击Continute继续,在接下来的界面继续点击Continute,到如下图的界面:

需要登录到你的域名注册商那里,将域名的DNS解析,改为上面红框中的,改完之后,点击下面的“Done, check nameservers",这一步就基本完成,让其他自行去解析,这一步需要一点时间,先去配置Workers。

2、 配置Cloudflare Workers

在主界面的左边,找到Worders,点击进出,如果是第一次,界面上是默认给你初始化好了,直接点击下面的按钮继续就可以。

操作之后,会进入到另外一个界面,如下图,在左边的编辑框中,编写对应的js脚本。

const TELEGRAPH_URL = 'https://api.openai.com';

addEventListener('fetch', event => {
  event.respondWith(handleRequest(event.request))
})

async function handleRequest(request) {
  const url = new URL(request.url);
  url.host = TELEGRAPH_URL.replace(/^https?:\/\//, '');

  const modifiedRequest = new Request(url.toString(), {
    headers: request.headers,
    method: request.method,
    body: request.body,
    redirect: 'follow'
  });

  const response = await fetch(modifiedRequest);
  const modifiedResponse = new Response(response.body, response);

  // 添加允许跨域访问的响应头
  modifiedResponse.headers.set('Access-Control-Allow-Origin', '*');

  return modifiedResponse;
}

简化后的代码来自 github.com/x-dr/chatgp…

填写完成后,点击下面的“save and deploy“。就可以了。

3、配置自己的域名

在worker的主界面上,点击Triggers,进入到绑定域名的界面,然后点击“add custom domain“,进入添加域名的界面。

添加好域名后,你就可以通过自己的域名来访问OpenAI的API了。当然,这里最好是在websites管理那里,开启域名的https,这样会更好。

一切配置好后,就可以通过自己民的域名来访问OpenAI的API了,将OpenAI的API是的地址中的域名部分api.openai.com/v1/completi…

当然,前提还是你要有一个OpenAI的api-key才行。

最后来看下效果图:

好了,以上操作当作记录,也方便更多人能去使用,由于有次数限制,比较适合个人使用。