您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Enables the download of high-resolution PNG images from a 'SmartFrame'
// ==UserScript== // @name SmartFrame Downloader // @namespace hoixw // @version 1.1 // @description Enables the download of high-resolution PNG images from a 'SmartFrame' // @author hoixw // @match *://*/* // @grant none // @run-at document-start // @license MIT // ==/UserScript== // Check if the flag is set in localStorage (uses run-at document start) if (localStorage.getItem('runCodeAfterRefresh') === 'true') { // Remove the flag from localStorage localStorage.removeItem('runCodeAfterRefresh'); /* This forces all shadow-roots created to be open. Closed shadow-roots, as used by the smartFrame, cannot be accessed through JS. That's why they exist. Open shadow-roots can, so this means we can just access it and grab the image. */ const nativeAttachShadow = Element.prototype.attachShadow; // Override attachShadow but force mode open Element.prototype.attachShadow = function(init) { init.mode = "open"; return nativeAttachShadow.call(this, init); }; // Mask the override by patching toString so it returns a benign string Object.defineProperty(Element.prototype.attachShadow, 'toString', { value: function() { return "function attachShadow() { [native code] }"; }, writable: false, }); var checkForSmartFrame = setInterval(function() { if (document.querySelector('smartframe-embed')) { clearInterval(checkForSmartFrame); // Stop checking once the element is found var smartFrame = document.querySelector('smartframe-embed'); var styles = getComputedStyle(smartFrame); // Actual width and height of image are stored here var width = smartFrame.style.getPropertyValue('--sf-original-width'); var height = smartFrame.style.getPropertyValue('--sf-original-height'); // Correct width and height variables smartFrame.style.width = width + "px"; smartFrame.style.maxWidth = width + "px"; smartFrame.style.height = height + "px"; smartFrame.style.maxHeight = height + "px"; setTimeout(() => { var stage = smartFrame.shadowRoot.querySelector("canvas.stage"); var url = document.createElement("canvas").toDataURL.call(stage); var a = document.createElement("a"); var t = smartFrame.getAttribute("image-id").replace(/\s/g, '-') + ".png"; a.href = url; a.download = t; a.click(); }, 3000); } }, 1000); } else { // Wait for the page to load completely (otherwise smart-frame won't exist) window.addEventListener('load', function() { if (document.querySelector('smartframe-embed')) { 'use strict'; var executeButton = document.createElement('button'); executeButton.textContent = 'Download Hi-Res'; executeButton.style.padding = '10px 20px'; executeButton.style.backgroundColor = '#007BFF'; executeButton.style.color = 'white'; executeButton.style.border = 'none'; executeButton.style.borderRadius = '5px'; executeButton.style.cursor = 'pointer'; executeButton.style.fontWeight = 'bold'; executeButton.style.margin = '10px'; // Attach a click event listener to the button executeButton.addEventListener('click', function() { // Sets localStorage flag for code to be run after refresh immediately localStorage.setItem('runCodeAfterRefresh', 'true'); location.reload(); }); var smartFrameParent = document.querySelector('smartframe-embed').parentElement; smartFrameParent.appendChild(executeButton); } }); }
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址