// ==UserScript== // @name Bypass FileCrypt (Improved) // @namespace IA // @version 1.0.4b // @description Bypass FileCrypt with improved link extraction // @author IA (with improvements) // @license MIT // @match http://filecrypt.cc/* // @match http://www.filecrypt.cc/* // @match http://filecrypt.co/* // @match http://www.filecrypt.co/* // @match https://filecrypt.cc/* // @match https://www.filecrypt.cc/* // @match https://filecrypt.co/* // @match https://www.filecrypt.co/* // @run-at document-end // @connect dcrypt.it // @connect self // @grant GM.xmlHttpRequest // ==/UserScript== (function() { 'use strict'; // Determine if dark theme is used const isDarkTheme = document.head.querySelector('meta[name="theme-color"]') !== null || document.body.classList.contains('dark') || window.getComputedStyle(document.body).backgroundColor.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)/)?.[1] < 100; // Add basic stylesheet addStylesheet(isDarkTheme); // Remove ads removeAds(); // Apply main functionality based on URL if (document.location.href.includes("/Link/")) { getSingleLink(); } else if (document.location.href.includes("/Container/")) { waitForCaptchaSolved(); } })(); // Add basic stylesheet function addStylesheet(isDarkTheme) { const style = document.createElement('style'); const colors = isDarkTheme ? { background: '#1e1e2e', text: '#cdd6f4', accent: '#cba6f7', border: '#313244', error: '#f38ba8' } : { background: '#ffffff', text: '#333333', accent: '#4f46e5', border: '#e5e7eb', error: '#ef4444' }; style.textContent = ` .fc-container { background-color: ${colors.background}; color: ${colors.text}; border: 1px solid ${colors.border}; border-radius: 10px; padding: 1em; margin: 1em auto; max-width: 600px; position: relative; z-index: 10; font-size: 14px; } .fc-container span { cursor: pointer; color: ${colors.accent}; } .fc-container span:hover { text-decoration: underline; } .fc-error { color: ${colors.error}; } .fc-loading { text-align: center; padding: 1em; } `; document.head.appendChild(style); } // Remove ads function removeAds() { const usenetAds = document.querySelectorAll('a[href*="/pink/"]'); for (const ad of usenetAds) { if (ad.parentNode) ad.parentNode.remove(); } } // Check if captcha is solved function waitForCaptchaSolved() { function isCaptchaSolved() { return document.querySelectorAll('.dlcdownload, .download, [href*="/DLC/"]').length > 0; } if (isCaptchaSolved()) { processContainerPage(); return; } const captchaObserver = new MutationObserver((mutations, observer) => { if (isCaptchaSolved()) { observer.disconnect(); processContainerPage(); } }); captchaObserver.observe(document.body, { childList: true, subtree: true }); } // Process container page function processContainerPage() { const containerSection = findBestContainer(); const container = createLinkBox(); containerSection.insertBefore(container, containerSection.firstChild); const dlcButtons = document.querySelectorAll('.dlcdownload, [href*="/DLC/"]'); if (dlcButtons.length > 0) { const dlcId = dlcButtons[0].getAttribute('onclick')?.split("'")[1] || dlcButtons[0].getAttribute('href')?.match(/\/DLC\/(.+)\.dlc/)?.[1]; if (dlcId) { fetchDlcAndDecrypt(dlcId, container); return; } } xhrLinkExtract(container); } // Find the best container function findBestContainer() { const selectors = [ '.content .window', '.download', '.content', 'main', 'article', '.container', '#container' ]; for (const selector of selectors) { const element = document.querySelector(selector); if (element) return element; } return document.body; } // Create link box function createLinkBox() { const container = document.createElement('div'); container.className = 'fc-container'; container.id = 'fc-container'; const loading = document.createElement('div'); loading.className = 'fc-loading'; loading.textContent = 'Decrypting links...'; container.appendChild(loading); return container; } // Fetch and decrypt DLC function fetchDlcAndDecrypt(dlcId, container) { container.querySelector('.fc-loading').textContent = 'Fetching DLC file...'; GM.xmlHttpRequest({ method: 'GET', url: `https://${document.location.hostname}/DLC/${dlcId}.dlc`, headers: { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36' }, onload: function(response) { container.querySelector('.fc-loading').textContent = 'Decrypting via dcrypt.it...'; GM.xmlHttpRequest({ method: 'POST', url: 'http://dcrypt.it/decrypt/paste', headers: { 'Content-Type': 'application/x-www-form-urlencoded', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36' }, data: 'content=' + encodeURIComponent(response.responseText), onload: function(res) { try { const result = JSON.parse(res.responseText); if (result.success && result.success.links && result.success.links.length > 0) { displayLinks(result.success.links, container); } else { console.error('No links from dcrypt.it:', result); xhrLinkExtract(container); } } catch (e) { console.error('Error parsing dcrypt.it response:', e); xhrLinkExtract(container); } }, onerror: function() { console.error('Error connecting to dcrypt.it'); xhrLinkExtract(container); } }); }, onerror: function() { console.error('Error fetching DLC file'); xhrLinkExtract(container); } }); } // Process single link page function getSingleLink() { if (document.body.getElementsByTagName('SCRIPT').length === 0) { window.stop(); let htmlContent = document.body.innerHTML; if (document.body.children.length === 0) { GM.xmlHttpRequest({ method: 'GET', url: document.location.href, headers: { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36' }, onload: function(response) { extractAndResolveLink(response.responseText); }, onerror: function() { console.error('Failed to fetch page content'); } }); } else { extractAndResolveLink(htmlContent); } } } function extractAndResolveLink(htmlContent) { const urlMatch = htmlContent.match(/https?:\/\/[^\s'"]+/); if (urlMatch) { let intermediateLink = urlMatch[0].replace(/&/g, '&'); resolveFinalLink(intermediateLink); } else { console.error('No valid URL found in HTML'); } } function resolveFinalLink(intermediateLink) { GM.xmlHttpRequest({ method: 'GET', url: intermediateLink, headers: { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36' }, timeout: 5000, onload: function(response) { let finalUrl = response.finalUrl || intermediateLink; console.log('Resolved final URL:', finalUrl); top.location.href = finalUrl; }, onerror: function() { console.error('Error resolving link:', intermediateLink); top.location.href = intermediateLink; } }); } // Extract links directly function xhrLinkExtract(container) { const loading = container.querySelector('.fc-loading'); loading.textContent = 'Extracting links directly...'; console.log('Starting xhrLinkExtract'); const encLinks = document.querySelectorAll('[onclick^=openLink], a[href*="/Link/"], [data-link], .download-link'); console.log('Found links:', encLinks.length); if (encLinks.length === 0) { showError('No links found on this page.', container); return; } const finalLinksDiv = document.createElement('div'); finalLinksDiv.style.backgroundColor = isDarkTheme ? '#1e1e2e' : '#ffffff'; finalLinksDiv.style.color = isDarkTheme ? '#cdd6f4' : '#333333'; finalLinksDiv.style.padding = '1em'; finalLinksDiv.innerHTML = 'Decrypted links:

'; container.replaceChild(finalLinksDiv, loading); function processLinks(index = 0) { if (index >= encLinks.length) { if (!finalLinksDiv.querySelector('a')) { showError('Failed to extract any valid links.', container); } return; } const link = encLinks[index]; let linkUrl; if (link.getAttribute('href')?.includes('/Link/')) { linkUrl = link.getAttribute('href'); } else if (link.getAttribute('onclick')?.startsWith('openLink')) { const passA = link.getAttribute('onclick'); const passB = passA.split("'")[1]; const passC = link.getAttribute(passB); linkUrl = `http://${document.location.hostname}/Link/${passC}.html`; } else { linkUrl = link.getAttribute('data-link') || link.getAttribute('href'); } if (!linkUrl) { console.error('No valid URL for link:', link); setTimeout(() => processLinks(index + 1), 100); return; } console.log('Processing URL:', linkUrl); GM.xmlHttpRequest({ method: 'GET', url: linkUrl, headers: { 'Content-Type': 'application/x-www-form-urlencoded', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36' }, timeout: 5000, onload: function(response) { let parser = new DOMParser(); let doc = parser.parseFromString(response.responseText, 'text/html'); let scripts = doc.getElementsByTagName('SCRIPT'); console.log('Scripts found for', linkUrl, ':', scripts.length); for (let s of scripts) { if (s.innerHTML.includes('top.location.href=')) { getFinalLink(s.innerHTML.split("'")[1], finalLinksDiv); setTimeout(() => processLinks(index + 1), 100); return; } } let metaRefresh = doc.querySelector('meta[http-equiv="refresh"]'); if (metaRefresh) { let content = metaRefresh.getAttribute('content'); let urlMatch = content.match(/url=(.+)$/i); if (urlMatch) { getFinalLink(urlMatch[1], finalLinksDiv); setTimeout(() => processLinks(index + 1), 100); return; } } console.error('No redirect found for:', linkUrl); setTimeout(() => processLinks(index + 1), 100); }, onerror: function() { console.error('Error fetching:', linkUrl); setTimeout(() => processLinks(index + 1), 100); } }); } processLinks(); } // Display final link function getFinalLink(encLink, finalLinksDiv) { GM.xmlHttpRequest({ method: 'GET', url: encLink, headers: { 'Content-Type': 'application/x-www-form-urlencoded', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36' }, timeout: 5000, onload: function(response) { let finalUrl = response.finalUrl || encLink; // Rimuovi la parte "login?redirect=" se presente finalUrl = finalUrl.replace(/login\?redirect=/, ''); console.log('Decrypted locally:', finalUrl); let linkElement = document.createElement('a'); linkElement.href = finalUrl; linkElement.textContent = finalUrl; linkElement.style.color = isDarkTheme() ? '#cba6f7' : '#4f46e5'; linkElement.addEventListener('click', function(e) { e.preventDefault(); window.open(finalUrl, '_blank'); }); linkElement.addEventListener('contextmenu', function(e) { e.preventDefault(); navigator.clipboard.writeText(finalUrl).then(() => { linkElement.textContent = '✓ Copied: ' + finalUrl; setTimeout(() => { linkElement.textContent = finalUrl; }, 2000); }); }); finalLinksDiv.appendChild(linkElement); finalLinksDiv.appendChild(document.createElement('br')); }, onerror: function() { console.error('Error resolving link:', encLink); let errorElement = document.createElement('span'); errorElement.textContent = `${encLink} (Failed to resolve)`; errorElement.className = 'fc-error'; finalLinksDiv.appendChild(errorElement); finalLinksDiv.appendChild(document.createElement('br')); } }); } // Display links function displayLinks(links, container) { const finalLinksDiv = document.createElement('div'); finalLinksDiv.style.backgroundColor = isDarkTheme ? '#1e1e2e' : '#ffffff'; finalLinksDiv.style.color = isDarkTheme ? '#cdd6f4' : '#333333'; finalLinksDiv.style.padding = '1em'; finalLinksDiv.innerHTML = 'Decrypted links:

'; links.forEach(link => { // Rimuovi la parte "login?redirect=" se presente let cleanedLink = link.replace(/login\?redirect=/, ''); let linkElement = document.createElement('a'); linkElement.href = cleanedLink; linkElement.textContent = cleanedLink; linkElement.style.color = isDarkTheme ? '#cba6f7' : '#4f46e5'; linkElement.addEventListener('click', function(e) { e.preventDefault(); window.open(cleanedLink, '_blank'); }); linkElement.addEventListener('contextmenu', function(e) { e.preventDefault(); navigator.clipboard.writeText(cleanedLink).then(() => { linkElement.textContent = '✓ Copied: ' + cleanedLink; setTimeout(() => { linkElement.textContent = cleanedLink; }, 2000); }); }); finalLinksDiv.appendChild(linkElement); finalLinksDiv.appendChild(document.createElement('br')); }); container.replaceChild(finalLinksDiv, container.querySelector('.fc-loading')); } // Show error message function showError(message, container) { const errorDiv = document.createElement('div'); errorDiv.className = 'fc-error'; errorDiv.textContent = message; container.replaceChild(errorDiv, container.querySelector('.fc-loading')); } // Helper to detect dark theme function isDarkTheme() { return document.head.querySelector('meta[name="theme-color"]') !== null || document.body.classList.contains('dark') || window.getComputedStyle(document.body).backgroundColor.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)/)?.[1] < 100; }