OpenAI Token 增强管理

通过简单的界面操作增强您的OpenAI聊天体验,轻松获取和复制Access Token。面板始终可见,可手动最小化。

当前为 2024-09-29 提交的版本,查看 最新版本

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         OpenAI Token 增强管理
// @namespace    http://tampermonkey.net/
// @version      3.0
// @description  通过简单的界面操作增强您的OpenAI聊天体验,轻松获取和复制Access Token。面板始终可见,可手动最小化。
// @author       Yongmo & GPT-4 & Claude
// @match        https://chat.openai.com/*
// @match        https://chatgpt.com/*
// @grant        GM_setClipboard
// @grant        GM_addStyle
// @run-at       document-start
// ==/UserScript==

(function() {
    'use strict';

    // 样式定义
    const styles = `
        #openai-token-panel {
            position: fixed;
            top: 20px;
            right: 20px;
            z-index: 10000;
            padding: 15px;
            border: 1px solid #ccc;
            border-radius: 12px;
            background: white;
            box-shadow: 0 4px 8px rgba(0,0,0,0.3);
            font-family: "Microsoft YaHei", sans-serif;
            display: flex;
            flex-direction: column;
            align-items: start;
            transition: all 0.3s ease-in-out;
        }
        #openai-token-panel.minimized {
            width: 40px;
            height: 40px;
            overflow: hidden;
            padding: 0;
            border-radius: 50%;
            cursor: pointer;
        }
        #openai-token-panel.minimized:hover {
            background-color: #f0f0f0;
        }
        #openai-token-panel button {
            margin-bottom: 10px;
            padding: 8px 15px;
            border: none;
            border-radius: 6px;
            color: white;
            cursor: pointer;
            font-size: 14px;
            width: 100%;
            text-align: center;
            transition: background-color 0.2s;
        }
        #openai-token-panel button:hover {
            filter: brightness(1.1);
        }
        #openai-token-display {
            width: 100%;
            height: 60px;
            margin-bottom: 10px;
            padding: 10px;
            border-radius: 6px;
            border: 1px solid #ccc;
            resize: vertical;
        }
        #expand-button {
            display: none;
            width: 40px;
            height: 40px;
            border-radius: 50%;
            background-color: #007bff;
            color: white;
            font-size: 20px;
            line-height: 40px;
            text-align: center;
        }
        #openai-token-panel.minimized #expand-button {
            display: block;
        }
    `;

    // 添加样式到页面
    GM_addStyle(styles);

    // 创建面板元素
    function createPanel() {
        const panel = document.createElement('div');
        panel.id = 'openai-token-panel';
        panel.innerHTML = `
            <button id="fetch-token" style="background-color: #28a745;">获取 AccessToken</button>
            <textarea id="openai-token-display" placeholder="AccessToken 将显示在这里"></textarea>
            <button id="copy-token" style="background-color: #007bff;">复制 AccessToken</button>
            <button id="toggle-panel" style="background-color: #ffc107;">最小化面板</button>
            <div id="expand-button">+</div>
        `;
        return panel;
    }

    // 获取AccessToken
    async function fetchAccessToken() {
        try {
            const response = await fetch("https://chatgpt.com/api/auth/session");
            if (!response.ok) throw new Error(`HTTP 错误! 状态: ${response.status}`);
            const { accessToken } = await response.json();
            if (!accessToken) throw new Error('响应中未找到 Access Token.');
            return accessToken;
        } catch (error) {
            console.error('获取 Access Token 失败:', error);
            alert('获取 Access Token 失败: ' + error.message);
        }
    }

    // 复制到剪贴板
    function copyToClipboard(accessToken) {
        const message = `ChatGPT Plus国内使用网址:https://new.oaifree.com\n\nAccessToken转ShareToken网址:https://chat.oaifree.com/token\n\nAccessToken号码:${accessToken}`;
        GM_setClipboard(message);
        alert('已复制到剪贴板:\n' + message);
    }

    // 初始化函数
    function init() {
        if (document.getElementById('openai-token-panel')) return;

        const panel = createPanel();
        document.body.appendChild(panel);

        const btnFetchToken = document.getElementById('fetch-token');
        const accessTokenDisplay = document.getElementById('openai-token-display');
        const btnCopyAccessToken = document.getElementById('copy-token');
        const btnTogglePanel = document.getElementById('toggle-panel');
        const expandButton = document.getElementById('expand-button');

        btnFetchToken.onclick = async () => {
            btnFetchToken.disabled = true;
            btnFetchToken.textContent = '获取中...';
            const accessToken = await fetchAccessToken();
            if (accessToken) accessTokenDisplay.value = accessToken;
            btnFetchToken.disabled = false;
            btnFetchToken.textContent = '获取 AccessToken';
        };

        btnCopyAccessToken.onclick = () => {
            const accessToken = accessTokenDisplay.value.trim();
            if (!accessToken) {
                alert('请先获取有效的 AccessToken.');
                return;
            }
            copyToClipboard(accessToken);
        };

        btnTogglePanel.onclick = () => {
            panel.classList.add('minimized');
        };

        expandButton.onclick = (e) => {
            e.stopPropagation();
            panel.classList.remove('minimized');
        };

        // 自动获取Token
        setTimeout(() => btnFetchToken.click(), 1000);
    }

    // 确保在DOM加载完成后执行初始化并持续监听DOM变化
    function ensureInit() {
        if (document.body) {
            init();

            // 使用 MutationObserver 来持续监听 DOM 变化
            const observer = new MutationObserver(() => {
                if (!document.getElementById('openai-token-panel')) {
                    init();
                }
            });

            observer.observe(document.body, {
                childList: true,
                subtree: true
            });
        } else {
            setTimeout(ensureInit, 100);
        }
    }

    // 初次执行
    ensureInit();
})();