您需要先安装一个扩展,例如 篡改猴、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或关注我们的公众号极客氢云获取最新地址