Greasy Fork is available in English.

手动获取ChatGPT RT

打开登录页面并在特定URL时弹出提示,提示用户打开开发者工具,点击任意处关闭弹窗或等待倒计时自动关闭。弹窗只出现一次,并保留登录按钮。

// ==UserScript==
// @name         手动获取ChatGPT RT
// @namespace    http://tampermonkey.net/
// @version      3.2
// @description  打开登录页面并在特定URL时弹出提示,提示用户打开开发者工具,点击任意处关闭弹窗或等待倒计时自动关闭。弹窗只出现一次,并保留登录按钮。
// @author       XYHELPER
// @match        *://*/*
// @grant        GM_xmlhttpRequest
// @license      ChatGPT4V
// @grant        GM_openInTab
// @grant        GM_registerMenuCommand
// @grant        window.close
// @connect      login.closeai.biz
// ==/UserScript==

(function() {
    'use strict';

    let hasShownPopup = false; // 用于确保弹窗只显示一次

    // 创建弹窗
    function createPopup() {
        const modal = document.createElement('div');
        modal.style.position = 'fixed';
        modal.style.top = '35%'; // 垂直居中
        modal.style.left = '50%'; // 水平居中
        modal.style.transform = 'translate(-50%, -50%)'; // 中心偏移
        modal.style.backgroundColor = 'rgba(0, 0, 0, 0.8)';
        modal.style.color = 'white';
        modal.style.padding = '15px';
        modal.style.borderRadius = '8px';
        modal.style.zIndex = '10000';
        modal.style.boxShadow = '0 2px 10px rgba(0, 0, 0, 0.5)';
        modal.style.cursor = 'pointer';
        modal.style.maxWidth = '80%'; // 最大宽度,确保在小屏幕下也能显示完整

        // 添加提示文本
        const tipText = document.createElement('p');
        tipText.textContent = '请按F12 获取返回参数';
        tipText.style.fontSize = '14px';
        tipText.style.color = 'rgba(255, 255, 255, 0.9)';
        tipText.style.margin = '0';
        modal.appendChild(tipText);

        // 将弹窗添加到页面中
        document.body.appendChild(modal);

        // 创建点击外部关闭弹窗的功能
        function handleOutsideClick(event) {
            if (!modal.contains(event.target)) {
                closeModal();
            }
        }

        // 关闭弹窗的功能
        function closeModal() {
            if (document.body.contains(modal)) {
                document.body.removeChild(modal);
                document.removeEventListener('click', handleOutsideClick);
            }
        }

        // 监听点击事件,检测点击是否在弹窗外部
        setTimeout(() => {
            document.addEventListener('click', handleOutsideClick);
        }, 0); // 延迟0毫秒确保事件绑定后再执行

        // 设置倒计时三秒后自动关闭弹窗
        setTimeout(() => {
            closeModal();
        }, 2000); // 2000毫秒 = 2秒
    }

    // 监控URL变化,当URL匹配时显示弹窗
    function monitorUrl() {
        const url = window.location.href;
        if (!hasShownPopup && url.startsWith('https://auth0.openai.com/u/login/identifier?state=')) {
            createPopup(); // 打开页面后显示弹窗
            hasShownPopup = true; // 标记弹窗已显示,防止重复弹出
        }
    }

    // 每隔一段时间检测URL变化
    setInterval(monitorUrl, 1000); // 每秒检测一次URL变化

    // 注册“打开登录链接”按钮
    GM_registerMenuCommand("打开登录链接", () => {
        // 获取当前标签页的 window 对象
        const currentWindow = window;

        // 打开登录页面
        GM_openInTab("https://login.closeai.biz", {active: true});

        // 使用 GM_xmlhttpRequest 获取页面内容
        GM_xmlhttpRequest({
            method: "GET",
            url: "https://login.closeai.biz",
            onload: function(response) {
                // 解析返回的HTML
                const parser = new DOMParser();
                const doc = parser.parseFromString(response.responseText, "text/html");

                // 查找id为url的div元素
                const urlDiv = doc.querySelector("#url");
                if (urlDiv) {
                    const newUrl = urlDiv.textContent.trim(); // 获取里面的文本内容
                    console.log("获取到的URL:", newUrl);
                    if (newUrl.startsWith("https://")) {
                        // 打开新的链接并在新标签页中显示
                        GM_openInTab(newUrl, {active: true});

                        // 关闭当前原始标签页
                        currentWindow.close();
                    } else {
                        alert("无法获取有效的URL");
                    }
                } else {
                    alert("未能找到包含URL的div元素");
                }
            },
            onerror: function() {
                alert("无法加载登录页面,请稍后再试。");
            }
        });
    });

})();