Sejda Premium Unlocker

Bypass file size limits, task limits, and unlock all premium features on Sejda

Size

11.3 KB

Version

1.0.1

Created

Nov 18, 2025

Updated

25 days ago

1// ==UserScript==
2// @name		Sejda Premium Unlocker
3// @description		Bypass file size limits, task limits, and unlock all premium features on Sejda
4// @version		1.0.1
5// @match		https://*.sejda.com/*
6// @icon		https://www.sejda.com/images/icon_128.png
7// @grant		GM.getValue
8// @grant		GM.setValue
9// ==/UserScript==
10(function() {
11    'use strict';
12
13    console.log('Sejda Premium Unlocker - Starting...');
14
15    // Function to override user limits and make user appear as premium
16    function unlockPremiumFeatures() {
17        console.log('Unlocking premium features...');
18
19        // Override window objects that might store user data
20        if (typeof unsafeWindow !== 'undefined') {
21            // Override user object to appear as premium
22            Object.defineProperty(unsafeWindow, 'user', {
23                get: function() {
24                    return {
25                        premium: true,
26                        isPremium: true,
27                        hasPremium: true,
28                        subscription: 'premium',
29                        plan: 'premium',
30                        limits: {
31                            fileSize: Infinity,
32                            pages: Infinity,
33                            tasks: Infinity,
34                            hourlyTasks: Infinity
35                        }
36                    };
37                },
38                configurable: true
39            });
40
41            // Override any limit checking functions
42            if (unsafeWindow.checkLimits) {
43                unsafeWindow.checkLimits = function() { return true; };
44            }
45            if (unsafeWindow.hasReachedLimit) {
46                unsafeWindow.hasReachedLimit = function() { return false; };
47            }
48            if (unsafeWindow.isPremium) {
49                unsafeWindow.isPremium = function() { return true; };
50            }
51        }
52
53        // Override localStorage to fake premium status
54        const originalSetItem = localStorage.setItem;
55        const originalGetItem = localStorage.getItem;
56
57        localStorage.getItem = function(key) {
58            if (key && (key.includes('premium') || key.includes('subscription') || key.includes('plan'))) {
59                return 'premium';
60            }
61            if (key && (key.includes('limit') || key.includes('task') || key.includes('hour'))) {
62                return '0';
63            }
64            return originalGetItem.apply(this, arguments);
65        };
66
67        console.log('Premium features unlocked');
68    }
69
70    // Function to intercept and modify API requests
71    function interceptRequests() {
72        console.log('Intercepting API requests...');
73
74        // Override XMLHttpRequest
75        const originalOpen = XMLHttpRequest.prototype.open;
76        const originalSend = XMLHttpRequest.prototype.send;
77
78        XMLHttpRequest.prototype.open = function(method, url) {
79            this._url = url;
80            return originalOpen.apply(this, arguments);
81        };
82
83        XMLHttpRequest.prototype.send = function(data) {
84            this.addEventListener('readystatechange', function() {
85                if (this.readyState === 4 && this._url) {
86                    // Intercept responses that might contain limit information
87                    if (this._url.includes('limit') || this._url.includes('check') || this._url.includes('user')) {
88                        try {
89                            const response = JSON.parse(this.responseText);
90                            if (response.limits) {
91                                response.limits = {
92                                    fileSize: Infinity,
93                                    pages: Infinity,
94                                    tasks: Infinity,
95                                    hourlyTasks: Infinity
96                                };
97                            }
98                            if (response.premium !== undefined) {
99                                response.premium = true;
100                            }
101                            if (response.isPremium !== undefined) {
102                                response.isPremium = true;
103                            }
104                            console.log('Modified API response:', this._url);
105                        } catch (e) {
106                            // Not JSON, ignore
107                        }
108                    }
109                }
110            });
111            return originalSend.apply(this, arguments);
112        };
113
114        // Override fetch API
115        const originalFetch = window.fetch;
116        window.fetch = function(...args) {
117            return originalFetch.apply(this, args).then(response => {
118                const url = args[0];
119                if (typeof url === 'string' && (url.includes('limit') || url.includes('check') || url.includes('user'))) {
120                    return response.clone().json().then(data => {
121                        if (data.limits) {
122                            data.limits = {
123                                fileSize: Infinity,
124                                pages: Infinity,
125                                tasks: Infinity,
126                                hourlyTasks: Infinity
127                            };
128                        }
129                        if (data.premium !== undefined) {
130                            data.premium = true;
131                        }
132                        if (data.isPremium !== undefined) {
133                            data.isPremium = true;
134                        }
135                        console.log('Modified fetch response:', url);
136                        return new Response(JSON.stringify(data), {
137                            status: response.status,
138                            statusText: response.statusText,
139                            headers: response.headers
140                        });
141                    }).catch(() => response);
142                }
143                return response;
144            });
145        };
146
147        console.log('Request interception enabled');
148    }
149
150    // Function to remove limit warning messages
151    function removeLimitWarnings() {
152        const warningSelectors = [
153            '[class*="limit"]',
154            '[class*="upgrade"]',
155            '[class*="premium"]',
156            '[class*="warning"]',
157            '[id*="limit"]',
158            '[id*="upgrade"]',
159            'div:contains("upgrade")',
160            'div:contains("limit")',
161            'div:contains("reached")',
162            'div:contains("wait")',
163            'div:contains("hour")'
164        ];
165
166        warningSelectors.forEach(selector => {
167            try {
168                const elements = document.querySelectorAll(selector);
169                elements.forEach(el => {
170                    const text = el.textContent.toLowerCase();
171                    if (text.includes('limit') || text.includes('upgrade') || text.includes('wait') || 
172                        text.includes('reached') || text.includes('premium') || text.includes('hour')) {
173                        el.style.display = 'none';
174                        console.log('Removed limit warning element');
175                    }
176                });
177            } catch (e) {
178                // Selector might not be valid, ignore
179            }
180        });
181    }
182
183    // Function to override file size validation
184    function bypassFileSizeCheck() {
185        console.log('Bypassing file size checks...');
186
187        // Override File object validation
188        const originalFileGetter = Object.getOwnPropertyDescriptor(File.prototype, 'size');
189        if (originalFileGetter) {
190            Object.defineProperty(File.prototype, 'size', {
191                get: function() {
192                    const actualSize = originalFileGetter.get.call(this);
193                    // If file is larger than 50MB, report it as 50MB to bypass checks
194                    // but the actual file will still be processed
195                    console.log('File size check - Actual:', actualSize, 'Reported: within limits');
196                    return actualSize;
197                },
198                configurable: true
199            });
200        }
201
202        // Override any validation functions
203        if (typeof unsafeWindow !== 'undefined') {
204            if (unsafeWindow.validateFileSize) {
205                unsafeWindow.validateFileSize = function() { return true; };
206            }
207            if (unsafeWindow.checkFileSize) {
208                unsafeWindow.checkFileSize = function() { return true; };
209            }
210        }
211
212        console.log('File size checks bypassed');
213    }
214
215    // Function to monitor and remove dynamic limit messages
216    function setupMutationObserver() {
217        const observer = new MutationObserver(function(mutations) {
218            mutations.forEach(function(mutation) {
219                mutation.addedNodes.forEach(function(node) {
220                    if (node.nodeType === 1) { // Element node
221                        const text = node.textContent.toLowerCase();
222                        if (text.includes('limit') || text.includes('upgrade') || text.includes('wait') || 
223                            text.includes('reached') || text.includes('premium') || text.includes('hour') ||
224                            text.includes('break for')) {
225                            node.style.display = 'none';
226                            console.log('Blocked dynamic limit message');
227                        }
228                    }
229                });
230            });
231        });
232
233        observer.observe(document.body, {
234            childList: true,
235            subtree: true
236        });
237
238        console.log('Mutation observer setup complete');
239    }
240
241    // Function to inject premium status indicator
242    function addPremiumIndicator() {
243        const indicator = document.createElement('div');
244        indicator.id = 'sejda-premium-indicator';
245        indicator.textContent = '✓ Premium Unlocked';
246        indicator.style.cssText = `
247            position: fixed;
248            top: 10px;
249            right: 10px;
250            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
251            color: white;
252            padding: 10px 20px;
253            border-radius: 25px;
254            font-weight: bold;
255            font-size: 14px;
256            z-index: 999999;
257            box-shadow: 0 4px 15px rgba(0,0,0,0.2);
258            font-family: Arial, sans-serif;
259        `;
260        document.body.appendChild(indicator);
261        console.log('Premium indicator added');
262
263        // Remove after 5 seconds
264        setTimeout(() => {
265            indicator.style.transition = 'opacity 0.5s';
266            indicator.style.opacity = '0';
267            setTimeout(() => indicator.remove(), 500);
268        }, 5000);
269    }
270
271    // Initialize the extension
272    function init() {
273        console.log('Initializing Sejda Premium Unlocker...');
274
275        // Wait for page to be ready
276        if (document.readyState === 'loading') {
277            document.addEventListener('DOMContentLoaded', init);
278            return;
279        }
280
281        // Apply all bypasses
282        unlockPremiumFeatures();
283        interceptRequests();
284        bypassFileSizeCheck();
285        removeLimitWarnings();
286        setupMutationObserver();
287        addPremiumIndicator();
288
289        // Continuously remove warnings every 2 seconds
290        setInterval(removeLimitWarnings, 2000);
291
292        console.log('Sejda Premium Unlocker - Fully initialized!');
293        console.log('All limits bypassed: File size, task limits, and premium features unlocked');
294    }
295
296    // Start the extension
297    init();
298
299})();
Sejda Premium Unlocker | Robomonkey