EdgeDL:让 Android Edge 浏览器使用外部下载器下载文件
// ==UserScript==
// @name EdgeDL
// @namespace https://github.com/Chumor/EdgeDL
// @version 1.4.4
// @description EdgeDL:让 Android Edge 浏览器使用外部下载器下载文件
// @icon data:image/png;base64,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
// @author Chumor
// @match *://*/*
// @grant GM_registerMenuCommand
// @grant GM_setValue
// @grant GM_getValue
// @grant GM_deleteValue
// @license Apache-2.0
// @run-at document-start
// @website https://scriptcat.org/zh-CN/script-show-page/5391
// @supportURL https://github.com/Chumor/EdgeDL/issues
// ==/UserScript==
(function () {
'use strict';
// 下载器用户配置
const DOWNLOADERS = {
IDM: 'idm.internet.download.manager',
IDM_PLUS: 'idm.internet.download.manager.plus',
ADM: 'com.dv.adm',
ABDM: 'com.abdownloadmanager',
FDM: 'org.freedownloadmanager.fdm',
};
// 默认下载器
const DEFAULT_DOWNLOADER_KEY = 'edgedl-default-downloader';
const DEFAULT_DOWNLOADER = DOWNLOADERS.IDM;
// 版本信息
function getEdgeDLVersion() {
return (typeof GM_info !== 'undefined' && GM_info.script?.version)
? GM_info.script.version
: 'dev';
}
// 当前选中的下载器
GM_getValue(
DEFAULT_DOWNLOADER_KEY,
DEFAULT_DOWNLOADER
);
// 下载链接关键字匹配
const EXTENSIONS = ['.apk','.apks','.xapk','.apkm','.ipa','.obb','.aab','.zip','.rar','.7z','.tar','.gz','.tgz','.bz2','.xz','.iso','.cab','.jar','.z','.mp4','.mkv','.avi','.mov','.flv','.wmv','.webm','.m4v','.3gp','.ts','.mpg','.mpeg','.vob','.mp3','.flac','.wav','.ogg','.m4a','.aac','.wma','.ape','.pdf','.epub','.mobi','.azw3','.djvu','.doc','.docx','.xls','.xlsx','.ppt','.pptx','.exe','.msi','.bin','.dat','.dmg','.bat','.sh','.img','.torrent'];
// 下载链接后缀匹配
const KEYWORDS = ['/down/','/download/','/downloads/','/dl/','/fetch/','/files/','/file/','/attach/','/attachment/','/media/','/static/','/assets/','/cdn/','/dist/','/repo/','/backup/','/upload/','/releases/download/','/binary/','/pkg/','?file=','&file=','?filename=','&filename=','download?','&download=','?download=','&download=','force_download','response-content-disposition=','content-disposition=attachment'];
// 下载链接检测
function isDownloadLink(url){
if(url?.includes('sourceforge.net/projects/') && url.includes('/files/')) return false;
if(!url || !url.startsWith('http')) return false;
const lowerUrl = url.toLowerCase();
// 排除非下载页面
if(
lowerUrl.includes('/login')||lowerUrl.includes('/register')||
lowerUrl.includes('/signin')||lowerUrl.includes('/signup')||
lowerUrl.includes('/logout')||
lowerUrl.includes('/account/')||lowerUrl.includes('/user/')||
lowerUrl.includes('/blob/')||lowerUrl.includes('/src/')||
lowerUrl.includes('/tree/')
) return false;
// 后缀匹配
try{
const path = new URL(url).pathname.toLowerCase();
if(EXTENSIONS.some(ext=>path.endsWith(ext))) return true;
}catch(e){
const path = lowerUrl.split('?')[0].split('#')[0];
if(EXTENSIONS.some(ext=>path.endsWith(ext))) return true;
}
// 关键字匹配
return KEYWORDS.some(kw=>lowerUrl.includes(kw));
}
// 从 onclick 中解析下载 URL
function extractUrlFromOnclick(onclick) {
if (!onclick) return null;
const match = onclick.match(
/(https?:\/\/[^"'()\s]+)/i
);
if (match) {
return match[1];
}
return null;
}
// 构建 Android Intent URL
function buildIntentUrl(url, packageName) {
const scheme = url.startsWith('https') ? 'https' : 'http';
const cleanLink = url.replace(/^https?:\/\//, '');
return `intent://${cleanLink}#Intent;scheme=${scheme};package=${packageName};type=*/*;action=android.intent.action.VIEW;category=android.intent.category.BROWSABLE;end`;
}
async function openIDM(url, packageName = DOWNLOADERS.IDM) {
const intentUrl = buildIntentUrl(url, packageName);
window.location.href = intentUrl;
}
function openADM(url, packageName = DOWNLOADERS.ADM) {
const intentUrl = buildIntentUrl(url, packageName);
window.location.href = intentUrl;
setTimeout(() => {
window.location.href = intentUrl;
}, 200);
}
function openABDM(url, packageName = DOWNLOADERS.ABDM) {
const intentUrl = buildIntentUrl(url, packageName);
window.location.href = intentUrl;
}
function openFDM(url, packageName = DOWNLOADERS.FDM) {
const intentUrl = buildIntentUrl(url, packageName);
window.location.href = intentUrl;
}
let styleInjected = false;
let activeToast = null;
// 注入全局样式
function injectStyle() {
if (styleInjected) return;
styleInjected = true;
const style = document.createElement('style');
style.textContent = `.edgedl-toast{position:fixed;top:64px;right:12px;left:auto;bottom:auto;transform:translateX(20px);z-index:999999;pointer-events:none;font-size:13px;font-weight:500;line-height:1.4;padding:7px 14px;border-radius:10px;white-space:nowrap;opacity:0;transition:opacity .22s ease,transform .22s ease;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);} .edgedl-toast[data-theme="light"]{background:#333333;color:#fff;box-shadow:0 4px 10px rgba(0,0,0,.25);} .edgedl-toast[data-theme="dark"]{background:#383838;color:#f5f5f5;border:1px solid rgba(255,255,255,.08);box-shadow:0 6px 16px rgba(0,0,0,.6);} .edgedl-toast.show{opacity:1;transform:translateX(0);} .edgedl-toast[data-type="error"]::before{content:"⚠";margin-right:6px;color:#f87171;} .edgedl-toast[data-type="info"]::before{content:"ⓘ";margin-right:6px;opacity:.8;}`;
document.head.appendChild(style);
}
// 获取当前深色或浅色主题
function getTheme() {
return window.matchMedia &&
window.matchMedia('(prefers-color-scheme: dark)').matches
? 'dark'
: 'light';
}
// 显示 toast
function showToast(message, options = {}) {
try {
injectStyle();
if (typeof options === 'number') options = { duration: options };
const {
duration = 900,
type = 'info'
} = options;
if (activeToast) activeToast.remove();
const toast = document.createElement('div');
toast.className = 'edgedl-toast';
toast.dataset.theme = getTheme();
toast.dataset.type = type;
toast.textContent = message;
document.body.appendChild(toast);
activeToast = toast;
requestAnimationFrame(() => {
toast.classList.add('show');
});
setTimeout(() => {
toast.classList.remove('show');
toast.addEventListener(
'transitionend',
() => {
toast.remove();
if (activeToast === toast) activeToast = null;
},
{ once: true }
);
}, duration);
} catch (err) {
console.warn('Toast 创建失败', err);
}
}
const KEY = 'edgedl-blacklist';
// 获取黑名单数组
async function getBlacklist() {
const list = await GM_getValue(KEY, []);
return Array.isArray(list) ? list : [];
}
// 保存黑名单
async function saveBlacklist(list) {
const norm = Array.from(
new Set(list.map(i => (typeof i === 'string' ? i.toLowerCase() : i)))
);
await GM_setValue(KEY, norm);
return norm;
}
// 判断当前站点是否在黑名单
async function isCurrentSiteBlacklisted() {
const host = location.hostname.toLowerCase();
const list = await getBlacklist();
return list.some(item => item.toLowerCase() === host);
}
// 切换当前站点黑名单状态
async function toggleCurrentSite() {
const host = location.hostname.toLowerCase();
const list = await getBlacklist();
let added;
const index = list.findIndex(item => item.toLowerCase() === host);
if (index >= 0) {
list.splice(index, 1);
added = false;
} else {
list.push(host);
added = true;
}
await saveBlacklist(list);
return added;
}
// 调用指定下载器下载
async function openDownload(url, downloader) {
if (await isCurrentSiteBlacklisted()) { showToast('黑名单:下载已阻止'); return; }
switch (downloader) {
case DOWNLOADERS.IDM:
showToast('IDM 正在唤起');
openIDM(url, DOWNLOADERS.IDM);
break;
case DOWNLOADERS.IDM_PLUS:
showToast('IDM+ 正在唤起');
openIDM(url, DOWNLOADERS.IDM_PLUS);
break;
case DOWNLOADERS.ADM:
showToast('ADM 正在唤起');
openADM(url);
break;
case DOWNLOADERS.ABDM:
showToast('ABDM 正在唤起');
openABDM(url);
break;
case DOWNLOADERS.FDM:
showToast('FDM 正在唤起');
openFDM(url);
break;
case 'edge':
default:
showToast('Edge 内置下载');
setTimeout(() => {
window.location.href = url;
}, 0);
break;
}
}
const downloaderIcons = {
IDM: 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48IS0tIFVwbG9hZGVkIHRvOiBTVkcgUmVwbywgd3d3LnN2Z3JlcG8uY29tLCBHZW5lcmF0b3I6IFNWRyBSZXBvIE1peGVyIFRvb2xzIC0tPg0KPHN2ZyB3aWR0aD0iODAwcHgiIGhlaWdodD0iODAwcHgiIHZpZXdCb3g9IjAgMCAxOTIgMTkyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDE5MiAxOTIiIHhtbDpzcGFjZT0icHJlc2VydmUiPjxwYXRoIGQ9Ik00NS45IDg4LjJjMCAxLjItLjcgMi4xLTEuOSAyLjMtMTMuMiAyLjktMjIuNSAxNC44LTIyIDI4IC4zIDcuNCAzLjggMTQuNCA5LjMgMTkuNCA1LjggNS4yIDEyLjggNyAyMC40IDYuOSAxMC0uMSAyMC4yIDAgMzAuNCAwaDU4LjNjOC43IDAgMTYuMS0yLjMgMjIuMS04LjggNS40LTUuOCA4LjQtMTQgNy4zLTIxLjktMS40LTEwLjUtOS41LTE5LjYtMjAuNC0yMi42LTEuMi0uMy0xLjktMS41LTEuNy0yLjUuNi00LjUgMS4yLTE0LjItNC41LTIzLjktOC4zLTE0LTIyLjctMTYuOS0yNS0xNy4zLTEyLjktMi4zLTIyLjYgMy0yNSA0LjMtOS40IDUuNS0xMy44IDEzLjUtMTUuNyAxOC0uNSAxLjQtMi4xIDEuOS0zLjQgMS4yLTUuNC0zLjMtMTIuMS0zLjctMTcuNy0xLjItNi42IDMtMTAuOCAxMC4zLTEwLjUgMTguMXptNTUuOC03Ljd2MjkuM0wxMTQgOTcuNWwtMTIuMyAxMi4zLTEyLjMtMTIuM20tNS4yIDI3LjdoMzUiIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjEyO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDoxMCIvPjwvc3ZnPg==',
IDM_PLUS: 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48IS0tIFVwbG9hZGVkIHRvOiBTVkcgUmVwbywgd3d3LnN2Z3JlcG8uY29tLCBHZW5lcmF0b3I6IFNWRyBSZXBvIE1peGVyIFRvb2xzIC0tPg0KPHN2ZyB3aWR0aD0iODAwcHgiIGhlaWdodD0iODAwcHgiIHZpZXdCb3g9IjAgMCAxOTIgMTkyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDE5MiAxOTIiIHhtbDpzcGFjZT0icHJlc2VydmUiPjxwYXRoIGQ9Ik00NC43IDEwMC4zYzAgMS4xLS43IDItMS44IDIuMi0xMi41IDIuNy0yMS40IDE0LjEtMjAuOSAyNi42LjMgNyAzLjYgMTMuNyA4LjggMTguNCA1LjUgNC45IDEyLjEgNi42IDE5LjQgNi41IDkuNS0uMSAxOS4yIDAgMjguOCAwaDU1LjNjOC4yIDAgMTUuMy0yLjIgMjEtOC4zIDUuMS01LjUgNy45LTEzLjMgNi45LTIwLjgtMS4zLTkuOS05LTE4LjYtMTkuNC0yMS41LTEuMS0uMy0xLjgtMS40LTEuNi0yLjQuNi00LjMgMS4xLTEzLjUtNC4zLTIyLjctNy44LTEzLjMtMjEuNi0xNi4xLTIzLjctMTYuNS0xMi4yLTIuMS0yMS40IDIuOS0yMy42IDQuMi04LjkgNS4yLTEzLjEgMTIuOC0xNC45IDE3LjEtLjUgMS4zLTIgMS44LTMuMiAxLjEtNS4xLTMuMS0xMS40LTMuNS0xNi44LTEuMS02LjMgMy0xMC4zIDkuOS0xMCAxNy4yek0xNTQuOSAzOHYzMC4xbS0xNS0xNUgxNzBNOTcuNiA5M3YyNy45bDExLjgtMTEuNy0xMS44IDExLjdMODYgMTA5LjJtLTQuNCAyNi4zaDMyIiBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDoxMjtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48L3N2Zz4=',
ADM: 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxZW0iIGhlaWdodD0iMWVtIiB2aWV3Qm94PSIwIDAgNDggNDgiPjx0aXRsZSB4bWxucz0iIj5hZG08L3RpdGxlPjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGQ9Im0yOS4zNCAzMy4wNGw1LjI1IDYuNzFsOC45MS0xMS4zOGgtNS4yNFYxNy4yMWgtNy4zNHY2LjYzbS0xMS45Ny0yLjI5aC0xLjg3VjEwLjM5SDkuNzR2MTEuMTZINC41bDguOTEgMTEuMzhsMi42Ny0zLjQxIi8+PHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgZD0iTTI5LjIyIDIzLjg0VjguMjVIMTguOTV2MTUuNTloLTcuMzJsMTIuNDYgMTUuOTFsMTIuNDUtMTUuOTF6Ii8+PC9zdmc+',
ABDM:'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjI4IiBoZWlnaHQ9IjIyOCIgdmlld0JveD0iMCAwIDIyOCAyMjgiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgICA8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTEyNy43MjggNC4yMzcwNEMxMjcuNzI4IDEuODk2OTkgMTI1LjkyIDAgMTIzLjY5IDBIMTA0LjMxQzEwMi4wOCAwIDEwMC4yNzIgMS44OTY5OSAxMDAuMjcyIDQuMjM3MDRWODQuNzQwOEMxMDAuMjcyIDg3LjA4MDggOTguNDY0MyA4OC45Nzc4IDk2LjIzNDQgODguOTc3OEg4OS41NDQ4Qzg2LjI2MDcgODguOTc3OCA4NC4zNTAzIDkyLjg3MzIgODYuMjU5MiA5NS42Nzc2TDExMC43MTQgMTMxLjYwNkMxMTIuMzI1IDEzMy45NzEgMTE1LjY3NSAxMzMuOTcxIDExNy4yODYgMTMxLjYwNkwxNDEuNzQxIDk1LjY3NzZDMTQzLjY1IDkyLjg3MzIgMTQxLjczOSA4OC45Nzc4IDEzOC40NTUgODguOTc3OEgxMzEuNzY2QzEyOS41MzYgODguOTc3OCAxMjcuNzI4IDg3LjA4MDggMTI3LjcyOCA4NC43NDA4VjQuMjM3MDRaTTguNjc3NjkgMTU3LjYyNkMyLjk0ODY5IDE0My43OTUgMCAxMjguOTcxIDAgMTE0SDM0LjIwNjNDNDYuNTY4NCAxMTQgNTYuMTk4IDEyNC4zOTIgNjAuOTI4NyAxMzUuODEzQzYzLjc5MzIgMTQyLjcyOCA2Ny45OTE5IDE0OS4wMTIgNzMuMjg0NyAxNTQuMzA1Qzc4LjU3NzggMTU5LjU5OCA4NC44NjE1IDE2My43OTcgOTEuNzc3IDE2Ni42NjFDOTguNjkyNiAxNjkuNTI2IDEwNi4xMDUgMTcxIDExMy41OSAxNzFDMTIxLjA3NSAxNzEgMTI4LjQ4NyAxNjkuNTI2IDEzNS40MDMgMTY2LjY2MUMxNDIuMzE4IDE2My43OTcgMTQ4LjYwMiAxNTkuNTk4IDE1My44OTUgMTU0LjMwNUMxNTkuMTg4IDE0OS4wMTIgMTYzLjM4NyAxNDIuNzI4IDE2Ni4yNTEgMTM1LjgxM0MxNzAuOTgyIDEyNC4zOTIgMTgwLjYxMSAxMTQgMTkyLjk3NCAxMTRIMjI4QzIyOCAxMjguOTcxIDIyNS4wNTEgMTQzLjc5NSAyMTkuMzIyIDE1Ny42MjZDMjEzLjU5MyAxNzEuNDU3IDIwNS4xOTYgMTg0LjAyNCAxOTQuNjEgMTk0LjYxQzE4NC4wMjQgMjA1LjE5NiAxNzEuNDU3IDIxMy41OTMgMTU3LjYyNiAyMTkuMzIyQzE0My43OTUgMjI1LjA1MSAxMjguOTcxIDIyOCAxMTQgMjI4Qzk5LjAyOTQgMjI4IDg0LjIwNTMgMjI1LjA1MSA3MC4zNzQyIDIxOS4zMjJDNTYuNTQzMSAyMTMuNTkzIDQzLjk3NTYgMjA1LjE5NiAzMy4zODk4IDE5NC42MUMyMi44MDQgMTg0LjAyNCAxNC40MDY4IDE3MS40NTcgOC42Nzc2OSAxNTcuNjI2Wk01NS45MTYxIDI0Ljc1MzdDNTIuODQ5OSAyNy4yMjI1IDUyLjMyNTkgMzEuNzU5OSA1NC43NDU5IDM0Ljg4ODJDNTcuMTY1OCAzOC4wMTY1IDYxLjYxMzMgMzguNTUxIDY0LjY3OTYgMzYuMDgyMkw3NS4wODk1IDI3LjcwMDNDNzguMTU1OCAyNS4yMzE0IDc4LjY3OTcgMjAuNjk0IDc2LjI1OTggMTcuNTY1OEM3My44Mzk4IDE0LjQzNzUgNjkuMzkyNCAxMy45MDI5IDY2LjMyNjEgMTYuMzcxOEw1NS45MTYxIDI0Ljc1MzdaTTE3My4yMjQgMjQuNzUzN0MxNzYuMjkgMjcuMjIyNSAxNzYuODE0IDMxLjc1OTkgMTc0LjM5NCAzNC44ODgyQzE3MS45NzQgMzguMDE2NSAxNjcuNTI3IDM4LjU1MSAxNjQuNDYgMzYuMDgyMkwxNTQuMDUgMjcuNzAwM0MxNTAuOTg0IDI1LjIzMTQgMTUwLjQ2IDIwLjY5NCAxNTIuODggMTcuNTY1OEMxNTUuMyAxNC40Mzc1IDE1OS43NDggMTMuOTAyOSAxNjIuODE0IDE2LjM3MThMMTczLjIyNCAyNC43NTM3Wk0yMS41ODAxIDgzLjg1NUMxNy45NDYzIDgyLjM5MzEgMTYuMTYyIDc4LjIwMjYgMTcuNTk1IDc0LjQ5NTNMMjIuNDU5NyA2MS45MDg5QzIzLjg5MjYgNTguMjAxNiAyOC4wMDAxIDU2LjM4MTMgMzEuNjMzOSA1Ny44NDMyQzM1LjI2NzggNTkuMzA1MSAzNy4wNTIgNjMuNDk1NiAzNS42MTkxIDY3LjIwMjlMMzAuNzU0MyA3OS43ODkzQzI5LjMyMTQgODMuNDk2NiAyNS4yMTQgODUuMzE2OSAyMS41ODAxIDgzLjg1NVpNMjExLjU0NSA3NC40OTUzQzIxMi45NzggNzguMjAyNiAyMTEuMTk0IDgyLjM5MzEgMjA3LjU2IDgzLjg1NUMyMDMuOTI2IDg1LjMxNjkgMTk5LjgxOSA4My40OTY2IDE5OC4zODYgNzkuNzg5M0wxOTMuNTIxIDY3LjIwMjlDMTkyLjA4OCA2My40OTU2IDE5My44NzIgNTkuMzA1MSAxOTcuNTA2IDU3Ljg0MzJDMjAxLjE0IDU2LjM4MTMgMjA1LjI0NyA1OC4yMDE2IDIwNi42OCA2MS45MDg5TDIxMS41NDUgNzQuNDk1M1oiIGZpbGw9InVybCgjcGFpbnQwX2xpbmVhcl85Xzg4KSIvPgogICAgPHBhdGggZD0iTTE5NC42MSAxOTQuNjFDMTczLjIzMSAyMTUuOTg5IDE0NC4yMzQgMjI4IDExNCAyMjhDODMuNzY1MSAyMjggNTQuNzY4OCAyMTUuOTg5IDMzLjM4OTYgMTk0LjYxQzQ1LjQwMjUgMTgyLjU5NyA2NC44MzM2IDE4My4yODMgODAuMzc0NiAxOTAuMTQ1QzkwLjg2OCAxOTQuNzc5IDEwMi4zMDcgMTk3LjIzOSAxMTQgMTk3LjIzOUMxMjUuNjkzIDE5Ny4yMzkgMTM3LjEzMiAxOTQuNzc5IDE0Ny42MjUgMTkwLjE0NUMxNjMuMTY2IDE4My4yODMgMTgyLjU5NyAxODIuNTk3IDE5NC42MSAxOTQuNjFaIiBmaWxsPSJibGFjayIgZmlsbC1vcGFjaXR5PSIwLjI1Ii8+CiAgICA8ZGVmcz4KICAgICAgICA8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50MF9saW5lYXJfOV84OCIgeDE9IjIzNy43OTIiIHkxPSIxMDkuMzE1IiB4Mj0iLTcuOTg2MDYiIHkyPSIxMDkuMzE1IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiNDNjMxRkYiLz4KICAgICAgICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjNERDNEZFIi8+CiAgICAgICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDwvZGVmcz4KPC9zdmc+Cg==',
FDM:'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAACXBIWXMAAAsTAAALEwEAmpwYAAACiklEQVR4nO2YS28SURiG2XcBNLE/pQ3MlKHGS9zopgvrrl24aBd2YZq6M3YjIJPogpiWxKTGxKUbo9FIrbRaQKbWpI3BqClQhCpWZoarU15zpqC9YC90GDiGJ3kzqwnz5Hx853zHYGjTps3/idnuxN+4auTWnpg4954Ybbxs4njBaOMnOiyuLuoETBz/J0aOF40c30+tgEmNGyabe4piAV6N2caPUS1QWYlhXQW0IpsvYSmSgmt6Aczg/XHqBLYjZYu4/SDopVagytvlxDzVAhXGaBcgDNMuUAYwoqsAG5I1yamwjMHlHKbiRURyyjh1Auy2nBGy8MQKXmoF2JCMXvUp9jddwPIqCcvMGphAph6RDCuIJ5oq0PNsFf6UjAuzUVj962CD0tEkgtKNpgsQ8koZk5E0WF8MzJuNQwswIUloCYEqq3IRI4E1WF4mwAbEw0iILSVQbfaP4xmcnYnCOvf9wLJqqEDP8+i+6X76+Z/viiUF7pVvsPriYBZ+aidgsjtFPXfidz9yGJiLqR2rVlnVsQKORb2PEkq5jIdfNtD3IgpmPn3sEprYKeCEXqznf+H6UnJrNeoV6Djt6tpZRvoKXBO+Hk9AXYWTNy/qKaBoWUJVOu0Oj5nbEiDjX6NYTOcw4NfwT7xL4oqZc5bff0zV/HHS5/dL95NP+rfR3XT2OYZc06/J/kPHRlYL7vK90VplpMNRAgat8D4S7up9mGO1FCCEVxK+owrMJiWcr/c4HdJYgJDLla5WSlkd/xo40KAhAgQAQwA2ySBe74exzRSoSkzGCmVqBQgfssroQWXU0gKEO9GCp5dmAcI5Qbqk3iLQKkAgVyDkFoEJSmEmKEvUCbRp08agK78Bi/wH+TsRdvoAAAAASUVORK5CYII=',
EDGE: 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48IS0tIFVwbG9hZGVkIHRvOiBTVkcgUmVwbywgd3d3LnN2Z3JlcG8uY29tLCBHZW5lcmF0b3I6IFNWRyBSZXBvIE1peGVyIFRvb2xzIC0tPgo8c3ZnIHdpZHRoPSI4MDBweCIgaGVpZ2h0PSI4MDBweCIgdmlld0JveD0iMCAwIDI3NjAwIDI3NjAwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj48bGluZWFyR3JhZGllbnQgaWQ9IkEiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIi8+PGxpbmVhckdyYWRpZW50IGlkPSJCIiB4MT0iNjg3MCIgeDI9IjI0NzA0IiB5MT0iMTg3MDUiIHkyPSIxODcwNSIgeGxpbms6aHJlZj0iI0EiPjxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzBjNTlhNCIvPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzExNGE4YiIvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPSJDIiB4MT0iMTYyNzIiIHgyPSI1MTMzIiB5MT0iMTA5NjgiIHkyPSIyMzEwMiIgeGxpbms6aHJlZj0iI0EiPjxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iIzFiOWRlMiIvPjxzdG9wIG9mZnNldD0iLjE2IiBzdG9wLWNvbG9yPSIjMTU5NWRmIi8+PHN0b3Agb2Zmc2V0PSIuNjciIHN0b3AtY29sb3I9IiMwNjgwZDciLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMwMDc4ZDQiLz48L2xpbmVhckdyYWRpZW50PjxyYWRpYWxHcmFkaWVudCBpZD0iRCIgY3g9IjE2NzIwIiBjeT0iMTg3NDciIHI9Ijk1MzgiIHhsaW5rOmhyZWY9IiNBIj48c3RvcCBvZmZzZXQ9Ii43MiIgc3RvcC1vcGFjaXR5PSIwIi8+PHN0b3Agb2Zmc2V0PSIuOTUiIHN0b3Atb3BhY2l0eT0iLjUzIi8+PHN0b3Agb2Zmc2V0PSIxIi8+PC9yYWRpYWxHcmFkaWVudD48cmFkaWFsR3JhZGllbnQgaWQ9IkUiIGN4PSI3MTMwIiBjeT0iMTk4NjYiIHI9IjE0MzI0IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC4xNDg0MyAtLjk4ODkyIC43OTY4OCAuMTE5NiAtODc1OSAyNTU0MikiIHhsaW5rOmhyZWY9IiNBIj48c3RvcCBvZmZzZXQ9Ii43NiIgc3RvcC1vcGFjaXR5PSIwIi8+PHN0b3Agb2Zmc2V0PSIuOTUiIHN0b3Atb3BhY2l0eT0iLjUiLz48c3RvcCBvZmZzZXQ9IjEiLz48L3JhZGlhbEdyYWRpZW50PjxyYWRpYWxHcmFkaWVudCBpZD0iRiIgY3g9IjI1MjMiIGN5PSI0NjgwIiByPSIyMDI0MyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgtLjAzNzE1IC45OTkzMSAtMi4xMjgzNiAtLjA3OTEzIDEzNTc5IDM1MzApIiB4bGluazpocmVmPSIjQSI+PHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjMzVjMWYxIi8+PHN0b3Agb2Zmc2V0PSIuMTEiIHN0b3AtY29sb3I9IiMzNGMxZWQiLz48c3RvcCBvZmZzZXQ9Ii4yMyIgc3RvcC1jb2xvcj0iIzJmYzJkZiIvPjxzdG9wIG9mZnNldD0iLjMxIiBzdG9wLWNvbG9yPSIjMmJjM2QyIi8+PHN0b3Agb2Zmc2V0PSIuNjciIHN0b3AtY29sb3I9IiMzNmM3NTIiLz48L3JhZGlhbEdyYWRpZW50PjxyYWRpYWxHcmFkaWVudCBpZD0iRyIgY3g9IjI0MjQ3IiBjeT0iNzc1OCIgcj0iOTczNCIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMjgxMDkgLjk1OTY4IC0uNzgzNTMgLjIyOTQ5IDI0NTEwIC0xNjI5MikiIHhsaW5rOmhyZWY9IiNBIj48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM2NmViNmUiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiM2NmViNmUiIHN0b3Atb3BhY2l0eT0iMCIvPjwvcmFkaWFsR3JhZGllbnQ+PHBhdGggaWQ9IkgiIGQ9Ik0yNDEwNSAyMDA1M2E5MzQ1IDkzNDUgMCAwMS0xMDUzIDQ3MiAxMDIwMiAxMDIwMiAwIDAxLTM1OTAgNjQ2Yy00NzMyIDAtODg1NS0zMjU1LTg4NTUtNzQzMiAwLTExNzUgNjgwLTIxOTMgMTY0My0yNzI5LTQyODAgMTgwLTUzODAgNDY0MC01MzgwIDcyNTMgMCA3Mzg3IDY4MTAgODEzNyA4Mjc2IDgxMzcgNzkxIDAgMTk4NC0yMzAgMjcwNC00NTZsMTMwLTQ0YTEyODM0IDEyODM0IDAgMDA2NjYwLTUyODJjMjIwLTM1MC0xNjgtNzU3LTUzNS01NjV6Ii8+PHBhdGggaWQ9IkkiIGQ9Ik0xMTU3MSAyNTE0MWE3OTEzIDc5MTMgMCAwMS0yMjczLTIxMzcgODE0NSA4MTQ1IDAgMDEtMTUxNC00NzQwIDgwOTMgODA5MyAwIDAxMzA5My02Mzk1IDgwODIgODA4MiAwIDAxMTM3My04NTljMzEyLTE0OCA4NDYtNDE0IDE1NTQtNDA0YTMyMzYgMzIzNiAwIDAxMjU2OSAxMjk3IDMxODQgMzE4NCAwIDAxNjM2IDE4NjZjMC0yMSAyNDQ2LTc5NjAtODAwNS03OTYwLTQzOTAgMC04MDA0IDQxNjYtODAwNCA3ODIwIDAgMjMxOSA1MzggNDE3MCAxMjEyIDU2MDRhMTI4MzMgMTI4MzMgMCAwMDc2ODQgNjc1NyAxMjc5NSAxMjc5NSAwIDAwMzkwOCA2MTBjMTQxNCAwIDI3NzQtMjMzIDQwNDUtNjU2YTc1NzUgNzU3NSAwIDAxLTYyNzgtODAzeiIvPjxwYXRoIGlkPSJKIiBkPSJNMTYyMzEgMTU4ODZjLTgwIDEwNS0zMzAgMjUwLTMzMCA1NjYgMCAyNjAgMTcwIDUxMiA0NzIgNzIzIDE0MzggMTAwMyA0MTQ5IDg2OCA0MTU2IDg2OGE1OTU0IDU5NTQgMCAwMDMwMjctODM5IDYxNDcgNjE0NyAwIDAwMTEzMy04NTAgNjE4MCA2MTgwIDAgMDAxOTEwLTQ0MzdjMjYtMjI0Mi03OTYtMzczMi0xMTMzLTQzOTItMjEyMC00MTQxLTY2OTQtNjUyNS0xMTY2OC02NTI1LTcwMTEgMC0xMjcwMyA1NjM1LTEyNzk4IDEyNjIwIDQ3LTM2NTQgMzY3OS02NjA1IDc5OTYtNjYwNSAzNTAgMCAyMzQ2IDM0IDQyMDAgMTAwNyAxNjM0IDg1OCAyNDkwIDE4OTQgMzA4NiAyOTIxIDYxOCAxMDY3IDcyOCAyNDE1IDcyOCAyOTUycy0yNzEgMTMzMy03ODAgMTk5MHoiLz48dXNlIGZpbGw9InVybCgjQikiIHhsaW5rOmhyZWY9IiNIIi8+PHVzZSBmaWxsPSJ1cmwoI0QpIiBvcGFjaXR5PSIuMzUiIHhsaW5rOmhyZWY9IiNIIi8+PHVzZSBmaWxsPSJ1cmwoI0MpIiB4bGluazpocmVmPSIjSSIvPjx1c2UgZmlsbD0idXJsKCNFKSIgb3BhY2l0eT0iLjQiIHhsaW5rOmhyZWY9IiNJIi8+PHVzZSBmaWxsPSJ1cmwoI0YpIiB4bGluazpocmVmPSIjSiIvPjx1c2UgZmlsbD0idXJsKCNHKSIgeGxpbms6aHJlZj0iI0oiLz48L3N2Zz4='
};
const DEFAULT_KEY = 'edgedl-default-downloader';
const DEFAULT_PENDING_KEY = 'edgedl-default-pending';
async function showDownloadPicker(url, callback, mode = 'download') {
if (document.getElementById('edgedl-picker')) return;
const idmIcon = downloaderIcons.IDM;
const idmPlusIcon = downloaderIcons.IDM_PLUS;
const admIcon = downloaderIcons.ADM;
const abdmIcon = downloaderIcons.ABDM;
const fdmIcon = downloaderIcons.FDM;
const edgeIcon = downloaderIcons.EDGE;
const picker = document.createElement('div');
picker.id = 'edgedl-picker';
picker.innerHTML = `<div class="edgedl-bg"></div> <div class="edgedl-card"> <h3>选择下载器</h3> <div class="edgedl-version-tag">EdgeDL v${getEdgeDLVersion()}</div> <div class="edgedl-options"> <button data-pkg="${DOWNLOADERS.IDM}"> <img src="${idmIcon}" /> 1DM </button> <button data-pkg="${DOWNLOADERS.IDM_PLUS}"> <img src="${idmPlusIcon}" /> 1DM+ </button> <button data-pkg="${DOWNLOADERS.ADM}"> <img src="${admIcon}" /> ADM </button> <button data-pkg="${DOWNLOADERS.ABDM}"> <img src="${abdmIcon}" /> ABDM </button> <button data-pkg="${DOWNLOADERS.FDM}"> <img src="${fdmIcon}" /> FDM </button> <button data-pkg="edge"> <img src="${edgeIcon}" /> Edge </button> </div> <label style="margin-top:12px;display:flex;align-items:center;gap:6px;font-size:13px;"> <input type="checkbox" id="edgedl-set-default" /> 设为默认下载器 </label> </div>`;
document.documentElement.appendChild(picker);
const layoutPicker = () => {
const w = window.visualViewport ? visualViewport.width : document.documentElement.clientWidth;
const card = picker.querySelector('.edgedl-card');
if (card) card.style.maxWidth = (w - 32) + 'px';
};
layoutPicker();
if (window.visualViewport) {
visualViewport.addEventListener('resize', layoutPicker);
visualViewport.addEventListener('scroll', layoutPicker);
}
// 注入下载器选择弹窗样式
const style = document.createElement('style');
style.textContent = `#edgedl-picker{position:fixed;inset:0;display:flex;justify-content:center;align-items:center;z-index:2147483647;pointer-events:none;contain:layout style paint;isolation:isolate;} #edgedl-picker .edgedl-bg{position:absolute;inset:0;background:rgba(0,0,0,0.45);backdrop-filter:blur(6px);animation:edgedl-fade-in .18s ease-out;pointer-events:auto;} #edgedl-picker .edgedl-card{position:relative;background:#fff;border-radius:24px;padding:20px;width:260px;max-width:100%;box-shadow:0 10px 28px rgba(0,0,0,0.25);display:flex;flex-direction:column;align-items:center;animation:edgedl-slide-up .22s ease-out;pointer-events:auto;box-sizing:border-box;font-family:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Helvetica,Arial,sans-serif;font-weight:400;line-height:1.4;-webkit-font-smoothing:antialiased;} #edgedl-picker h3{margin:8px 0 18px 0;font-weight:600;font-size:16px;color:#333;} #edgedl-picker .edgedl-version-tag{position:absolute;top:12px;right:14px;font-size:9px;font-family:ui-monospace,SFMono-Regular,monospace;color:#888;background:rgba(0,0,0,0.04);padding:2px 8px;border-radius:100px;font-weight:600;letter-spacing:0.3px;pointer-events:none;border:1px solid rgba(0,0,0,0.02);} #edgedl-picker .edgedl-options{display:flex;flex-direction:column;width:100%;gap:12px;} #edgedl-picker .edgedl-options button{display:flex;align-items:center;gap:10px;padding:10px;border:none;border-radius:12px;background:#F0F0F0;font-weight:500;cursor:pointer;transition:background 0.2s;} #edgedl-picker .edgedl-options button:hover{background:#e0e0e0;} #edgedl-picker .edgedl-options img{width:24px;height:24px;} #edgedl-picker .edgedl-options button.selected{outline:2px solid #4CAF50;} @media (prefers-color-scheme:dark){#edgedl-picker .edgedl-card{background:#292929;color:#FFFFFF;box-shadow:0 4px 16px rgba(0,0,0,0.6);} #edgedl-picker .edgedl-options button{background:#383838;color:#FFFFFF;} } @keyframes edgedl-fade-in{from{opacity:0;} to{opacity:1;} } @keyframes edgedl-slide-up{from{opacity:0;transform:translateY(18px) scale(.98);} to{opacity:1;transform:translateY(0) scale(1);} } @keyframes edgedl-fade-out{from{opacity:1;} to{opacity:0;} } @keyframes edgedl-slide-down{from{opacity:1;transform:translateY(0) scale(1);} to{opacity:0;transform:translateY(18px) scale(.98);} } #edgedl-picker.closing .edgedl-bg{animation:edgedl-fade-out .16s ease-in forwards;} #edgedl-picker.closing .edgedl-card{animation:edgedl-slide-down .18s ease-in forwards;}`;
document.head.appendChild(style);
// 读取默认下载器
const defaultDownloader = await GM_getValue(DEFAULT_KEY, null);
const defaultCheckbox = picker.querySelector('#edgedl-set-default');
defaultCheckbox.checked = !!defaultDownloader;
if (defaultDownloader) {
// 高亮默认下载器按钮
const defaultBtn = picker.querySelector(`button[data-pkg="${defaultDownloader}"]`);
if (defaultBtn) defaultBtn.classList.add('selected');
}
// 当复选框变化时立即保存或清除“待设置”标志
defaultCheckbox.addEventListener('change', async () => {
if (defaultCheckbox.checked) {
await GM_setValue(DEFAULT_PENDING_KEY, true);
} else {
await GM_deleteValue(DEFAULT_KEY);
await GM_deleteValue(DEFAULT_PENDING_KEY);
}
});
// 点击唤起
picker.querySelectorAll('button').forEach(btn => {
btn.addEventListener('click', async () => {
const pkg = btn.dataset.pkg;
const pending = await GM_getValue(DEFAULT_PENDING_KEY, false);
// 若复选框已勾选或之前标记为“待设置”,保存为默认
if (mode === 'config') {
await GM_setValue(DEFAULT_KEY, pkg);
await GM_deleteValue(DEFAULT_PENDING_KEY);
}
if (pkg === 'edge') {
await GM_deleteValue(DEFAULT_PENDING_KEY);
} else if (defaultCheckbox.checked || pending) {
await GM_setValue(DEFAULT_KEY, pkg);
await GM_deleteValue(DEFAULT_PENDING_KEY);
}
if (mode === 'config') {
if (typeof callback === 'function') callback(pkg);
gotoClose();
return;
}
if (typeof callback === 'function') callback(pkg);
openDownload(url, pkg);
picker.classList.add('closing');
picker.addEventListener('animationend', () => {
if (window.visualViewport) {
visualViewport.removeEventListener('resize', layoutPicker);
visualViewport.removeEventListener('scroll', layoutPicker);
}
picker.remove();
style.remove();
window.dispatchEvent(new CustomEvent('edgedl:picker-closed'));
}, { once: true });
});
});
function gotoClose() {
picker.classList.add('closing');
picker.addEventListener('animationend', () => {
if (window.visualViewport) {
visualViewport.removeEventListener('resize', layoutPicker);
visualViewport.removeEventListener('scroll', layoutPicker);
}
picker.remove(); style.remove();
window.dispatchEvent(new CustomEvent('edgedl:picker-closed'));
}, { once: true });
}
// 点击背景关闭
picker.querySelector('.edgedl-bg').addEventListener('click', () => {
gotoClose();
});
}
async function requestDownload(url){
if(!url) return;
const dl = GM_getValue('edgedl-default-downloader');
if(dl){
return openDownload(url, dl);
}
const selected = await showDownloadPicker(url);
if(selected){
return openDownload(url, selected);
}
return null;
}
let menuRegistered = false;
function registerMenu() {
if (menuRegistered) return;
if (typeof GM_registerMenuCommand !== 'function') return;
// 更改默认下载器
GM_registerMenuCommand('更改默认下载器', () => {
showDownloadPicker('', pkg => {
GM_setValue('edgedl-default-downloader', pkg);
}, 'config');
});
// 加入或移出黑名单
GM_registerMenuCommand('加入/移出黑名单(下载器接管)', async () => {
const added = await toggleCurrentSite();
alert(
added
? '当前站点已加入黑名单'
: '当前站点已移出黑名单'
);
});
menuRegistered = true;
}
function initSjqqHandler() {
if (location.hostname !== 'sj.qq.com') return;
// 识别下载触发元素
function isDownloadTrigger(el) {
if (!el) return false;
return !!el.closest?.(
[
'[dt-eid="safe_download"]',
'[dt-eid="common_download"]',
'[class*="Download"]',
'[class*="download"]',
'[class*="GameCard"][class*="Button"]',
'[class*="mobileDownload"]'
].join(',')
);
}
// 阻断并接管下载
function takeover(e) {
e.preventDefault();
e.stopPropagation();
e.stopImmediatePropagation();
requestDownload(location.href);
return false;
}
const EVENTS = [
'pointerdown',
'pointerup',
'touchstart',
'touchend',
'mousedown',
'mouseup',
'click'
];
EVENTS.forEach(type => {
document.addEventListener(
type,
e => {
if (e.defaultPrevented) return;
if (!isDownloadTrigger(e.target)) return;
takeover(e);
},
true
);
});
// 兜底拦截脚本触发的下载
try {
window.open = () => {
takeover(new Event('edgedl-sjqq'));
return null;
};
} catch {}
}
function initDeepSeekHandler() {
if (!location.hostname.includes('download.deepseek.com')) return;
const APK_URL = "https://download.deepseek.com/apk/deepseek.apk";
const takeover = e => {
if (!e || e.defaultPrevented) return;
e.preventDefault?.();
e.stopPropagation?.();
e.stopImmediatePropagation?.();
requestDownload(APK_URL);
return false;
};
document.addEventListener('click', e => {
if (e.target?.closest?.('div')?.textContent?.includes('下载 APK 文件')) takeover(e);
}, true);
try {
window.open = () => takeover(new Event('edgedl-deepseek'));
} catch {}
}
// 初始化下载接管
function init() {
registerMenu();
initSjqqHandler();
initDeepSeekHandler();
attachClickInterceptor();
}
// 挂载点击拦截器
function attachClickInterceptor() {
document.addEventListener('click', handleClick, true);
}
// 点击事件处理
async function handleClick(e) {
if (e.defaultPrevented) return;
if (e.__edgedl_handled__) return;
e.__edgedl_handled__ = true;
if (e.target?.closest?.('label.hope-checkbox, .hope-checkbox, .hope-checkbox__control, input[type="checkbox"]')) return;
const link = e.target?.closest?.('a, [onclick]');
if (!link) return;
let url = link.href;
if (
!url ||
url === '#' ||
url === '##' ||
url.startsWith('javascript:')
) {
const onclick = link.getAttribute('onclick')
|| link.closest('[onclick]')?.getAttribute('onclick');
if (onclick) {
url = extractUrlFromOnclick(onclick);
}
}
if (!url || !isDownloadLink(url)) return;
// 阻止浏览器原生下载与页面跳转
e.preventDefault();
e.stopPropagation();
e.stopImmediatePropagation();
await requestDownload(url);
}
init();
})();