// ==UserScript== // @name 自动打开PDF,否则重定向至XJTU_VPN // @version 1.1 // @author Pencilheart // @description 自动打开PDF,如果没有找到PDF链接则重定向到西安交通大学图书馆。 // @match https://webvpn.xjtu.edu.cn/https/77726476706e69737468656265737421e7e056d234336155700b8ca891472636a6d29e640e/science/article/pii/* // @match https://asmedigitalcollection-asme-org-s.stat.lib.xjtu.edu.cn/* // @match http://sage.cnpereading.com/paragraph/article/* // @match https://www.sciencedirect.com/science/article/* // @match https://asmedigitalcollection.asme.org/* // @match https://*.asmedigitalcollection.asme.org/* // @match https://onlinelibrary.wiley.com/doi/* // @match https://*.onlinelibrary.wiley.com/doi/* // @match https://link.springer.com/article* // @match https://iopscience.iop.org/article/* // @match https://arc.aiaa.org/doi/* // @match https://www.semanticscholar.org/paper/* // @match https://journals.sagepub.com/doi/* // @match http://sage.cnpereading.com/paragraph/article/* // @match https://journal.gpps.global/* // @match https://webofscience.clarivate.cn/* // @match https://www.nature.com/articles* // @match https://access.clarivate.com/* // @match https://pubs.acs.org/doi/* // @match https://webvpn.xjtu.edu.cn/* // @match *://*/*.pdf // @match https://www.science.org/doi/* // @match https://pubs.acs.org/doi/* // @match https://www.tandfonline.com/doi/* // @match https://www.beilstein-journals.org/* // @match https://pubs.rsc.org/en/content/* // @match https://pubs.aip.org/aip/*/article/* // @match https://journals.aps.org/*/abstract/10* // @match https://cdnsciencepub.com/doi/* // @match https://iopscience.iop.org/article/10* // @match https://www.cell.com/*/fulltext/* // @match https://journals.lww.com/* // @match https://*.biomedcentral.com/articles/* // @match https://academic.oup.com/*/article/* // @match https://karger.com/*/article/* // @match https://www.cambridge.org/core/journals/*/article/* // @match https://www.annualreviews.org/doi/* // @match https://www.annualreviews.org/content/* // @match https://www.jstage.jst.go.jp/article/* // @match https://www.hindawi.com/journals/* // @match https://*.theclinics.com/article/* // @match https://www.liebertpub.com/doi/* // @match https://thorax.bmj.com/content/* // @match https://journals.physiology.org/doi/* // @match https://www.ahajournals.org/doi/* // @match https://dl.acm.org/doi/* // @match https://journals.asm.org/doi/* // @match https://*.apa.org/record/* // @match https://*.apa.org/fulltext/* // @match https://www.thelancet.com/journals/*/article/* // @match https://jamanetwork.com/journals/* // @match https://aacrjournals.org/*/article/* // @match https://royalsocietypublishing.org/doi/* // @match https://journals.plos.org/*/article* // @match https://*.psychiatryonline.org/doi/* // @match https://opg.optica.org/*/*.cfm* // @match https://www.thieme-connect.de/products/ejournals/* // @match https://journals.ametsoc.org/view/journals/* // @match https://www.frontiersin.org/articles/* // @match https://www.worldscientific.com/doi/* // @match https://www.nejm.org/doi/* // @match https://ascopubs.org/doi/* // @match https://www.jto.org/article/* // @match https://www.jci.org/articles/* // @match https://www.pnas.org/doi/* // @match https://*.psychiatryonline.org/doi/* // @grant GM_registerMenuCommand // @grant GM_setValue // @grant GM_getValue // @namespace https://greasyfork.org/users/703434 // @downloadURL none // ==/UserScript== (function () { "use strict"; // 获取用户选项 let autoOpenPDF = GM_getValue("autoOpenPDF", false); let enableRedirect = GM_getValue("enableRedirect", false); // 注册菜单 function registerMenu() { GM_registerMenuCommand( `重定向功能:${enableRedirect ? "✅ 开启" : "❌ 关闭"}`, () => { enableRedirect = !enableRedirect; GM_setValue("enableRedirect", enableRedirect); location.reload(); } ); GM_registerMenuCommand( `自动打开PDF功能:${autoOpenPDF ? "✅ 开启" : "❌ 关闭"}`, () => { autoOpenPDF = !autoOpenPDF; GM_setValue("autoOpenPDF", autoOpenPDF); location.reload(); } ); } registerMenu(); // 重定向规则 const urlMappings = [ { baseUrl: "https://www.sciencedirect.com/", transform: (url) => "https://webvpn.xjtu.edu.cn/https/77726476706e69737468656265737421e7e056d234336155700b8ca891472636a6d29e640e/science/article/pii/" + url.match(/\/pii\/([A-Za-z0-9]+)/)[1] + "?redirected=true", }, { baseUrl: "https://journals.sagepub.com/", transform: (url) => url.replace( "https://journals.sagepub.com/doi/", "http://sage.cnpereading.com/paragraph/article/?doi=" ), }, { baseUrl: "https://asmedigitalcollection.asme.org/", transform: (url) => url.replace( "asmedigitalcollection.asme.org/", "asmedigitalcollection-asme-org-s.stat.lib.xjtu.edu.cn/") + "?redirected=true", }, { baseUrl: "https://webofscience.clarivate.cn/", transform: (url) => "https://webofscience-clarivate-cn-s.stat.lib.xjtu.edu.cn/wos/alldb/basic-search", }, { baseUrl: "https://access.clarivate.com/", transform: (url) => "https://webofscience-clarivate-cn-s.stat.lib.xjtu.edu.cn/wos/alldb/basic-search", }, { baseUrl: "https://pubs.acs.org/", transform: (url) => url.replace( "pubs.acs.org/", "libproxy.lib.xjtu.edu.cn/https/443/org/acs/pubs/yitlink/") + "?redirected=true", }, ]; // 直接重定向规则 const directRedirectRules = [ { urlMatch: ["journals.sagepub.com", "science.org"], // 匹配特定网站 redirect: true, // 添加一个标记,直接重定向 }, ]; // PDF选择器映射 const pdfSelectors = ['a[href$=".pdf"]', 'a[href$="/pdf"]', 'a[href^="/doi"]']; const specificSiteRules = [ { urlMatch: "http://sage.cnpereading.com/paragraph/article/", elementSelector: 'a[href*="/paragraph/download/?doi="]', }, { urlMatch: "www.semanticscholar.org", elementSelector: 'a[href*="doi"]', }, { urlMatch: "ceramics.onlinelibrary.wiley.com", elementSelector: 'a[href^="/doi"]', }, ]; // 当前页面检查逻辑 function checkAndHandlePDFLinks() { // 如果已经打开过 PDF,跳过自动打开 if (sessionStorage.getItem('pdfOpened') === 'true') { return false; } // 检查是否有特定规则 for (const rule of specificSiteRules) { if (currentURL.includes(rule.urlMatch)) { const targetElement = document.querySelector(rule.elementSelector); if (targetElement) { const href = targetElement.getAttribute('href'); if (autoOpenPDF) { history.pushState(null, null, window.location.href); // 将当前页面的 URL 推入历史记录栈 window.location.replace(href); sessionStorage.setItem('pdfOpened', 'true'); // 标记已经打开 PDF } return true; } } } // 检查常规的 PDF 选择器 for (const selector of pdfSelectors) { const targetElement = document.querySelector(selector); if (targetElement) { const href = targetElement.getAttribute('href'); if (autoOpenPDF) { history.pushState(null, null, window.location.href); // 将当前页面的 URL 推入历史记录栈 window.location.replace(href); sessionStorage.setItem('pdfOpened', 'true'); // 标记已经打开 PDF } return true; } } return false; } // 直接重定向逻辑 function handleDirectRedirect() { for (const rule of directRedirectRules) { if (rule.urlMatch.some((domain) => currentURL.includes(domain)) && rule.redirect) { for (const mapping of urlMappings) { if (currentURL.startsWith(mapping.baseUrl) && !currentURL.includes("redirected=true")) { window.location.href = mapping.transform(currentURL) + "?redirected=true"; return true; } } } } return false; } // 自动重定向逻辑 function handleRedirect() { if (!enableRedirect || handleDirectRedirect()) return; for (const mapping of urlMappings) { if (currentURL.startsWith(mapping.baseUrl) && !currentURL.includes("redirected=true")) { window.location.href = mapping.transform(currentURL) + "?redirected=true"; break; } } } const currentURL = window.location.href; console.log("当前URL:", currentURL); window.addEventListener("load", () => { // 加载完成后直接检测 if (handleDirectRedirect() || checkAndHandlePDFLinks()) { return; // 如果找到符合条件的链接,直接退出逻辑 } // 动态监听逻辑 const observer = new MutationObserver(() => { if (handleDirectRedirect() || checkAndHandlePDFLinks()) { observer.disconnect(); // 找到目标后停止监听 } }); observer.observe(document.body, { childList: true, subtree: true }); // 延迟检测逻辑,加载完成后再检查一次 setTimeout(() => { if (!checkAndHandlePDFLinks()) { observer.disconnect(); // 停止观察 handleRedirect(); // 如果没有检测到 PDF 链接,执行跳转 } }, 2000); // 延迟 2 秒,确保 DOM 变化完成 }); // 检查 MutationObserver(用于动态加载的页面) const observer = new MutationObserver(() => { if (checkAndHandlePDFLinks()) observer.disconnect(); }); observer.observe(document.body, { childList: true, subtree: true }); })();