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

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

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

好的,佬

From 快问快答 to 开发调优

1 个赞

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

:tieba_068:升三级 拿rt

2 个赞

我升3级就是为了这个