对此不太了解,从始皇的教程里看,反代似乎只是将访问的域名更改了为自己的,除此之外能做什么额外的操作来实现额外的功能吗?
76 个赞
你编程可以实现各种你想要的功能啊。比如 Shared Chat 就是反代的基础上改的。还能改拼车什么的
7 个赞
你可以自己加入账号管理的功能,登录后自动用账号密码获取refreshToken。
可以复刻Share Chat 账号池,论坛里有教程的,就是挺复杂的。
我自己主要是始皇的域名目标太大了,容易被某些运营商墙,就自己反代一下。
2 个赞
参考这个帖子
1 个赞
可以分享出去呀
搞个账号池给不想折腾的朋友简单用用
1 个赞
谢谢始皇回复,我理解的是例如 cf 反代,是通过 worker 编写 JS 代码来实现对原站的增强。我使用的是 Nginx 反代,Nginx 本身应该无法实现类似 worker 的功能吧,需要再引入一个外部 Node.js 服务才能实现这些增强的逻辑吗
new怎么搞账号池啊,有没有喂饭教程?
这个吗
厉害,是怎么做到的,是 cf 还是 nginx反代,有基于哪个帖子可以参考吗?
1 个赞
CF
代码
export default {
async fetch(request, env) {
const oai_free_kv = env.oai_free_kv;
const url = new URL(request.url);
url.host = 'new.oaifree.com';
if (url.pathname === '/auth/login_auth0') {
const html = `
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>oai free login</title>
<script src="https://cdn.tailwindcss.com"></script>
<link href="https://fonts.googleapis.com/css2?family=Roboto:wght@400;700&display=swap" rel="stylesheet">
<style>
body {
font-family: 'Roboto', sans-serif;
}
.loading {
border-top-color: transparent;
animation: spin 1s linear infinite;
border: 4px solid #fff;
border-radius: 50%;
border-top: 4px solid #3498db;
width: 24px;
height: 24px;
}
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
</style>
</head>
<body class="bg-gray-100 flex justify-center items-center min-h-screen">
<div class="max-w-md w-full space-y-6 p-6 bg-white shadow-lg rounded-lg">
<div class="text-2xl font-bold text-center">
Continue with Access Token
</div>
<div>
<textarea id="tokenInput" class="w-full h-24 border border-gray-300 p-3 text-lg rounded-lg focus:border-blue-500 focus:ring focus:ring-blue-200" placeholder="Please input access token / share token..."></textarea>
</div>
<div class="flex justify-center items-center space-x-4">
<button id="okButton" class="w-24 h-10 bg-teal-500 text-white font-bold rounded-md hover:bg-teal-600 flex justify-center items-center">
<span class="button-text">OK</span>
<div id="loadingSpinner" class="ml-2 hidden loading"></div>
</button>
</div>
<div id="message" class="mt-4 text-center"></div>
</div>
<script>
document.getElementById('okButton').addEventListener('click', async () => {
const tokenInput = document.getElementById('tokenInput').value.trim();
const buttonText = document.querySelector('.button-text');
const loadingSpinner = document.getElementById('loadingSpinner');
const message = document.getElementById('message');
if (tokenInput) {
buttonText.classList.add('hidden');
loadingSpinner.classList.remove('hidden');
try {
const response = await fetch('/auth/login_token', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
body: new URLSearchParams({ access_token: tokenInput, action: 'token' })
});
const data = await response.json();
if (data.fk) {
message.textContent = 'Success! Redirecting...';
message.classList.remove('text-red-500');
message.classList.add('text-green-500');
setTimeout(() => {
window.location.href = '/auth/login_share?token=' + data.fk;
}, 1000);
} else {
message.textContent = 'Invalid response from server';
message.classList.add('text-red-500');
}
} catch (error) {
console.error('Error:', error);
message.textContent = 'An error occurred while submitting the token.';
message.classList.add('text-red-500');
} finally {
buttonText.classList.remove('hidden');
loadingSpinner.classList.add('hidden');
}
} else {
message.textContent = 'Please input access token / share token.';
message.classList.add('text-red-500');
}
});
</script>
</body>
</html>
`;
return new Response(html, {
headers: {
'content-type': 'text/html;charset=UTF-8',
}
});
}
if (url.pathname === '/auth/login_token' && request.method === 'POST') {
const requestBody = await request.text();
const params = new URLSearchParams(requestBody);
const accessToken = params.get('access_token');
console.log('111111')
if (accessToken) {
const user_list = await oai_free_kv.get('user_list') || '';
const userList = user_list.split(',');
if (userList.includes(accessToken)) {
const refreshToken = await oai_free_kv.get(accessToken);
const response = await fetch("https://token.oaifree.com/api/auth/refresh", {
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 ac = data.access_token;
const fk = await registerToken(ac, accessToken);
return new Response(JSON.stringify({ fk, access_token: ac }), {
headers: {
'Content-Type': 'application/json',
},
});
}
} else {
console.log('22222222')
if (accessToken.startsWith('fk-')) {
console.log('3333333')
return new Response(JSON.stringify({ fk: accessToken }), {
headers: {
'Content-Type': 'application/json',
},
})
} else {
console.log('111111')
const fk = await registerToken(accessToken, 'nicholas');
console.log('fk===' + fk)
return new Response(JSON.stringify({ fk, access_token: accessToken }), {
headers: {
'Content-Type': 'application/json',
},
});
}
}
}
}
const modifiedRequest = new Request(url, request);
modifiedRequest.headers.set('X-Voice-Base', 'https://voice.xxxx.xxxxx'); ///xxxx 你自己的域名
// return fetch(new Request(url, modifiedRequest));
return fetch(modifiedRequest);
}
}
async function registerToken(accessToken, uniqueName) {
const response = await fetch('https://chat.oaifree.com/token/register', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
},
body: new URLSearchParams({
'unique_name': generate8DigitUUID(),
'access_token': accessToken,
'expires_in': '0',
'site_limit': '',
'gpt35_limit': '-1',
'gpt4_limit': '-1',
'show_conversations': 'true'
})
});
const result = await response.json();
console.log(result)
return result.token_key;
}
function generate8DigitUUID() {
// 生成一个8位数的随机字符串
return 'xxxxxxxx'.replace(/x/g, () => {
return (Math.random() * 36 | 0).toString(36)
}).toUpperCase()
}
oai_free_kv配置
9 个赞
我的理解就是只有防止被墙的作用…
佬,请问new站想在登录成功后进入聊天界面时出现一个弹窗,提示一些消息,请问该怎么实现。改反代的works代码可以实现吗?
可以把,具体问gpt4
好的,佬
升三级 拿rt
2 个赞
我升3级就是为了这个


