本文基于上面这位佬的帖子,稍作修改,支持多个账号的accesstoken刷新以及账号的随机调用。
适合用户:
- 拥有cloudflare账号
- 拥有chatgpt plus订阅账号
- 获取到账号的access_token和refresh_token
步骤:
- 获取账号refresh_token和access_token,可以参考奥特曼佬的帖子
-
在KV中创建命名空间,命名空间名字随便填写,然后添加
-
在刚才创建的命名空间中添加如下三个键值对
- 键:
at_array
值:["xxxxxxxx","xxxxxxxxx"...]
,数组是多个access_token - 键:
rt_array
值:["xxxxxxxx","xxxxxxxxx"...]
,数组是多个refresh_token,与上面access_token一一对应,每一对是一个账号的rt和at - 键:
auth_key
值:随便填,充当api_key的角色。
-
为worker绑定之前创建的命名空间,变量名称必须是
oai_global_variables
-
创建worker,部署如下代码:
addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request))
})
function parseJwt(token) {
const base64Url = token.split('.')[1]; // 获取载荷部分
const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/'); // 将 Base64Url 转为 Base64
const jsonPayload = decodeURIComponent(atob(base64).split('').map(function (c) {
return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
}).join(''));
return JSON.parse(jsonPayload); // 返回载荷解析后的 JSON 对象
}
function isTokenExpired(token) {
const payload = parseJwt(token);
const currentTime = Math.floor(Date.now() / 1000); // 获取当前时间戳(秒)
return payload.exp < currentTime; // 检查 token 是否过期
}
async function handleRequest(request) {
// 1. 目标反代 URL
const url = new URL(request.url);
url.host = 'api.oaifree.com';
// 2. 获取 Authorization header
const authHeader = request.headers.get('Authorization');
const apikey = authHeader ? authHeader.split(' ')[1] : null;
// 3. 检查 token
const auth_key = await oai_global_variables.get('auth_key')
if (!apikey || apikey !== auth_key) {
// 4. Token 验证失败
return new Response('Unauthorized', { status: 401 });
}
// ------------ get at
// 随机选择一个令牌并检查是否过期
const jsontokens = await oai_global_variables.get('at_array'); // 这里假设令牌数组存储在'at_array'键下
const jsonrefreshTokens = await oai_global_variables.get('rt_array'); // 刷新令牌数组存储在'rt_array'键下
const tokens = JSON.parse(jsontokens);
const refreshTokens = JSON.parse(jsonrefreshTokens);
// 随机选择索引
const randomIndex = Math.floor(Math.random() * tokens.length);
let token = tokens[randomIndex];
//const token = await oai_global_variables.get('at'); // 这里填入你的 JWT
if (isTokenExpired(token)) {
// 如果 Token 过期,执行获取新 Token 的逻辑
const url = 'https://token.oaifree.com/api/auth/refresh';
// @ts-ignore
const refreshToken = refreshTokens[randomIndex]; // 获取对应的刷新令牌
console.log(refreshToken);
// const refreshToken = await oai_global_variables.get('rt'); // 实际情况下你可能会从某处获取这个值
// 发送 POST 请求
const response = await fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8'
},
body: `refresh_token=${refreshToken}`
});
// 检查响应状态
if (response.ok) {
const data = await response.json();
// const token = data.access_token;
// @ts-ignore
// await oai_global_variables.put('at', token);
const newToken = data.access_token;
// 更新数组中的令牌
tokens[randomIndex] = newToken;
token = newToken;
// 将更新后的数组存回 KV 数据库
await oai_global_variables.put('at_array', JSON.stringify(tokens));
} else {
return response
}
}
// 如果 Token 未过期,继续执行原来的逻
// 5. 替换 token 并转发请求
const modifiedHeaders = new Headers(request.headers);
modifiedHeaders.set('Authorization', 'Bearer '+token);
// 创建新的请求对象以转发
const newRequest = new Request(url, {
method: request.method,
headers: modifiedHeaders,
body: request.body
});
// 发送新的请求到目标 API
const response = await fetch(newRequest);
return response;
}
- 接下来就是愉快的调用。
水个5分。美滋滋