去除Save My Exams非登录用户的5次查看限制
// ==UserScript==
// @name Save SaveMyExams
// @name:en Save SaveMyExams
// @namespace http://tampermonkey.net/
// @version 2025.6.14
// @description 去除Save My Exams非登录用户的5次查看限制
// @description:en Remove the 5-view limit for non-logged-in users of Save My Exams
// @author ZZW
// @match *://www.savemyexams.com/*
// @icon https://www.google.com/s2/favicons?sz=64&domain=savemyexams.com
// @grant none
// @license MIT
// ==/UserScript==
(() => {
function clearCookies() {
const cookies = document.cookie.split('; ');
const domain = location.hostname.split('.').slice(-2).join('.');
const past = 'Thu, 01 Jan 1970 00:00:00 GMT';
cookies.forEach(c => {
const eq = c.indexOf('=');
const name = eq > -1 ? c.substr(0, eq) : c;
document.cookie = `${name}=; expires=${past}; path=/`;
document.cookie = `${name}=; expires=${past}; path=/; domain=.${domain}`;
});
}
async function clearStorage() {
try {
localStorage.clear();
} catch (e) {}
try {
sessionStorage.clear();
} catch (e) {}
if (indexedDB && typeof indexedDB.databases === 'function') {
try {
const dbs = await indexedDB.databases();
dbs.forEach(db => {
if (db.name) indexedDB.deleteDatabase(db.name);
});
} catch (e) {
}
}
}
function clearServiceWorkers() {
if ('serviceWorker' in navigator) {
navigator.serviceWorker.getRegistrations()
.then(rs => rs.forEach(r => r.unregister()))
.catch(() => {});
}
}
async function wipe() {
clearCookies();
await clearStorage();
clearServiceWorkers();
}
wipe();
document.addEventListener('click', e => {
const link = e.target.closest('a[href]');
if (!link) return;
if (e.defaultPrevented || (e.button !== 0 && e.button !== 1)) return;
wipe();
}, true);
})();