一元网络论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 64|回复: 0

油猴脚本,自动登录new.oaifree.com,无需手动刷新token。

[复制链接]

2万

主题

2万

帖子

8万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
88978
发表于 2024-10-24 06:27:24 | 显示全部楼层 |阅读模式
我拥有多个 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);
            }
        })();
    }
})();
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|一元网络论坛

GMT+8, 2024-11-15 06:51 , Processed in 0.067847 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表