前人栽树后人乘凉,再次感谢几位大佬的前期工作
:
本贴主要利用GPT糊了一下workers代码,优化如下:
- 去除使用比较少sharetoken的选项配置,如需要可自定义变量进行传入配置
- 添加登录框,通过定义USERS变量区分使用用户,并以USER名称作为sharetoken的uniqueName
- 支持一键登录专车直达始皇新站
本贴使用参数为:
USERS:用户名列表,以英文逗号作为分隔符,例如user1,user2
YOUR_DOMAIN:直接填写new.oaifree.com或者你反代的new站
at:
rt:
话不多说,基于前面各位佬的操作,直接贴workers代码了就,本人不懂JS,都是GPT完成的,若有问题欢迎各位佬指导一二
addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request))
})
async function handleRequest(request) {
const YOUR_DOMAIN = await oai_global_variables.get('YOUR_DOMAIN');
if (request.method === "POST") {
return handleLoginAttempt(request);
}
return new Response(loginHtml(), {
headers: {
'Content-Type': 'text/html; charset=utf-8'
},
});
}
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 handleLoginAttempt(request) {
const formData = await request.formData();
const userName = formData.get('username');
const USERS = await oai_global_variables.get('USERS'); // 从KV存储中获取用户列表,以user1,user2...等进行区分多用户
const token = await oai_global_variables.get('at');
const YOUR_DOMAIN = await oai_global_variables.get('YOUR_DOMAIN');
const validUserNames = USERS.split(",");
if (validUserNames.includes(userName)) {
const url = 'https://chat.oaifree.com/token/register';
if (isTokenExpired(token)) {
// 如果 Token 过期,执行获取新 Token 的逻辑
const url = 'https://token.oaifree.com/api/auth/refresh';
// @ts-ignore
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);
} else {
return new Response('Error fetching access token', { status: response.status });
}
}
const body = new URLSearchParams({
unique_name: userName,
access_token: token,
site_limit: '',
expires_in: '0',
gpt35_limit: '-1',
gpt4_limit: '-1',
show_conversations: 'false',
reset_limit: 'false'
}).toString();
try {
const response = await fetch(url, {
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
body: body
});
if (response.ok) {
const data = await response.text();
const domain = YOUR_DOMAIN
const tokenKeyMatch = /"token_key":"([^"]+)"/.exec(data);
const tokenKey = tokenKeyMatch ? tokenKeyMatch[1] : '未找到 Share_token';
return Response.redirect(`https://${domain}/auth/login_share?token=${tokenKey}`);
}
throw new Error('Token获取失败');
} catch (error) {
return new Response(error.message, { status: 500 });
}
} else {
return new Response("无效用户名,请重试", { status: 401 });
}
}
function loginHtml() {
return `
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>Login</title>
<style>
body, html {
height: 100%;
margin: 0;
display: flex;
align-items: center;
justify-content: center;
background-color: #f4f4f4;
font-family: 'Arial', sans-serif;
}
.login-container {
background-color: #fff;
padding: 40px;
border-radius: 10px;
box-shadow: 0 4px 8px rgba(0,0,0,0.1);
text-align: center;
}
.login-container input {
width: calc(100% - 20px);
padding: 10px;
margin: 10px 0;
border: 1px solid #ccc;
border-radius: 5px;
}
.login-button {
width: 100%;
padding: 10px;
border: none;
background-color: #009688;
color: white;
border-radius: 5px;
cursor: pointer;
}
.login-button:hover {
background-color: #00796b;
}
.hint-text {
color: #777;
font-size: 14px;
}
</style>
</head>
<body>
<div class="login-container">
<h3>欢迎使用ChatGPT</h3>
<form method="POST">
<input type="text" id="username" placeholder="请输入用户名" name="username" required>
<button class="login-button">登录</button>
</form>
</div>
</body>
</html>
`;
}