{"id":192,"date":"2026-02-01T22:36:46","date_gmt":"2026-02-01T14:36:46","guid":{"rendered":"https:\/\/blog.chatgptcard.xyz\/?p=192"},"modified":"2026-02-01T22:44:15","modified_gmt":"2026-02-01T14:44:15","slug":"gtp%e5%bc%ba%e5%bc%80%e9%95%bf%e7%9f%ad%e9%93%be%e6%8e%a5","status":"publish","type":"post","link":"https:\/\/blog.chatgptcard.xyz\/index.php\/2026\/02\/01\/gtp%e5%bc%ba%e5%bc%80%e9%95%bf%e7%9f%ad%e9%93%be%e6%8e%a5\/","title":{"rendered":"GTP\u5f3a\u5f00\u957f\u77ed\u94fe\u63a5"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">\u63d0\u9ad8\u6210\u529f\u7387<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">edge\u63d2\u4ef6\u6269\u5c55 \u4e0b\u8f7d\u811a\u672c\u732b<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5bfc\u5165\u811a\u672c \u542f\u52a8 \u8fdb\u5165gtp \u4f1a\u770b\u5230\u6309\u94ae<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ ==UserScript==\n\/\/ @name         ChatGPT Team \u7ed1\u5361\u9875\u9762\u751f\u6210\u5668\n\/\/ @namespace    https:\/\/chatgpt.com\/\n\/\/ @version      1.0.0\n\/\/ @description  \u5728 ChatGPT \u9875\u9762\u751f\u6210 Team \u5957\u9910\u7ed1\u5361\u9875\u9762 (Custom Checkout)\n\/\/ @author       Your Name\n\/\/ @match        https:\/\/chatgpt.com\/*\n\/\/ @match        https:\/\/chat.openai.com\/*\n\/\/ @icon         https:\/\/chat.openai.com\/favicon.ico\n\/\/ @grant        GM_registerMenuCommand\n\/\/ @grant        GM_notification\n\/\/ @grant        GM_setClipboard\n\/\/ @run-at       document-idle\n\/\/ ==\/UserScript==\n\n(function() {\n    'use strict';\n\n    \/\/ ============ \u914d\u7f6e\u53c2\u6570 (\u53ef\u81ea\u5b9a\u4e49\u4fee\u6539) ============\n    const CONFIG = {\n        \/\/ \u5de5\u4f5c\u533a\u540d\u79f0\n        workspace_name: \"zhizhishu\",\n        \/\/ \u8ba1\u8d39\u5468\u671f: \"month\" \u6216 \"year\"\n        price_interval: \"month\",\n        \/\/ \u5ea7\u4f4d\u6570\u91cf\n        seat_quantity: 5,\n        \/\/ \u56fd\u5bb6\u4ee3\u7801\n        country: \"US\",\n        \/\/ \u8d27\u5e01\n        currency: \"USD\",\n        \/\/ \u4f18\u60e0\u6d3b\u52a8 ID\n        promo_campaign_id: \"team-1-month-free\",\n        \/\/ \u9875\u9762\u6a21\u5f0f: \"new\" = \u65b0\u9875\u9762(\u5d4c\u5165\u5f0f), \"old\" = \u8001\u9875\u9762(\u8df3\u8f6c\u94fe\u63a5)\n        page_mode: \"new\"\n    };\n\n    \/\/ API \u7aef\u70b9\n    const API = {\n        checkout: \"https:\/\/chatgpt.com\/backend-api\/payments\/checkout\",\n        promo_check: \"https:\/\/chatgpt.com\/backend-api\/promo_campaign\/check_coupon\"\n    };\n\n    \/\/ ============ \u5de5\u5177\u51fd\u6570 ============\n\n    \/\/ \u83b7\u53d6 Access Token\n    async function getAccessToken() {\n        try {\n            const response = await fetch(\"https:\/\/chatgpt.com\/api\/auth\/session\");\n            const data = await response.json();\n            if (data.accessToken) {\n                console.log(\"&#91;TeamPay] \u2705 Token \u83b7\u53d6\u6210\u529f\");\n                return data.accessToken;\n            }\n            throw new Error(\"\u672a\u627e\u5230 accessToken\");\n        } catch (error) {\n            console.error(\"&#91;TeamPay] \u274c Token \u83b7\u53d6\u5931\u8d25:\", error);\n            showNotification(\"\u9519\u8bef\", \"\u83b7\u53d6 Token \u5931\u8d25\uff0c\u8bf7\u786e\u4fdd\u5df2\u767b\u5f55\");\n            return null;\n        }\n    }\n\n    \/\/ \u663e\u793a\u901a\u77e5\n    function showNotification(title, text) {\n        if (typeof GM_notification !== 'undefined') {\n            GM_notification({\n                title: title,\n                text: text,\n                timeout: 3000\n            });\n        } else {\n            alert(`${title}: ${text}`);\n        }\n    }\n\n    \/\/ \u590d\u5236\u5230\u526a\u8d34\u677f\n    function copyToClipboard(text) {\n        if (typeof GM_setClipboard !== 'undefined') {\n            GM_setClipboard(text);\n        } else {\n            navigator.clipboard.writeText(text);\n        }\n    }\n\n    \/\/ \u4ece Token \u63d0\u53d6\u90ae\u7bb1\u524d\u7f00\u4f5c\u4e3a\u5de5\u4f5c\u533a\u540d\u79f0\n    function extractEmailPrefix(token) {\n        try {\n            const parts = token.split('.');\n            if (parts.length &gt;= 2) {\n                let payload = parts&#91;1];\n                \/\/ Base64 URL \u89e3\u7801\n                payload = payload.replace(\/-\/g, '+').replace(\/_\/g, '\/');\n                while (payload.length % 4) payload += '=';\n                const decoded = JSON.parse(atob(payload));\n\n                \/\/ \u5c1d\u8bd5\u591a\u79cd\u90ae\u7bb1\u5b57\u6bb5\n                let email = decoded.email ||\n                    decoded&#91;'https:\/\/api.openai.com\/profile']?.email ||\n                    decoded&#91;'https:\/\/api.openai.com\/auth']?.email;\n\n                if (email &amp;&amp; email.includes('@')) {\n                    return email.split('@')&#91;0];\n                }\n            }\n        } catch (e) {\n            console.error(\"&#91;TeamPay] \u89e3\u6790 Token \u5931\u8d25:\", e);\n        }\n        return \"MyTeam\";\n    }\n\n    \/\/ ============ API \u8c03\u7528 ============\n\n    \/\/ \u751f\u6210 Checkout (\u652f\u6301\u65b0\/\u8001\u4e24\u79cd\u6a21\u5f0f)\n    async function generateCheckout(token, mode) {\n        const isNewMode = mode === \"new\";\n\n        const payload = {\n            plan_name: \"chatgptteamplan\",\n            team_plan_data: {\n                workspace_name: CONFIG.workspace_name,\n                price_interval: CONFIG.price_interval,\n                seat_quantity: CONFIG.seat_quantity\n            },\n            billing_details: {\n                country: CONFIG.country,\n                currency: CONFIG.currency.toUpperCase()\n            },\n            cancel_url: \"https:\/\/chatgpt.com\/#pricing\",\n            promo_campaign: {\n                promo_campaign_id: CONFIG.promo_campaign_id,\n                is_coupon_from_query_param: false\n            },\n            checkout_ui_mode: isNewMode ? \"custom\" : \"redirect\"\n        };\n\n        try {\n            const response = await fetch(API.checkout, {\n                method: \"POST\",\n                headers: {\n                    \"Authorization\": `Bearer ${token}`,\n                    \"Content-Type\": \"application\/json\",\n                    \"Accept\": \"application\/json\"\n                },\n                body: JSON.stringify(payload)\n            });\n\n            const data = await response.json();\n\n            if (response.ok) {\n                if (isNewMode &amp;&amp; data.checkout_session_id) {\n                    \/\/ \u65b0\u9875\u9762\uff1a\u62fc\u63a5 ChatGPT checkout URL\n                    const processor = data.processor_entity || \"openai_llc\";\n                    const newUrl = `https:\/\/chatgpt.com\/checkout\/${processor}\/${data.checkout_session_id}`;\n                    return {\n                        success: true,\n                        mode: \"new\",\n                        url: newUrl,\n                        checkout_session_id: data.checkout_session_id\n                    };\n                } else if (!isNewMode &amp;&amp; data.url) {\n                    return { success: true, mode: \"old\", url: data.url };\n                }\n            }\n\n            console.error(\"&#91;TeamPay] API \u9519\u8bef:\", data);\n            return { success: false, error: data.detail || \"API \u8bf7\u6c42\u5931\u8d25\" };\n        } catch (error) {\n            console.error(\"&#91;TeamPay] \u8bf7\u6c42\u5f02\u5e38:\", error);\n            return { success: false, error: error.message };\n        }\n    }\n\n    \/\/ ============ UI \u521b\u5efa ============\n\n    \/\/ \u521b\u5efa\u60ac\u6d6e\u6309\u94ae\n    function createFloatingButton() {\n        \/\/ \u68c0\u67e5\u662f\u5426\u5df2\u5b58\u5728\n        if (document.getElementById('team-pay-btn')) return;\n\n        const btn = document.createElement('div');\n        btn.id = 'team-pay-btn';\n        btn.innerHTML = '\ud83d\udcb3';\n        btn.title = '\u751f\u6210 Team \u7ed1\u5361\u9875\u9762';\n        btn.style.cssText = `\n            position: fixed;\n            bottom: 100px;\n            right: 20px;\n            width: 50px;\n            height: 50px;\n            background: linear-gradient(135deg, #10a37f 0%, #1a7f5a 100%);\n            border-radius: 50%;\n            display: flex;\n            align-items: center;\n            justify-content: center;\n            font-size: 24px;\n            cursor: pointer;\n            box-shadow: 0 4px 15px rgba(16, 163, 127, 0.4);\n            z-index: 99999;\n            transition: all 0.3s ease;\n            user-select: none;\n        `;\n\n        btn.onmouseover = () =&gt; {\n            btn.style.transform = 'scale(1.1)';\n            btn.style.boxShadow = '0 6px 20px rgba(16, 163, 127, 0.6)';\n        };\n        btn.onmouseout = () =&gt; {\n            btn.style.transform = 'scale(1)';\n            btn.style.boxShadow = '0 4px 15px rgba(16, 163, 127, 0.4)';\n        };\n\n        btn.onclick = showConfigPanel;\n\n        document.body.appendChild(btn);\n    }\n\n    \/\/ \u521b\u5efa\u914d\u7f6e\u9762\u677f\n    function showConfigPanel() {\n        \/\/ \u79fb\u9664\u5df2\u5b58\u5728\u7684\u9762\u677f\n        const existing = document.getElementById('team-pay-panel');\n        if (existing) {\n            existing.remove();\n            return;\n        }\n\n        const panel = document.createElement('div');\n        panel.id = 'team-pay-panel';\n        panel.innerHTML = `\n            &lt;div id=\"tp-overlay\" style=\"\n                position: fixed;\n                top: 0;\n                left: 0;\n                right: 0;\n                bottom: 0;\n                background: rgba(0,0,0,0.5);\n                z-index: 100000;\n                display: flex;\n                align-items: center;\n                justify-content: center;\n            \"&gt;\n                &lt;div style=\"\n                    background: white;\n                    border-radius: 16px;\n                    width: 400px;\n                    max-width: 90vw;\n                    box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);\n                    overflow: hidden;\n                \" onclick=\"event.stopPropagation()\"&gt;\n                    &lt;div style=\"\n                        background: linear-gradient(135deg, #10a37f 0%, #1a7f5a 100%);\n                        color: white;\n                        padding: 20px;\n                        text-align: center;\n                    \"&gt;\n                        &lt;h2 style=\"margin: 0; font-size: 20px;\"&gt;ChatGPT Team \u7ed1\u5361&lt;\/h2&gt;\n                        &lt;p style=\"margin: 8px 0 0; opacity: 0.9; font-size: 14px;\"&gt;1\u4e2a\u6708\u514d\u8d39\u8bd5\u7528&lt;\/p&gt;\n                    &lt;\/div&gt;\n                    &lt;div style=\"padding: 24px;\"&gt;\n                        &lt;div style=\"margin-bottom: 16px;\"&gt;\n                            &lt;label style=\"display: block; margin-bottom: 6px; font-weight: 500; color: #333;\"&gt;\u9875\u9762\u6837\u5f0f&lt;\/label&gt;\n                            &lt;select id=\"tp-mode\" style=\"\n                                width: 100%;\n                                padding: 10px 12px;\n                                border: 1px solid #ddd;\n                                border-radius: 8px;\n                                font-size: 14px;\n                                box-sizing: border-box;\n                            \"&gt;\n                                &lt;option value=\"new\" ${CONFIG.page_mode === 'new' ? 'selected' : ''}&gt;\ud83c\udd95 \u65b0\u9875\u9762&lt;\/option&gt;\n                                &lt;option value=\"old\" ${CONFIG.page_mode === 'old' ? 'selected' : ''}&gt;\ud83d\udcce \u8001\u9875\u9762&lt;\/option&gt;\n                            &lt;\/select&gt;\n                        &lt;\/div&gt;\n                        &lt;div style=\"\n                            background: #f0fdf4;\n                            border-radius: 8px;\n                            padding: 12px;\n                            margin-bottom: 20px;\n                            font-size: 13px;\n                            color: #166534;\n                        \"&gt;\n                            \u2728 &lt;strong&gt;\u4f18\u60e0:&lt;\/strong&gt; team-1-month-free (1\u4e2a\u6708\u514d\u8d39)&lt;br&gt;\n                            \ud83d\udcb0 &lt;strong&gt;\u4eca\u65e5\u5e94\u4ed8:&lt;\/strong&gt; $0.00\n                        &lt;\/div&gt;\n                        &lt;button id=\"tp-generate\" style=\"\n                            width: 100%;\n                            padding: 14px;\n                            background: linear-gradient(135deg, #10a37f 0%, #1a7f5a 100%);\n                            color: white;\n                            border: none;\n                            border-radius: 8px;\n                            font-size: 16px;\n                            font-weight: 500;\n                            cursor: pointer;\n                            transition: all 0.3s;\n                        \"&gt;\n                            \ud83d\ude80 \u751f\u6210\n                        &lt;\/button&gt;\n                        &lt;div id=\"tp-status\" style=\"\n                            margin-top: 16px;\n                            padding: 12px;\n                            border-radius: 8px;\n                            font-size: 13px;\n                            display: none;\n                        \"&gt;&lt;\/div&gt;\n                    &lt;\/div&gt;\n                &lt;\/div&gt;\n            &lt;\/div&gt;\n        `;\n\n        document.body.appendChild(panel);\n\n        \/\/ \u7ed1\u5b9a\u751f\u6210\u6309\u94ae\u4e8b\u4ef6\n        document.getElementById('tp-generate').onclick = async function() {\n            const btn = this;\n            const statusEl = document.getElementById('tp-status');\n\n            \/\/ \u66f4\u65b0\u914d\u7f6e\n            CONFIG.page_mode = document.getElementById('tp-mode').value;\n\n            \/\/ \u663e\u793a\u52a0\u8f7d\u72b6\u6001\n            btn.disabled = true;\n            btn.innerHTML = '\u23f3 \u751f\u6210\u4e2d...';\n            statusEl.style.display = 'block';\n            statusEl.style.background = '#f3f4f6';\n            statusEl.style.color = '#666';\n            statusEl.innerHTML = '\u6b63\u5728\u83b7\u53d6 Token...';\n\n            try {\n                \/\/ \u83b7\u53d6 Token\n                const token = await getAccessToken();\n                if (!token) {\n                    throw new Error(\"\u83b7\u53d6 Token \u5931\u8d25\uff0c\u8bf7\u786e\u4fdd\u5df2\u767b\u5f55\");\n                }\n\n                \/\/ \u81ea\u52a8\u63d0\u53d6\u90ae\u7bb1\u524d\u7f00\u4f5c\u4e3a\u5de5\u4f5c\u533a\u540d\u79f0\n                CONFIG.workspace_name = extractEmailPrefix(token);\n                statusEl.innerHTML = `\u6b63\u5728\u751f\u6210... (${CONFIG.workspace_name})`;\n\n                \/\/ \u751f\u6210 Checkout\n                const result = await generateCheckout(token, CONFIG.page_mode);\n\n                if (result.success) {\n                    \/\/ \u4e24\u79cd\u6a21\u5f0f\u90fd\u6709 URL \u4e86\uff0c\u7edf\u4e00\u5904\u7406\n                    statusEl.style.background = '#f0fdf4';\n                    statusEl.style.color = '#166534';\n                    statusEl.innerHTML = `\n                        \u2705 &lt;strong&gt;\u751f\u6210\u6210\u529f!&lt;\/strong&gt; (${result.mode === 'new' ? '\u65b0\u9875\u9762' : '\u8001\u9875\u9762'})&lt;br&gt;&lt;br&gt;\n                        &lt;strong&gt;\u7ed1\u5361\u94fe\u63a5:&lt;\/strong&gt;&lt;br&gt;\n                        &lt;input type=\"text\" id=\"tp-url\" value=\"${result.url}\" readonly style=\"\n                            width: 100%;\n                            padding: 8px;\n                            border: 1px solid #10a37f;\n                            border-radius: 6px;\n                            font-size: 11px;\n                            margin: 8px 0;\n                            background: #fff;\n                        \" onclick=\"this.select()\"&gt;\n                        &lt;div style=\"display: flex; gap: 8px; margin-top: 8px;\"&gt;\n                            &lt;button id=\"tp-copy\" style=\"\n                                flex: 1;\n                                padding: 8px;\n                                background: #10a37f;\n                                color: white;\n                                border: none;\n                                border-radius: 6px;\n                                cursor: pointer;\n                                font-size: 13px;\n                            \"&gt;\ud83d\udccb \u590d\u5236\u94fe\u63a5&lt;\/button&gt;\n                            &lt;button id=\"tp-open\" style=\"\n                                flex: 1;\n                                padding: 8px;\n                                background: #667eea;\n                                color: white;\n                                border: none;\n                                border-radius: 6px;\n                                cursor: pointer;\n                                font-size: 13px;\n                            \"&gt;\ud83d\udd17 \u6253\u5f00\u94fe\u63a5&lt;\/button&gt;\n                        &lt;\/div&gt;\n                    `;\n\n                    document.getElementById('tp-copy').onclick = () =&gt; {\n                        copyToClipboard(result.url);\n                        showNotification(\"\u6210\u529f\", \"\u94fe\u63a5\u5df2\u590d\u5236\u5230\u526a\u8d34\u677f!\");\n                        document.getElementById('tp-copy').innerHTML = '\u2705 \u5df2\u590d\u5236';\n                    };\n                    document.getElementById('tp-open').onclick = () =&gt; {\n                        window.open(result.url, '_blank');\n                    };\n\n                    showNotification(\"\u6210\u529f\", \"\u7ed1\u5361\u94fe\u63a5\u5df2\u751f\u6210!\");\n                } else {\n                    throw new Error(result.error);\n                }\n            } catch (error) {\n                statusEl.style.background = '#fef2f2';\n                statusEl.style.color = '#dc2626';\n                statusEl.innerHTML = `\u274c &lt;strong&gt;\u5931\u8d25:&lt;\/strong&gt; ${error.message}`;\n            } finally {\n                btn.disabled = false;\n                btn.innerHTML = '\ud83d\ude80 \u751f\u6210';\n            }\n        };\n\n        \/\/ \u70b9\u51fb\u7a7a\u767d\u5904\u5173\u95ed\u5f39\u7a97\n        document.getElementById('tp-overlay').onclick = function(e) {\n            if (e.target === this) {\n                panel.remove();\n            }\n        };\n    }\n\n    \/\/ ============ \u521d\u59cb\u5316 ============\n\n    \/\/ \u6ce8\u518c\u6cb9\u7334\u83dc\u5355\u547d\u4ee4\n    if (typeof GM_registerMenuCommand !== 'undefined') {\n        GM_registerMenuCommand('\ud83d\ude80 \u751f\u6210 Team \u7ed1\u5361\u9875\u9762', showConfigPanel);\n        GM_registerMenuCommand('\u2699\ufe0f \u663e\u793a\/\u9690\u85cf\u60ac\u6d6e\u6309\u94ae', () =&gt; {\n            const btn = document.getElementById('team-pay-btn');\n            if (btn) {\n                btn.style.display = btn.style.display === 'none' ? 'flex' : 'none';\n            }\n        });\n    }\n\n    \/\/ \u9875\u9762\u52a0\u8f7d\u5b8c\u6210\u540e\u521b\u5efa\u60ac\u6d6e\u6309\u94ae\n    if (document.readyState === 'loading') {\n        document.addEventListener('DOMContentLoaded', createFloatingButton);\n    } else {\n        createFloatingButton();\n    }\n\n    console.log('&#91;TeamPay] \ud83d\udcb3 ChatGPT Team \u7ed1\u5361\u811a\u672c\u5df2\u52a0\u8f7d');\n    console.log('&#91;TeamPay] \u70b9\u51fb\u53f3\u4e0b\u89d2\u60ac\u6d6e\u6309\u94ae\u6216\u6cb9\u7334\u83dc\u5355\u4f7f\u7528');\n\n})();\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u63d0\u9ad8\u6210\u529f\u7387 edge\u63d2\u4ef6\u6269\u5c55 \u4e0b\u8f7d\u811a\u672c\u732b \u5bfc\u5165\u811a\u672c \u542f\u52a8 \u8fdb\u5165gtp \u4f1a\u770b\u5230\u6309\u94ae<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-192","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/blog.chatgptcard.xyz\/index.php\/wp-json\/wp\/v2\/posts\/192","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.chatgptcard.xyz\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.chatgptcard.xyz\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.chatgptcard.xyz\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.chatgptcard.xyz\/index.php\/wp-json\/wp\/v2\/comments?post=192"}],"version-history":[{"count":2,"href":"https:\/\/blog.chatgptcard.xyz\/index.php\/wp-json\/wp\/v2\/posts\/192\/revisions"}],"predecessor-version":[{"id":194,"href":"https:\/\/blog.chatgptcard.xyz\/index.php\/wp-json\/wp\/v2\/posts\/192\/revisions\/194"}],"wp:attachment":[{"href":"https:\/\/blog.chatgptcard.xyz\/index.php\/wp-json\/wp\/v2\/media?parent=192"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.chatgptcard.xyz\/index.php\/wp-json\/wp\/v2\/categories?post=192"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.chatgptcard.xyz\/index.php\/wp-json\/wp\/v2\/tags?post=192"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}