反代 new.oaifree.com 能实现什么额外的功能?

对此不太了解,从始皇的教程里看,反代似乎只是将访问的域名更改了为自己的,除此之外能做什么额外的操作来实现额外的功能吗?

你编程可以实现各种你想要的功能啊。比如 Shared Chat 就是反代的基础上改的。还能改拼车什么的

你可以自己加入账号管理的功能,登录后自动用账号密码获取refreshToken。
可以复刻Share Chat 账号池,论坛里有教程的,就是挺复杂的。

我自己主要是始皇的域名目标太大了,容易被某些运营商墙,就自己反代一下。

参考这个帖子

可以分享出去呀

搞个账号池给不想折腾的朋友简单用用

谢谢始皇回复,我理解的是例如 cf 反代,是通过 worker 编写 JS 代码来实现对原站的增强。我使用的是 Nginx 反代,Nginx 本身应该无法实现类似 worker 的功能吧,需要再引入一个外部 Node.js 服务才能实现这些增强的逻辑吗

new怎么搞账号池啊,有没有喂饭教程?

这个吗


我改了一个,给一些朋友用,输入他们的微信号就可以使用了

厉害,是怎么做到的,是 cf 还是 nginx反代,有基于哪个帖子可以参考吗?

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配置

我的理解就是只有防止被墙的作用…

佬,请问new站想在登录成功后进入聊天界面时出现一个弹窗,提示一些消息,请问该怎么实现。改反代的works代码可以实现吗?

可以把,具体问gpt4

好的,佬

但是 获取到的 Access Token 有效期为10 天,还是需要每10天维护一次

:tieba_068:升三级 拿rt

我升3级就是为了这个