Warning: fopen(/www/sites/update.greasyfork.icu/index/store/forever/aae197fa37a131d6ae141d38c7b90ae5.js): failed to open stream: No space left on device in /www/sites/update.greasyfork.icu/index/scriptControl.php on line 65
// ==UserScript==
// @name Bypass netflix household
// @namespace http://tampermonkey.net/
// @version 1.2
// @description A script that bypasses Netflix's household verification screen by injecting a valid user cookie, allowing seamless access to your account without repeated logins, ideal for testing and automation scenarios.
// @author bitbit
// @match https://www.netflix.com/*
// @grant none
// @downloadURL none
// ==/UserScript==
(function () {
'use strict';
let currentPath = location.pathname;
const freezeMainThread = (durationMs = 8000) => {
const start = performance.now();
setTimeout(() => {
while (performance.now() - start < durationMs) {
// Busy block
}
}, 100);
console.log('%c[BLOCK] JS frozen for 8s', 'color: red; font-weight: bold;');
};
const isWatchPage = () => location.pathname.startsWith('/watch');
const removeModalPopup = () => {
const modals = document.querySelectorAll('.nf-modal.interstitial-full-screen');
modals.forEach(modal => {
if (modal) {
modal.remove();
console.log('%c[MODAL] Removed modal popup', 'color: blue; font-weight: bold;');
}
});
};
const tryFreezeIfReady = (observer) => {
const video = document.querySelector('video');
const controls = document.querySelector('[data-uia="controls-standard"]');
if (video && controls) {
if (observer) observer.disconnect();
console.log('%c[INFO] Watch page ready. Freezing...', 'color: orange; font-weight: bold;');
freezeMainThread(8000);
return true;
}
return false;
};
const handleWatchPage = () => {
if (tryFreezeIfReady()) return;
const observer = new MutationObserver(() => {
tryFreezeIfReady(observer);
});
observer.observe(document.body, { childList: true, subtree: true });
};
const handleOtherPages = () => {
const observer = new MutationObserver(() => {
const modal = document.querySelector('[data-uia="nf-modal-background"]');
if (modal) {
observer.disconnect();
removeModalPopup();
}
});
observer.observe(document.body, { childList: true, subtree: true });
};
const handleRouteChange = () => {
console.log('%c[ROUTE] Now at: ' + location.pathname, 'color: purple; font-weight: bold;');
const newPath = location.pathname;
if (isWatchPage()) {
// Kiểm tra đã reload cho đường dẫn này trong session chưa
const alreadyReloaded = sessionStorage.getItem('reloaded-' + newPath);
if (!alreadyReloaded) {
console.log('%c[RELOAD] First time on this watch path. Reloading...', 'color: red; font-weight: bold;');
sessionStorage.setItem('reloaded-' + newPath, 'true');
location.reload();
return;
}
handleWatchPage();
} else {
// Reset toàn bộ key reloaded nếu không còn ở trang /watch
Object.keys(sessionStorage).forEach(key => {
if (key.startsWith('reloaded-/watch')) {
sessionStorage.removeItem(key);
}
});
handleOtherPages();
}
};
const hookHistory = () => {
const originalPush = history.pushState;
const originalReplace = history.replaceState;
history.pushState = function () {
originalPush.apply(this, arguments);
setTimeout(onUrlChange, 50);
};
history.replaceState = function () {
originalReplace.apply(this, arguments);
setTimeout(onUrlChange, 50);
};
window.addEventListener('popstate', onUrlChange);
};
const onUrlChange = () => {
if (location.pathname !== currentPath) {
currentPath = location.pathname;
handleRouteChange();
}
};
const init = () => {
hookHistory();
handleRouteChange();
};
if (document.readyState === 'complete' || document.readyState === 'interactive') {
init();
} else {
window.addEventListener('DOMContentLoaded', init);
}
})();