【优雅Max版】一键专车直达ChatGPT

前人栽树后人乘凉,再次感谢几位大佬的前期工作 :rose: :rose: :rose:

本贴主要利用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>
      `;
  }
  
9 个赞

你这个貌似没有增加任何新的功能。

2 个赞

因为好像不需要啥新功能,我想要的就是输账号认证,然后直接进入聊天页面 :rofl:

你们都优雅起来了是吧

这种用法建议按照始皇的Oauth方法改造下,避免暴露share token