您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Allows to you export and import your Wordle save data
// ==UserScript== // @name Wordle save file helper // @namespace il0x89mvb33pzor0fqyj // @description Allows to you export and import your Wordle save data // @match https://www.nytimes.com/games/wordle/* // @grant GM.registerMenuCommand // @grant GM.setClipboard // @grant GM.getValue // @grant GM.setValue // @grant GM.deleteValue // @version 1.3 // @run-at document-start // @inject-into content // @license MIT // ==/UserScript== (function () { "use strict"; function getLocalStorageAsString() { const result = Object.create(null); for (let i = 0, l = localStorage.length; i < l; ++i) { const key = localStorage.key(i); if (key.startsWith("nyt-wordle-")) { result[key.substring(11)] = localStorage.getItem(key); } } return JSON.stringify(result); } function importLocalStorageFromString(data) { try { data = JSON.parse(data); } catch (e) { return false; } for (let [k, v] of Object.entries(data)) { if (!k.startsWith("nyt-wordle-")) { k = `nyt-wordle-${k}`; } localStorage.setItem(k, v); } return true; } async function autoSave() { const savedata = await GM.getValue("autosave"); if (savedata) { const playedSave = JSON.parse(JSON.parse(savedata).statistics).gamesPlayed; const playedActual = JSON.parse(localStorage.getItem("nyt-wordle-statistics")).gamesPlayed; if (playedActual < playedSave) { return; } } // No save data, or number of games is equal/higher GM.setValue("autosave", getLocalStorageAsString()); } // Save every minute while the tab is active, // and when it gains/loses focus let saveInterval; function onFocus() { clearInterval(saveInterval); autoSave(); saveInterval = setInterval(autoSave, 60000); } function onBlur() { clearInterval(saveInterval); autoSave(); } window.addEventListener("focus", onFocus); window.addEventListener("blur", onBlur); GM.registerMenuCommand("Export Wordle save data", () => { GM.setClipboard(btoa(getLocalStorageAsString())); alert("Save data copied to clipboard."); }); GM.registerMenuCommand("Import Wordle save data", () => { const imported = prompt("Paste save data here:"); if (imported && importLocalStorageFromString(atob(imported))) { alert("Import successful!"); location.reload(); } }); GM.registerMenuCommand("Restore latest autosave", async () => { const savedata = await GM.getValue("autosave"); if (savedata) { const playedSave = JSON.parse(JSON.parse(savedata).statistics).gamesPlayed; if (confirm(`The autosave has ${playedSave} games on record. Really restore it?`) && importLocalStorageFromString(savedata)) { alert("Restore successful!"); location.reload(); } } }); GM.registerMenuCommand("Delete autosave", () => { if (confirm("Really DELETE the stored autosave?")) { // Disable autosaving on this page load window.removeEventListener("focus", onFocus); window.removeEventListener("blur", onBlur); clearInterval(saveInterval); GM.deleteValue("autosave"); alert("Autosave cleared."); } }); })();