|  | 
 
| 我拥有多个 refresh token,之前用来连接 chat2api,但最近发现 chat2api 经常报错,无法使用。幸运的是,这些 token 仍然可以用于登录 oaifree。我根据一位大佬的油猴脚本,修改了代码使其支持使用多个 refresh token 自动登录。使用 Claude 的帮助,我快速完成了修改,现在 gtp-4o 又可以无限量使用了。感谢吾皇! 
 // ==UserScript==
 // @name         OAIFree 多 Token 自动登录
 // @namespace    http://tampermonkey.net/
 // @version      0.3
 // @description  支持多个 refresh token,用户可随时选择 token 并自动登录,方便切换账号
 // @author       You
 // @match        https://new.oaifree.com/*
 // @grant        GM_xmlhttpRequest
 // @grant        GM_setValue
 // @grant        GM_getValue
 // @grant        GM_registerMenuCommand
 // @connect      token.oaifree.com
 // @connect      chat.oaifree.com
 // ==/UserScript==
 (function() {
 'use strict';
 // 多个 refresh token
 const refreshTokens = [
 'BlUxxxxxx',
 // 添加更多的 refresh token
 ];
 // 检查 st 是否过期
 function isSTExpired() {
 const expireAt = GM_getValue('expire_at', 0);
 console.log("st expire at: " + expireAt);
 return isNaN(expireAt) || Date.now() / 1000 >= expireAt;
 }
 // 使用 rt 获取 at
 function getAccessToken(refreshToken) {
 return new Promise((resolve, reject) => {
 GM_xmlhttpRequest({
 method: 'POST',
 url: 'https://token.oaifree.com/api/auth/refresh',
 headers: {
 'Content-Type': 'application/x-www-form-urlencoded'
 },
 data: `refresh_token=${refreshToken}`,
 onload: function(response) {
 if (response.status === 200) {
 const data = JSON.parse(response.responseText);
 if (data.access_token) {
 resolve(data.access_token);
 } else {
 reject('无法生成访问令牌,响应:' + JSON.stringify(data));
 }
 } else {
 reject('无法刷新访问令牌');
 }
 },
 onerror: function(e) {
 console.error(e);
 reject('无法刷新访问令牌');
 }
 });
 });
 }
 // 使用 at 生成 st
 function getShareToken(accessToken) {
 return new Promise((resolve, reject) => {
 GM_xmlhttpRequest({
 method: 'POST',
 url: 'https://chat.oaifree.com/token/register',
 headers: {
 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
 },
 data: `unique_name=${generateRandomHex(8)}&access_token=${accessToken}&expires_in=0&site_limit=&gpt35_limit=-1&gpt4_limit=-1&show_conversations=true`,
 onload: function(response) {
 if (response.status === 200) {
 const data = JSON.parse(response.responseText);
 GM_setValue('expire_at', data.expire_at);
 if (data.token_key) {
 resolve(data.token_key);
 } else {
 reject('无法生成共享令牌,响应:' + JSON.stringify(data));
 }
 } else {
 reject('无法生成共享令牌');
 }
 },
 onerror: function(e) {
 console.error(e);
 reject('无法生成共享令牌');
 }
 });
 });
 }
 // 生成随机字符串
 function generateRandomHex(length) {
 let result = '';
 const characters = '0123456789abcdef';
 const charactersLength = characters.length;
 for (let i = 0; i  {
 GM_registerMenuCommand(`切换到 Token ${index + 1}`, () => selectTokenAndLogin(index));
 });
 // 检查是否需要刷新 token 并自动登录(仅在登录页面执行)
 if (window.location.pathname === '/auth/login_auth0') {
 (async function() {
 try {
 let shareToken = GM_getValue("share_token");
 if (isSTExpired() || !shareToken) {
 console.log('ST 令牌已过期或未找到。请从用户脚本菜单选择一个令牌登录。');
 } else {
 console.log('ST 令牌仍然有效。自动登录...');
 autoLogin(shareToken);
 }
 } catch (error) {
 console.error(error);
 }
 })();
 }
 })();
 
 | 
 |