Quillbot Premium Unlocker

Unlocks Quillbot Premium features with improved stability and compatibility

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         Quillbot Premium Unlocker
// @namespace    quillbot.taozhiyu.gitee.io
// @version      1.0.0
// @description  Unlocks Quillbot Premium features with improved stability and compatibility
// @author       longkidkoolstar
// @match        https://quillbot.com/*
// @icon         https://quillbot.com/favicon.png
// @require      https://greasyfork.org/scripts/455943-ajaxhooker/code/ajaxHooker.js?version=1124435
// @run-at       document-start
// @grant        GM_setValue
// @grant        GM_getValue
// @license      none
// ==/UserScript==
/* global ajaxHooker*/
(function() {
    'use strict';

    // Configuration
    const CONFIG = {
        debug: false, // Enable for additional console logging
        notificationDuration: 5000, // How long to show status notifications (ms)
        theme: {
            primary: "#4CAF50", // Primary color - green
            text: "#333333",
            background: "#f9f9f9",
            shadow: "0 2px 5px rgba(0, 0, 0, 0.1)"
        },
        premiumFeatures: [
            "Word Count Limit",
            "Premium Modes",
            "Grammar Checker",
            "Premium Synonyms",
            "Sentence Rephraser"
        ]
    };

    // Logger utility
    const logger = {
        log: (message) => CONFIG.debug && console.log(`[QuillbotUnlocker] ${message}`),
        success: (message) => CONFIG.debug && console.log(`[QuillbotUnlocker] %c${message}`, "color: green"),
        error: (message, err) => CONFIG.debug && console.error(`[QuillbotUnlocker] ${message}`, err)
    };

    // Enhanced API interceptor module
    const apiInterceptor = {
        init: () => {
            try {
                ajaxHooker.hook((request) => {
                    // Account details endpoint (main premium flag)
                    if (request.url.endsWith("get-account-details")) {
                        logger.log("Intercepting account details request");

                        request.response = (response) => {
                            try {
                                const responseData = JSON.parse(response.responseText);
                                const accountData = "data" in responseData ? responseData.data : responseData;

                                // Set premium status flags
                                accountData.profile.accepted_premium_modes_tnc = true;
                                accountData.profile.premium = true;
                                accountData.profile.client_type = "premium";
                                accountData.profile.premium_tier = "premium_plus";

                                // Enhanced word limits
                                if (accountData.limits) {
                                    const enhancedLimits = {
                                        limit: 250000,
                                        premium_limit: 250000,
                                        used: 0,
                                    };

                                    // Apply to all limit types
                                    accountData.limits.paraphrase = { ...accountData.limits.paraphrase, ...enhancedLimits };
                                    accountData.limits.grammar = { ...accountData.limits.grammar, ...enhancedLimits };
                                    accountData.limits.cowrite = { ...(accountData.limits.cowrite || {}), ...enhancedLimits };
                                    accountData.limits.summarizer = { ...(accountData.limits.summarizer || {}), ...enhancedLimits };
                                }

                                // Unlock subscription features
                                if (accountData.user) {
                                    accountData.user.subscription = {
                                        type: "premium_plus",
                                        status: "active",
                                    };
                                }

                                // Update response with modified data
                                response.responseText = JSON.stringify(
                                    "data" in responseData ? ((responseData.data = accountData), responseData) : accountData
                                );

                                logger.success("Premium status enabled successfully");
                                uiManager.showStatusNotification("Premium features unlocked successfully!");
                            } catch (err) {
                                logger.error("Error processing account details response", err);
                                uiManager.showStatusNotification("Error unlocking premium features");
                            }
                        };
                    }

                    // Additional endpoints for premium features
                    if (
                        request.url.includes("/billing/") ||
                        request.url.includes("/subscription/") ||
                        request.url.includes("/premium-access")
                    ) {
                        logger.log("Intercepting premium endpoint request");

                        request.response = (response) => {
                            try {
                                // Return a successful premium status
                                response.responseText = JSON.stringify({
                                    success: true,
                                    data: {
                                        has_premium_access: true,
                                        status: "active",
                                        tier: "premium_plus",
                                    },
                                });
                                logger.success("Premium access granted successfully");
                            } catch (err) {
                                logger.error("Error processing premium endpoint response", err);
                            }
                        };
                    }
                });
                logger.success("API interceptors initialized");
            } catch (err) {
                logger.error("Failed to initialize API interceptors", err);
                uiManager.showStatusNotification("Failed to initialize premium unlocker");
            }
        }
    };

    // UI Manager with minimal interface
    const uiManager = {
        // Lightweight status notification
        showStatusNotification: (message) => {
            if (document.body) {
                const notification = document.createElement("div");
                notification.style.position = "fixed";
                notification.style.bottom = "20px";
                notification.style.right = "20px";
                notification.style.padding = "10px 15px";
                notification.style.backgroundColor = CONFIG.theme.background;
                notification.style.color = CONFIG.theme.text;
                notification.style.border = "1px solid #ccc";
                notification.style.borderLeft = `4px solid ${CONFIG.theme.primary}`;
                notification.style.borderRadius = "4px";
                notification.style.boxShadow = CONFIG.theme.shadow;
                notification.style.fontFamily = "Arial, sans-serif";
                notification.style.fontSize = "14px";
                notification.style.zIndex = "10000";

                notification.textContent = message;

                document.body.appendChild(notification);

                // Remove after duration
                setTimeout(() => {
                    if (notification.parentNode) {
                        notification.parentNode.removeChild(notification);
                    }
                }, CONFIG.notificationDuration);
            }
        },

        // Simple info popup
        showInfoPopup: () => {
            const popup = document.createElement("div");
            popup.style.position = "fixed";
            popup.style.bottom = "20px";
            popup.style.right = "20px";
            popup.style.padding = "15px";
            popup.style.backgroundColor = CONFIG.theme.background;
            popup.style.boxShadow = CONFIG.theme.shadow;
            popup.style.border = "1px solid #ccc";
            popup.style.borderRadius = "8px";
            popup.style.zIndex = "10000";
            popup.style.fontFamily = "Arial, sans-serif";
            popup.style.color = CONFIG.theme.text;
            popup.style.width = "280px";

            // Add header
            const header = document.createElement("h3");
            header.textContent = "Quillbot Premium Unlocker";
            header.style.margin = "0 0 10px";
            header.style.color = CONFIG.theme.primary;
            header.style.fontSize = "16px";

            // Add features list
            const featuresHeader = document.createElement("p");
            featuresHeader.textContent = "Unlocked features:";
            featuresHeader.style.margin = "10px 0 5px";
            featuresHeader.style.fontWeight = "bold";

            const featuresList = document.createElement("ul");
            featuresList.style.margin = "0 0 15px";
            featuresList.style.paddingLeft = "20px";

            CONFIG.premiumFeatures.forEach(feature => {
                const item = document.createElement("li");
                item.textContent = feature;
                item.style.margin = "3px 0";
                featuresList.appendChild(item);
            });

            // Add Discord link
            const communityMsg = document.createElement("p");
            communityMsg.textContent = "Join our Discord community for support and additional resources:";
            communityMsg.style.margin = "10px 0 5px";
            communityMsg.style.fontSize = "13px";

            const link = document.createElement("a");
            link.href = "https://discord.gg/JrweGzdjwA";
            link.textContent = "Join Discord";
            link.style.color = "#0366d6";
            link.style.textDecoration = "none";
            link.target = "_blank";
            link.style.display = "inline-block";
            link.style.marginTop = "5px";

            // Add close button
            const closeButton = document.createElement("button");
            closeButton.textContent = "×";
            closeButton.style.position = "absolute";
            closeButton.style.top = "5px";
            closeButton.style.right = "5px";
            closeButton.style.background = "none";
            closeButton.style.border = "none";
            closeButton.style.cursor = "pointer";
            closeButton.style.fontSize = "18px";
            closeButton.style.color = "#666";

            closeButton.addEventListener("click", () => {
                if (popup.parentNode) {
                    document.body.removeChild(popup);
                }
            });

            // Assemble elements
            popup.appendChild(header);
            popup.appendChild(featuresHeader);
            popup.appendChild(featuresList);
            popup.appendChild(communityMsg);
            popup.appendChild(link);
            popup.appendChild(closeButton);

            document.body.appendChild(popup);

            // Auto-close after 15 seconds
            setTimeout(() => {
                if (popup.parentNode) {
                    document.body.removeChild(popup);
                }
            }, 15000);
        }
    };

    // Initialize the premium unlocker
    (function init() {
        // Start API interception immediately
        apiInterceptor.init();

        // Show info popup after page loads
        window.addEventListener("load", () => {
            setTimeout(() => {
                uiManager.showInfoPopup();
            }, 2000);
        });

        logger.log("Quillbot Premium Unlocker initialized");
    })();
})();