// ==UserScript==
// @name Medium Member Bypass
// @namespace http://tampermonkey.net/
// @author UniverseDev
// @license GPL-3.0-or-later
// @version 12.5
// @description Undetectable Medium-to-Freedium Redirector with Modern Medium-Themed Settings
// @match *://*.medium.com/*
// @match https://freedium.cfd/*
// @grant GM_registerMenuCommand
// @grant GM_setValue
// @grant GM_getValue
// ==/UserScript==
(() => {
'use strict';
const config = {
freediumUrl: 'https://freedium.cfd/',
memberOnlyDivSelector: 'p.bf.b.bg.z.bk',
autoRedirectDelay: GM_getValue('redirectDelay', 5000),
autoRedirectEnabled: GM_getValue('autoRedirect', true),
darkModeEnabled: GM_getValue('darkModeEnabled', false),
isFreediumSession: GM_getValue('isFreediumSession', false),
};
const injectStyles = () => {
const style = document.createElement('style');
style.textContent = `
.medium-settings {
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 360px;
background-color: var(--background-color, white);
box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2);
border-radius: 16px;
font-family: 'Arial', sans-serif;
z-index: 10000;
padding: 20px;
display: none;
color: var(--text-color, #333);
cursor: grab;
}
.medium-settings.dark {
--background-color: #333;
--text-color: white;
}
.medium-settings-header {
font-size: 22px;
font-weight: bold;
margin-bottom: 20px;
text-align: center;
}
.medium-settings-toggle {
margin: 15px 0;
display: flex;
justify-content: space-between;
align-items: center;
}
.medium-settings-input {
margin-left: 10px;
width: 70px;
padding: 6px;
text-align: center;
border: 1px solid #ccc;
border-radius: 4px;
}
.medium-settings-button {
background-color: var(--button-bg-color, #1a8917);
color: var(--button-text-color, white);
border: none;
padding: 8px 14px;
border-radius: 20px;
cursor: pointer;
font-weight: bold;
transition: background-color 0.3s;
}
.medium-settings-button:hover {
background-color: #155c11;
}
.medium-notification {
position: fixed;
bottom: 20px;
right: 20px;
background-color: #1a8917;
color: white;
padding: 15px;
border-radius: 20px;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
font-family: 'Arial', sans-serif;
z-index: 10000;
opacity: 0;
transform: translateY(20px);
transition: all 0.3s ease;
}
.medium-notification.show {
opacity: 1;
transform: translateY(0);
}
`;
document.head.appendChild(style);
};
const stealthNotification = (message) => {
const notification = document.createElement('div');
notification.className = 'medium-notification';
notification.textContent = message;
document.body.appendChild(notification);
setTimeout(() => notification.classList.add('show'), 50);
setTimeout(() => {
notification.classList.remove('show');
setTimeout(() => notification.remove(), 300);
}, 3000);
};
const showMediumSettings = () => {
const settingsContainer = document.createElement('div');
settingsContainer.className = `medium-settings ${config.darkModeEnabled ? 'dark' : ''}`;
settingsContainer.innerHTML = `
<div class="medium-settings-header">Medium Settings</div>
<div class="medium-settings-toggle">
<span>Auto-Redirect</span>
<button class="medium-settings-button" id="toggleRedirect">${config.autoRedirectEnabled ? 'ON' : 'OFF'}</button>
</div>
<div class="medium-settings-toggle">
<span>Redirect Delay (ms)</span>
<input type="number" class="medium-settings-input" id="redirectDelay" value="${config.autoRedirectDelay}" />
</div>
<div class="medium-settings-toggle">
<span>Dark Mode</span>
<button class="medium-settings-button" id="toggleDarkMode">${config.darkModeEnabled ? 'ON' : 'OFF'}</button>
</div>
<div class="medium-settings-toggle">
<button class="medium-settings-button" id="manualRedirect">Bypass</button>
</div>
<div class="medium-settings-toggle">
<button class="medium-settings-button" id="resetDefaults">Reset to Default</button>
</div>
<div class="medium-settings-toggle">
<button class="medium-settings-button" id="saveSettings">Save</button>
<button class="medium-settings-button" id="closeSettings">Close</button>
</div>
`;
document.body.appendChild(settingsContainer);
let isDragging = false;
let startX, startY;
settingsContainer.addEventListener('mousedown', (e) => {
isDragging = true;
startX = e.clientX - settingsContainer.offsetLeft;
startY = e.clientY - settingsContainer.offsetTop;
settingsContainer.style.cursor = 'grabbing';
});
document.addEventListener('mousemove', (e) => {
if (!isDragging) return;
settingsContainer.style.left = `${e.clientX - startX}px`;
settingsContainer.style.top = `${e.clientY - startY}px`;
});
document.addEventListener('mouseup', () => {
isDragging = false;
settingsContainer.style.cursor = 'grab';
});
settingsContainer.querySelector('#toggleRedirect').addEventListener('click', () => {
config.autoRedirectEnabled = !config.autoRedirectEnabled;
GM_setValue('autoRedirect', config.autoRedirectEnabled);
settingsContainer.querySelector('#toggleRedirect').textContent = config.autoRedirectEnabled ? 'ON' : 'OFF';
stealthNotification('Auto-Redirect toggled');
});
settingsContainer.querySelector('#toggleDarkMode').addEventListener('click', () => {
config.darkModeEnabled = !config.darkModeEnabled;
GM_setValue('darkModeEnabled', config.darkModeEnabled);
settingsContainer.classList.toggle('dark', config.darkModeEnabled);
settingsContainer.querySelector('#toggleDarkMode').textContent = config.darkModeEnabled ? 'ON' : 'OFF';
stealthNotification('Dark Mode toggled');
});
settingsContainer.querySelector('#resetDefaults').addEventListener('click', () => {
config.autoRedirectDelay = 5000;
config.autoRedirectEnabled = true;
config.darkModeEnabled = false;
GM_setValue('redirectDelay', config.autoRedirectDelay);
GM_setValue('autoRedirect', config.autoRedirectEnabled);
GM_setValue('darkModeEnabled', config.darkModeEnabled);
settingsContainer.querySelector('#redirectDelay').value = config.autoRedirectDelay;
settingsContainer.querySelector('#toggleRedirect').textContent = 'ON';
settingsContainer.querySelector('#toggleDarkMode').textContent = 'OFF';
settingsContainer.classList.remove('dark');
stealthNotification('Settings reset to defaults');
});
settingsContainer.querySelector('#saveSettings').addEventListener('click', () => {
const newDelay = parseInt(settingsContainer.querySelector('#redirectDelay').value, 10);
if (!isNaN(newDelay) && newDelay >= 0) {
config.autoRedirectDelay = newDelay;
GM_setValue('redirectDelay', newDelay);
stealthNotification('Settings saved');
}
});
settingsContainer.querySelector('#closeSettings').addEventListener('click', () => {
settingsContainer.style.display = 'none';
});
settingsContainer.querySelector('#manualRedirect').addEventListener('click', () => {
window.location.href = config.freediumUrl + window.location.pathname;
stealthNotification('Bypassing to Freedium...');
});
settingsContainer.style.display = 'block';
};
const performAutoRedirect = () => {
if (config.isFreediumSession) return;
if (config.autoRedirectEnabled && document.querySelector(config.memberOnlyDivSelector)) {
setTimeout(() => {
window.location.href = config.freediumUrl + window.location.pathname;
}, config.autoRedirectDelay);
stealthNotification('Redirecting to Freedium...');
}
};
const initializeScript = () => {
injectStyles();
if (window.location.href.startsWith('https://medium.com/')) {
GM_registerMenuCommand('Open Medium Settings', showMediumSettings);
performAutoRedirect();
GM_setValue('isFreediumSession', false);
} else if (window.location.href.startsWith(config.freediumUrl)) {
GM_setValue('isFreediumSession', true);
}
};
initializeScript();
})();