【05/15 更新优雅反代】【新手教程】oaifree 喂饭级 Step-by-step 一步步打开潘多拉

Table of Contents

  1. Step 1: 获取 Access Token
  2. Step 2: 获取 Share Token
    1. x: 获取 Refresh Token (等级够 3 了再说)
  3. Step 3: 网页版镜像站使用
    1. 登录方式
  4. (Optional) Step 4: API 使用(Chat2API)
    1. 测试
      1. model: gpt-4
      2. model: GPTs
      3. model: whisper
      4. model: tts
      5. model: dall-e
    2. 搭配起来使用
  5. (Optional) Step 5: 代理 backend-api/public-api(ChatGPT 后端接口)
  6. 总结(反代姿势):
  7. 注意:服务器资源问题,以上都只服务 ChatGPT Plus / Teams 账号(不过 Plus 账号的 3.5 可用)。

Step 1: 获取 Access Token

ChatGPT 官方的 Access Token

原帖: https://linux.do/t/topic/40591

Step 2: 获取 Share Token

使用 Step 1 获取到的 Access Token 来获取 Share Token。
Share Token 是基于 Access Token 套了一层,更短,更安全,可用来分享。
同一个名字的 Share Token 理论应该是保持不变的,access token 过期之后(7 天),
你需要做的事就是更新这个 Share Token 对应的 Access Token。

x: 获取 Refresh Token (等级够 3 了再说)

Step 3: 网页版镜像站使用

目前还未支持之前 pandora 的会话隔离,主要是是

Option 1: new.oaifree.com

  • 支持 GPTs!
  • 可以隔离!
  • 可以免墙!

Option 2: demo.oaifree.com (别被始皇这域名误导,此为 pandora classic)

  • 不支持 GPTs!
  • 但是:轻量速度快!
  • 同上!

鉴于始皇这个域名太随意了,建议使用自己的域名反代掉始皇域名!看下面总结的「反代姿势」:point_down:

登录方式

  1. 页面输入 Access Token 或 Share Token 登录

  2. 通过 https://chatfree.xxx.workers.dev/auth/login_share?token=fk-xxx 使用 Share Token 快捷登录

  3. 使用 https://chatfree.xxx.workers.dev/api/auth/oauth_token 接口创建 OAuth Token 登录。此种方式类似于 Share Token 快捷登录,但是不会泄露 Share Token ,便于集成。登录链接也只能使用一次,3分钟有效。接口使用方法如下:

     curl 'https://chatfree.xxx.workers.dev/api/auth/oauth_token' \
     -H 'Origin: https://chatfree.xxx.workers.dev' \
     -H 'Content-Type: application/json' \
     -d '{"share_token": "fk-xxx"}' | jq .login_url
    

会返回 JSON:

{
    "login_url": "https://chatfree.xxx.workers.dev/auth/login_oauth?token=xxx",
    "oauth_token": "xxx"
}

访问 login_url 即可直接登录。 这也太好用了!!

原帖: https://linux.do/t/topic/59728

(Optional) Step 4: API 使用(Chat2API)

不用多说了,有个 Plus/Team 基本就够自己个人 API Free 了!(另外用官方 platform API 也容易被封号)。

测试

model: gpt-4

curl https://apifree.xxx.workers.dev/v1/chat/completions \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer sk-xxx' \
  -d '{
    "model": "gpt-4",
    "stream": false,
    "messages": [
      {
        "role": "user",
        "content": "you are ChatGPT based on GPT-3.5 or GPT-4? your knowledge cutoff date is? answer concisely: "
      }
    ]
  }' | jq .choices[0].message

{
  "role": "assistant",
  "content": "I am based on the GPT-4 architecture, and my knowledge cutoff date is December 2023."
}

model: GPTs

curl https://apifree.xxx.workers.dev/v1/chat/completions \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer sk-xxx' \
  -d '{
    "model": "g-2DQzU5UZl",
    "stream": false,
    "messages": [
      {
        "role": "user",
        "content": "you are ChatGPT based on GPT-3.5 or GPT-4? your knowledge cutoff date is? answer concisely: "
      }
    ]
  }' | jq .choices[0].message

{
  "role": "assistant",
  "content": "I am based on GPT-4, and my knowledge cutoff date is December 2023."
}

model: whisper

model: tts

model: dall-e

原帖: https://linux.do/t/topic/50789

搭配起来使用

completions + whisper + tts

(Optional) Step 5: 代理 backend-api/public-api(ChatGPT 后端接口)

基于 ChatGPT 后端接口可以糊自己的 UI,也可以获取到一些未开放的数据,比如 GPTs 的详细数据。

原帖: https://linux.do/t/topic/53338

总结(反代姿势):

为了方便,我随便糊了两个 Cloudflare workers 反代,仅供参考

  1. 镜像站:
  • 新款(支持 GPTs): chatfree.xxx.workers.dev => new.oaifree.com
  • 经典款(不支持 GPTs 但是速度快,配合 fk-xx 完美的会话隔离):classic.xx.workers.dev 或者 pandora.xx.workers.dev => demo.oaifree.com
  1. 后端 API & Chat2API:

1. chatfree 镜像站

这个就随便用上面 Step 3 的就行。

新建一个 Worker,粘贴以下代码,部署,然后 Settings > Triggers > Add Custom Domain,填写你的域名(域名 必须解析到 Cloudflare)。

export default {
  async fetch(request, env) {
    const url = new URL(request.url);
    url.host = 'new.oaifree.com'; // 'demo.oaifree.com'
    return fetch(new Request(url, request))
  }
}

2. 后端 API & Chat2API

在 wokers env vars 里配置下面几个字段食用:

  • API_KEY: 随便定义自己的 API Key,比如 sk-fucking-real-api-free;
  • ACCESS_TOKEN: 暂时没有 Refresh Token, 填入获取到的 Access Token,支持多个账号的 ac, 用 , 分割;
  • CHATGPT_ACCOUNT_ID: 可选,Teams 账号填入账号 uuid;
worker.js
export default {
  async fetch(request, env) {
    const url = new URL(request.url);
    console.log(`Received request for URL: ${request.url}`);

    if (url.pathname.startsWith('/v1/')) {
      url.host = 'api.oaifree.com';
      if (['POST', 'PUT'].includes(request.method)) {
        const reqBody = await request.json();
        if (reqBody && reqBody.model) {
          reqBody.model = reqBody.model.replace('gpt-4-gizmo-', '');
          request = new Request(request.url, {
            method: request.method,
            headers: request.headers,
            body: JSON.stringify(reqBody)
          });
        }
      }
    } else if (['/backend-api/', '/public-api/'].some(path => url.pathname.startsWith(path))) {
      url.host = 'chat.oaifree.com';
      url.pathname = `/dad04481-fa3f-494e-b90c-b822128073e5${url.pathname}`;
    } else if (['/token', '/static', '/cdn-cgi'].some(path => url.pathname.startsWith(path))) {
      url.host = 'chat.oaifree.com';
      return fetch(url.toString(), request);
    } else {
      url.host = 'chat.oaifree.com';
    }

    const incomingApiKey = request.headers.get('Authorization')?.replace('Bearer ', '');
    if (incomingApiKey !== env.API_KEY) {
      console.error('Invalid API Key');
      return new Response('Invalid API Key', { status: 401 });
    }

    const tokens = env.ACCESS_TOKEN.split(',');
    let retryCount = 0;

    while (retryCount < tokens.length) {
      const headers = new Headers(request.headers);
      let authorizationKey = `Bearer ${tokens[retryCount]}`;
      if (env.CHATGPT_ACCOUNT_ID) {
        authorizationKey += `,${env.CHATGPT_ACCOUNT_ID}`;
      }
      headers.set('Authorization', authorizationKey);

      for (const key of headers.keys()) {
        if (key.toLowerCase().startsWith('x-') && key !== 'x-api-key') {
          headers.delete(key);
        }
      }

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

      console.log(`Attempting fetch with token index ${retryCount}`);
      const response = await fetch(modifiedRequest);
      if (response.ok) {
        console.log(`Request successful with token index ${retryCount}`);
        return response;
      }

      console.warn(`Request failed with token index ${retryCount}, status: ${response.status}`);
      retryCount++;
    }

    console.error('All tokens failed after retries');
    return new Response('All tokens failed', { status: 401 });
  },
};

更新

Example 使用方法:

    curl https://apifree.<你的 CF 用户名>.workers.dev/v1/chat/completions \ # 建议搞个域名免墙
      -H 'Content-Type: application/json' \
      -H 'Authorization: Bearer sk-fucking-real-api-free' \
      -d '{
        "model": "g-2DQzU5UZl", 
        "stream": false,
        "messages": [
          {
            "role": "user",
            "content": "you are ChatGPT based on GPT-3.5 or GPT-4? your knowledge cutoff date is? answer concisely: "
          }
        ]
      }' | jq .choices[0].message

注意:服务器资源问题,以上都只服务 ChatGPT Plus / Teams 账号(不过 Plus 账号的 3.5 可用)。

水第一贴(还不知道多少分)到手 [抱拳]

整理都来自: https://linux.do/t/topic/47799

267 Likes

感谢分享 慢慢学习

8 Likes

前排

7 Likes

佬,学到了 :smiling_face:

5 Likes

感谢整理

5 Likes

好好好,我承认你是最细的男银 :grinning:

7 Likes

感谢分享

6 Likes

感谢佬,整理辛苦了,很详细 :+1: :+1: :+1:

7 Likes

膜拜大佬

6 Likes

就冲你辛辛苦苦整理出来,点个赞 :+1:

7 Likes

感谢分享,对新手很友好。

8 Likes

新手友好,感谢感谢

6 Likes

佬厉害

7 Likes

真丶喂饭级教程

6 Likes

mark :bangbang:

6 Likes

喂得还是细糠

6 Likes

不戳,针不戳

5 Likes

缺一个 plus

5 Likes

逐渐疯狂。

6 Likes

没plus,全剧终

6 Likes