Table of Contents
- Step 1: 获取 Access Token
- Step 2: 获取 Share Token
- x: 获取 Refresh Token (等级够 3 了再说)
- Step 3: 网页版镜像站使用
- 登录方式
- (Optional) Step 4: API 使用(Chat2API)
- 测试
- model: gpt-4
- model: GPTs
- model: whisper
- model: tts
- model: dall-e
- 搭配起来使用
- (Optional) Step 5: 代理 backend-api/public-api(ChatGPT 后端接口)
- 总结(反代姿势):
- 注意:服务器资源问题,以上都只服务 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 2: demo.oaifree.com (别被始皇这域名误导,此为 pandora classic)
鉴于始皇这个域名太随意了,建议使用自己的域名反代掉始皇域名!看下面总结的「反代姿势」
登录方式
-
页面输入 Access Token 或 Share Token 登录
-
通过 https://chatfree.xxx.workers.dev/auth/login_share?token=fk-xxx 使用 Share Token 快捷登录
-
使用 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 反代,仅供参考
- 镜像站:
- 新款(支持 GPTs): chatfree.xxx.workers.dev => new.oaifree.com
- 经典款(不支持 GPTs 但是速度快,配合 fk-xx 完美的会话隔离):classic.xx.workers.dev 或者 pandora.xx.workers.dev => demo.oaifree.com
- 后端 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