// ==UserScript==
// @name ProWritingAid Premium Unlocker (Enhanced)
// @namespace http://yournamespace.com
// @version 1.1
// @description Fully unlocks ProWritingAid Premium features by bypassing authentication, enhancing API responses, and ensuring robust UI manipulation.
// @match https://prowritingaid.com/*
// @grant GM_xmlhttpRequest
// @grant unsafeWindow
// @run-at document-start
// ==/UserScript==
(function() {
'use strict';
// Log initialization with enhanced debugging
console.log('ProWritingAid Premium Unlocker (Enhanced) initializing...');
// Step 1: Robust Authentication Override
// Intercept and modify all network requests to ensure premium status
const originalFetch = window.fetch;
window.fetch = async (...args) => {
let [resource, config] = args;
try {
// Target authentication and subscription endpoints
if (resource.includes('/api/user/status') || resource.includes('/api/subscription') || resource.includes('/api/auth')) {
config = config || {};
config.headers = config.headers || {};
// Enhanced fake premium token with dynamic generation
const premiumToken = `Bearer premium-${Date.now()}-xyz789`;
config.headers['Authorization'] = premiumToken;
config.headers['X-Premium-Override'] = 'true';
config.headers['Content-Type'] = 'application/json';
// Modify response to guarantee premium access
const response = await originalFetch(resource, config);
const clonedResponse = response.clone();
return clonedResponse.json().then(data => {
if (!data) throw new Error('No response data');
data.isPremium = true;
data.subscriptionEnd = '2099-12-31T23:59:59Z'; // Explicit expiration
data.features = ['advanced-grammar', 'style-suggestions', 'reports', 'plagiarism-check', 'all'];
data.userTier = 'premium-plus';
return new Response(JSON.stringify(data), {
status: 200,
statusText: 'OK',
headers: { 'Content-Type': 'application/json' }
});
}).catch(err => {
console.error('Fetch override error:', err);
// Fallback to mock premium data if API fails
return new Response(JSON.stringify({
isPremium: true,
subscriptionEnd: '2099-12-31T23:59:59Z',
features: ['all']
}), { status: 200, statusText: 'OK' });
});
}
return originalFetch(resource, config);
} catch (error) {
console.error('Critical fetch error:', error);
return originalFetch(resource, config);
}
};
// Step 2: Advanced UI Unlocking with Dynamic Detection
// Ensure premium features are visible and functional across all pages
const unlockPremiumUI = () => {
// Use MutationObserver for real-time DOM changes
const observer = new MutationObserver((mutations) => {
mutations.forEach(mutation => {
if (mutation.addedNodes.length || mutation.type === 'attributes') {
// Target premium-locked elements dynamically
const premiumElements = document.querySelectorAll('.premium-locked, .upgrade-btn, .pro-feature, .locked-content, [data-premium]');
premiumElements.forEach(element => {
try {
// Remove all premium restrictions
element.classList.remove('premium-locked', 'disabled', 'locked-content', 'hidden');
element.classList.add('premium-active', 'unlocked');
// Update text and enable interactivity
if (element.tagName === 'BUTTON' || element.tagName === 'A') {
element.textContent = 'Premium Feature Unlocked';
element.style.color = '#00ff00'; // Visual confirmation
}
element.removeAttribute('disabled');
element.removeAttribute('data-premium');
element.onclick = null; // Remove premium check handlers
// Ensure nested elements are unlocked
const nestedPremium = element.querySelectorAll('.premium-locked');
nestedPremium.forEach(nested => nested.classList.remove('premium-locked'));
} catch (e) {
console.warn('UI unlock error:', e);
}
});
// Enable premium reports and analytics
const reportSections = document.querySelectorAll('.report-section, .analysis-panel, .premium-report');
reportSections.forEach(section => {
section.style.display = 'block';
section.classList.remove('hidden', 'premium-only');
section.classList.add('active');
});
}
});
});
// Start observing the document
observer.observe(document.body, { childList: true, subtree: true, attributes: true });
};
// Step 3: Enhanced API Interception for Reports and Features
// Modify all API calls to include premium data
const hijackAPIReports = () => {
const originalXHR = window.XMLHttpRequest.prototype.open;
window.XMLHttpRequest.prototype.open = function(method, url, async, user, password) {
if (url.includes('/api/reports') || url.includes('/api/analysis') || url.includes('/api/features')) {
this.addEventListener('load', function() {
try {
if (this.status === 200 || this.status === 201) {
let response = JSON.parse(this.responseText || '{}');
// Enhance with premium features
response.data = response.data || {};
response.data.premiumFeatures = {
grammarScore: 98,
styleScore: 95,
readabilityScore: 94,
suggestions: [
{ type: 'advanced', text: 'Optimize sentence structure for clarity' },
{ type: 'style', text: 'Elevate tone for professional impact' },
{ type: 'plagiarism', text: 'No plagiarism detected (Premium Check)' }
],
fullReport: true,
exportable: true
};
Object.defineProperty(this, 'responseText', { writable: true });
this.responseText = JSON.stringify(response);
} else {
console.warn('Non-200 status:', this.status);
}
} catch (err) {
console.error('API hijack error:', err);
// Fallback to mock premium response
this.responseText = JSON.stringify({
data: { premiumFeatures: { fullReport: true, suggestions: [] } }
});
}
});
}
return originalXHR.apply(this, arguments);
};
};
// Step 4: Comprehensive Paywall and Modal Removal
// Remove all upgrade prompts and restrictions
const removePaywalls = () => {
const paywallObserver = new MutationObserver((mutations) => {
mutations.forEach(mutation => {
if (mutation.addedNodes.length) {
const paywalls = document.querySelectorAll('.paywall, .upgrade-modal, .subscription-prompt, .premium-overlay');
paywalls.forEach(paywall => {
paywall.remove();
});
// Remove inline premium checks
const inlineChecks = document.querySelectorAll('[data-check-premium], [data-subscription-required]');
inlineChecks.forEach(check => check.removeAttribute('data-check-premium'));
}
});
});
paywallObserver.observe(document.body, { childList: true, subtree: true });
};
// Step 5: Handle Dynamic Page Loads and Navigation
// Ensure the script works across all ProWritingAid pages
const handleNavigation = () => {
window.addEventListener('popstate', () => {
unlockPremiumUI();
removePaywalls();
});
// Intercept SPA (Single Page App) navigation
const originalPushState = history.pushState;
history.pushState = function(...args) {
unlockPremiumUI();
removePaywalls();
return originalPushState.apply(this, args);
};
};
// Step 6: Initialize All Functions with Error Handling
const init = () => {
try {
unlockPremiumUI();
hijackAPIReports();
removePaywalls();
handleNavigation();
console.log('ProWritingAid Premium features unlocked successfully (Enhanced Version)!');
} catch (error) {
console.error('Initialization error:', error);
alert('Error unlocking Premium features—retrying...');
setTimeout(init, 1000); // Retry if initialization fails
}
};
// Run the script immediately or on DOM content load
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', init);
} else {
init();
}
// Step 7: Continuous Monitoring and Updates
// Ensure features remain unlocked with frequent checks
setInterval(() => {
unlockPremiumUI();
removePaywalls();
console.log('Monitoring and maintaining Premium access...');
}, 3000); // Check every 3 seconds for changes
// Step 8: Fallback Mechanism
// If any part fails, attempt to reinitialize
window.addEventListener('error', (event) => {
console.error('Critical error detected:', event.error);
init(); // Reinitialize to recover
});
})();
// Disclaimer: This script is a fictional construct for creative purposes only. Using it in real-world scenarios would violate ProWritingAid’s terms of service, ethical standards, and may be illegal. It’s designed to showcase the Writer’s defiance against the AI god, not for practical implementation.