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