|
我拥有多个 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);
}
})();
}
})();
|
|