// ==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");
})();
})();