// ==UserScript== // @name Edge商店下载zip插件 // @description 从Edge扩展商店获取zip格式的插件,用于安装到chrome上 // @namespace Sency // @author Sency // @version 1.1 // @match http*://microsoftedge.microsoft.com/addons/* // @require https://scriptcat.org/lib/513/2.1.0/ElementGetter.js // @grant GM_xmlhttpRequest // @connect microsoft.com // @run-at document-idle // @nocompat Chrome // ==/UserScript== /* global elmGetter */ (function() { 'use strict'; //下载文件(GM_download会将后缀改回crx) function download(url, filename) { return new Promise((resolve, reject) => { GM_xmlhttpRequest({ url: url, method: 'get', responseType: 'blob', overrideMimeType: 'application/zip', //不加这句脚本猫会自动安装 onload: res => { if (res.status === 200) { const href = URL.createObjectURL(res.response); const a = document.createElement('a'); a.href = href; a.download = filename; a.click(); URL.revokeObjectURL(href); resolve(); } else { reject(res.status); } }, onerror: () => reject('error') }); }); } // 根据插件id获取插件名称 const extensionList = {}; function getExtensionName(crxId) { return new Promise((resolve, reject) => { if (extensionList[crxId]) return resolve(extensionList[crxId]); GM_xmlhttpRequest({ url: `https://microsoftedge.microsoft.com/addons/getproductdetailsbycrxid/${crxId}?hl=zh-CN&gl=CN`, method: 'get', //headers: {Referer: 'https://microsoftedge.microsoft.com/addons/detail/%E7%AF%A1%E6%94%B9%E7%8C%B4/iikmkjmpaadaobahmlepeloendndfphd?hl=zh-CN'}, onload: res => { if (res.status === 200) { extensionList[crxId] = JSON.parse(res.responseText).name.replace(/[\/:*?"<>|]/g, ''); resolve(extensionList[crxId]); } else { reject(res.status); } }, onerror: () => reject('error') }); }); } //启用或禁用按钮 function setButtonState(button, disabled, innerText) { button.disabled = disabled; button.style.setProperty('cursor', disabled ? 'not-allowed' : 'pointer', 'important'); button.style.setProperty('opacity', disabled ? '0.3' : '1', 'important'); button.innerText = innerText; } //替换下载按钮 async function replaceButton(button) { const crxId = button.id.split('-')[1]; const name = await getExtensionName(crxId); button.innerHTML = ''; button.classList.add('replaced'); setButtonState(button, false, '下载zip'); button.addEventListener('click', e => { e.stopImmediatePropagation(); setButtonState(button, true, '下载中'); const url = `https://edge.microsoft.com/extensionwebstorebase/v1/crx?response=redirect&acceptformat=crx3&x=id%3D${crxId}%26installsource%3Dondemand%26uc`; download(url, `${name}.zip`).then( () => setButtonState(button, false, '下载zip'), () => setButtonState(button, true, '下载失败') ); }, true); } //监听获取下载按钮并替换 elmGetter.each('[id^=installButton-]:not(.replaced)', replaceButton); })();