【大佬conan已经解决】关于优雅拼车【UI】,CF代码无法通过rt去刷新at的问题

前些天,用了论坛大佬的代码,发现无法通过rt刷新at,看了半天,发现不了问题,请各位能看懂的佬,助力下,现在必须通过rt刷新出来新的at才能去使用,不然,at过期了,就无法使用。奈何自己笨拙,肯定各位佬友指教,问题出在哪里。所有代码在这里了。

代码如下

addEventListener('fetch', event => {
  event.respondWith(handleRequest(event.request))
})


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 getOAuthLink(shareToken, proxiedDomain) {
  const url = `https://${proxiedDomain}/api/auth/oauth_token`;
  const response = await fetch(url, {
      method: 'POST',
      headers: {
          'Origin': `https://${proxiedDomain}`,
          'Content-Type': 'application/json',
      },
      body: JSON.stringify({
          share_token: shareToken
      })
  })
  const data = await response.json();
  
  return data.login_url;
}

async function getShareToken(userName, at) {
  const url = 'https://chat.oaifree.com/token/register';
  const body = new URLSearchParams({
      // 此处为获取Share Token时的请求参数,可自行配置
      access_token: at,
      unique_name: userName,
      site_limit: '', // 限制的网站
      expires_in: '0', // token有效期(单位为秒),填 0 则永久有效
      gpt35_limit: '-1', // gpt3.5 对话限制
      gpt4_limit: '-1', // gpt4 对话限制
      show_conversations: 'false', // 是否显示所有人的会话
      show_userinfo: 'false', // 是否显示用户信息
      reset_limit: 'false' // 是否重置对话限制
  }).toString();
  const apiResponse = await fetch(url, {
      method: 'POST',
      headers: {
          'Content-Type': 'application/x-www-form-urlencoded'
      },
      body: body
  });
  const responseText = await apiResponse.text();
  const tokenKeyMatch = /"token_key":"([^"]+)"/.exec(responseText);
  const tokenKey = tokenKeyMatch ? tokenKeyMatch[1] : 'share token 获取失败';
  return tokenKey;
}

async function handleRequest(request) {
  const url = new URL(request.url);
  const params = new URLSearchParams(url.search);
  const userName = params.get('un');
  if (!userName) {
      // 如果没有 'un' 参数,返回 HTML 表单
      return new Response(formHtml, {
          headers: {
              'Content-Type': 'text/html; charset=utf-8'
          }
      });
  }

  

  // @ts-ignore
  // 验证用户名是否存在
  const users = await oai_global_variables.get("users");
  if (!users.split(",").includes(userName)) {
      return new Response('用户不存在', { status: 404 });
  }

  // @ts-ignore
  const accessToken = await oai_global_variables.get('at');
  if (isTokenExpired(accessToken)) {
      // 给没有refresh token的萌新用(比如我),取消下面这行注释即可享用
      // return new Response('当前access token未更新,请联系管理员更新', { status: 401 });

      // 如果 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();  // 假设服务器返回的是 JSON 格式数据
          // @ts-ignore
          accessToken = data.access_token;; // 直接从 JSON 中获取 access_token

          // @ts-ignore
          await oai_global_variables.put('at', accessToken);
      } else {
          return new Response('Error fetching access token', { status: response.status });
      }
  }
  // @ts-ignore
  //const tokenPrefix = await oai_global_variables.get('token_prefix');

  const shareToken = await getShareToken(userName, accessToken);
  if (shareToken === 'share token 获取失败') {
      return new Response('token获取失败,请刷新重试', { status: 500 });
  }

  // @ts-ignore
  const proxiedDomain = await oai_global_variables.get('proxied_domain');
  return Response.redirect(await getOAuthLink(shareToken, proxiedDomain), 302);
}
// HTML 表单代码
const formHtml = `
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style>
body {
font-family: Arial, sans-serif;
background-color: #f4f4f4;
padding: 20px;
}
form, .response-container {
background: white;
padding: 20px;
border-radius: 8px;
box-shadow: 0 2px 5px rgba(0,0,0,0.1);
max-width: 600px;
margin: 20px auto;
}
h1 {
text-align: center; 
}
h2 {
text-align: center; 
}
p {
display: block;
margin-bottom: 10px;
font-size: 16px;
}
input[type="text"], textarea {
width: calc(100% - 22px);
padding: 10px;
margin-top: 5px;
margin-bottom: 20px;
border-radius: 5px;
border: 1px solid #ccc;
}
textarea {
font-family: 'Courier New', monospace;
background-color: #f8f8f8;
height: 150px; /* Adjust height based on your needs */
}
button {
background-color: #000000;
color: white;
padding: 10px 20px;
border: none;
border-radius: 5px;
cursor: pointer;
font-size: 16px;
font-weight:600;
width:100% !important
}
button:hover {
background-color: #1e293b;
}
@media (max-width: 768px) {
body, form, .response-container {
padding: 10px;
}
}
.checkbox-group {
display: flex;
justify-content: space-between;
}
.checkbox-group input[type="checkbox"] {
margin-right: 5px;
}
.checkbox-group label {
margin-right: 10px;
}
</style>
</head>
<body>
<h1>欢迎使用_ChatGPT</h1>
<form method="GET">
<label for="unique_name">请输入独一无二的名字,以你的区分身份,用于会话隔离:</label>
<input type="text" id="un" name="un" placeholder="" required value="">
<br></br>
<button type="submit">访问使用</button>
</form>
</body>
</html>
`;

CF里面的KV存储对设置

3 个赞

目前,如果at过期的话,这里会抛出异常。也就是我说的,at过期了。如下:

 // @ts-ignore
          await oai_global_variables.put('at', accessToken);
      } else {
          return new Response('Error fetching access token', { status: response.status });
      }

@gking

蹲一下

绑定 我也想知道

用我的,我的可以

问题出在哪里呢?敢问大佬

看来,智能等大佬解决了。

没细看这个代码,用我的吧我的那个比较完善

1 个赞

其实,除了HTML的代码,js的不超过50行,除了始皇的,剩下就是十多行了,但是我想着,把这个解决下,因为,这个不会跳到始皇的new站

@ xnic

好像有了点眉头了,但是,还是刷不了,这个,在cf里面,代码不太好调试,要是Python和java都可以在idea里面搞,这个不太懂。

我回去给你看看吧,我的代码就是在这个基础上改的,我当时也改了,忘记改哪了

1 个赞

目前就看见以下几个地方1.isTokenExpired函数未判断无at时的情况,2.有几个异步函数不规范的地方,3.当at需要刷,刷新后不会立马赋值进行登陆,还需要二次刷新,,,改了下

addEventListener('fetch', event => {
  event.respondWith(handleRequest(event.request))
})


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) {
  if (!token) {
    return true;
  }
  const payload = parseJwt(token);
  const currentTime = Math.floor(Date.now() / 1000); // 获取当前时间戳(秒)
  return payload.exp < currentTime; // 检查 token 是否过期
}

async function getOAuthLink(shareToken, proxiedDomain) {
  //const url = `https://${proxiedDomain}/api/auth/oauth_token`;
  const url = `https://new.oaifree.com/api/auth/oauth_token`;
  const response = await fetch(url, {
      method: 'POST',
      headers: {
          'Origin': `https://${proxiedDomain}`,
          'Content-Type': 'application/json',
      },
      body: JSON.stringify({
          share_token: shareToken
      })
  })
  const data = await response.json();
  
  return data.login_url;
}

async function getShareToken(userName, at) {
  const url = 'https://chat.oaifree.com/token/register';
  const body = new URLSearchParams({
      // 此处为获取Share Token时的请求参数,可自行配置
      access_token: at,
      unique_name: userName,
      site_limit: '', // 限制的网站
      expires_in: '0', // token有效期(单位为秒),填 0 则永久有效
      gpt35_limit: '-1', // gpt3.5 对话限制
      gpt4_limit: '-1', // gpt4 对话限制
      show_conversations: 'false', // 是否显示所有人的会话
      show_userinfo: 'false', // 是否显示用户信息
      reset_limit: 'false' // 是否重置对话限制
  }).toString();
  const apiResponse = await fetch(url, {
      method: 'POST',
      headers: {
          'Content-Type': 'application/x-www-form-urlencoded'
      },
      body: body
  });
  const responseText = await apiResponse.text();
  const tokenKeyMatch = /"token_key":"([^"]+)"/.exec(responseText);
  const tokenKey = tokenKeyMatch ? tokenKeyMatch[1] : 'share token 获取失败';
  return tokenKey;
}

async function handleRequest(request) {
  const url = new URL(request.url);
  const params = new URLSearchParams(url.search);
  const userName = params.get('un');
  if (!userName) {
      // 如果没有 'un' 参数,返回 HTML 表单
      return new Response(formHtml, {
          headers: {
              'Content-Type': 'text/html; charset=utf-8'
          }
      });
  }

  

  // @ts-ignore
  // 验证用户名是否存在
  const users = await oai_global_variables.get("users");
  if (!users.split(",").includes(userName)) {
      return new Response('用户不存在', { status: 404 });
  }

  // @ts-ignore
  const accessToken = await oai_global_variables.get('at');
  if (isTokenExpired(accessToken)) {
      // 给没有refresh token的萌新用(比如我),取消下面这行注释即可享用
      // return new Response('当前access token未更新,请联系管理员更新', { status: 401 });

      // 如果 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();  // 假设服务器返回的是 JSON 格式数据
         
         const accessToken = data.access_token;; // 直接从 JSON 中获取 access_token

          // @ts-ignore
          await oai_global_variables.put('at', accessToken);
      } else {
          return new Response('Error fetching access token', { status: response.status });
      }
  }
  
  // @ts-ignore
  //const tokenPrefix = await oai_global_variables.get('token_prefix');
  const finalaccessToken = await oai_global_variables.get('at');
  const shareToken = await getShareToken(userName, finalaccessToken);
  if (shareToken === 'share token 获取失败') {
      return new Response('token获取失败,请刷新重试', { status: 500 });
  }
  // @ts-ignore
  const proxiedDomain = await oai_global_variables.get('proxied_domain');
  return Response.redirect(await getOAuthLink(shareToken, proxiedDomain), 302);
}
// HTML 表单代码
const formHtml = `
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style>
body {
font-family: Arial, sans-serif;
background-color: #f4f4f4;
padding: 20px;
}
form, .response-container {
background: white;
padding: 20px;
border-radius: 8px;
box-shadow: 0 2px 5px rgba(0,0,0,0.1);
max-width: 600px;
margin: 20px auto;
}
h1 {
text-align: center; 
}
h2 {
text-align: center; 
}
p {
display: block;
margin-bottom: 10px;
font-size: 16px;
}
input[type="text"], textarea {
width: calc(100% - 22px);
padding: 10px;
margin-top: 5px;
margin-bottom: 20px;
border-radius: 5px;
border: 1px solid #ccc;
}
textarea {
font-family: 'Courier New', monospace;
background-color: #f8f8f8;
height: 150px; /* Adjust height based on your needs */
}
button {
background-color: #000000;
color: white;
padding: 10px 20px;
border: none;
border-radius: 5px;
cursor: pointer;
font-size: 16px;
font-weight:600;
width:100% !important
}
button:hover {
background-color: #1e293b;
}
@media (max-width: 768px) {
body, form, .response-container {
padding: 10px;
}
}
.checkbox-group {
display: flex;
justify-content: space-between;
}
.checkbox-group input[type="checkbox"] {
margin-right: 5px;
}
.checkbox-group label {
margin-right: 10px;
}
</style>
</head>
<body>
<h1>欢迎使用_ChatGPT</h1>
<form method="GET">
<label for="unique_name">请输入独一无二的名字,以你的区分身份,用于会话隔离:</label>
<input type="text" id="un" name="un" placeholder="" required value="">
<br></br>
<button type="submit">访问使用</button>
</form>
</body>
</html>
`;

大佬,我给你发rt哈。你试试看,能刷新不

这个是我一个月的plus号,才开的,作为礼物,送你了哈。感谢大佬

各位和我一样不懂的朋友,可以参考下,由于无法编辑了,移步楼下了。再次感谢大佬

我天,感谢佬友