// ==UserScript== // @name PubMed文献批量下载 // @namespace http://tampermonkey.net/ // @version 1.4.1 // @description webchang大佬服务器要到期了,为了方便收藏文献,在自己服务器上新搭建了该脚本,对脚本进行bug修复, 脚本可以快速批量下载ncbi中pubmed的文献。 当然了,如果你使用Zotero配合Zotero插件会有比这更好的下载管理体验,那么该脚本也能帮你识别出不在sci-hub中的文献,以此判断该文献是否能下载。 我的服务器比较小,无法支持高并发,有时候会无故死机。如有使用问题可以邮件联系inrobin@mail.nwpu.edu.cn // @author webchang, Robin // @match https://pubmed.ncbi.nlm.nih.gov/?term* // @icon https://www.google.com/s2/favicons?sz=64&domain=nih.gov // @require https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js // @grant GM_xmlhttpRequest // @license MIT // @downloadURL none // ==/UserScript== (function() { 'use strict'; // 下载某一篇论文 function download(doi) { // doi=doi.toLocaleLowerCase(); if (doi.includes("10.1093")) { const index = doi.lastIndexOf("/"); doi = doi.slice(0, index) + "%252F" + doi.slice(index + 1); } if (doi.includes("10.1088")) { const index = doi.lastIndexOf("/"); doi = doi.slice(0, index) + "%252F" + doi.slice(index + 1); } const url = `https://sci.bban.top/pdf/${doi}.pdf?download=true`; //调用 const aEle = document.createElement("a"); const containsUpperCase = str => str !== str.toLowerCase(); if(containsUpperCase(url)){ aEle.href =url.toLocaleLowerCase(); aEle.target = "_blank"; document.body.appendChild(aEle); aEle.style.display = "none"; aEle.click(); aEle.remove(); } aEle.href = url; aEle.target = "_blank"; document.body.appendChild(aEle); aEle.style.display = "none"; aEle.click(); aEle.remove(); } // 下载所有 function downloadAll(doiArr, statusArr) { let count = 0; for (let i = 0; i < doiArr.length; i++) { if (statusArr[i]) { count++; download(doiArr[i]); } } if (count === 0) { message("本页没有可以下载的论文",false); } else { message(`下载所有:${count}篇可下载论文下载中...`,true); } } // 下载选中 function downloadChoose(doiArr, statusArr) { const checkedArr = document .querySelector(".search-results-chunks") .getElementsByClassName("search-result-selector"); let count = 0; for (let i = 0; i < checkedArr.length; i++) { if (checkedArr[i].checked && statusArr[i]) { count++; download(doiArr[i]); } } if (count === 0) { message("没有可以下载的论文",false); } else { message(`下载选中:${count}篇可下载论文下载中...`,true); } } // 判断是否可以下载 function judge(doiArr, callback) { GM_xmlhttpRequest({ method: "POST", url: "http://123.57.210.120:32600", headers: { "Content-Type": "application/json" }, data:JSON.stringify(doiArr), onload: function(response){ console.log(JSON.parse(response.responseText)); callback(JSON.parse(response.responseText)); diffDown(JSON.parse(response.responseText), doiArr); }, onerror: function(response){ console.log("请求失败"); } }); } // 区分可下载和不可下载的论文 function diffDown(statusArr, doiArr) { const icon = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAAXNSR0IArs4c6QAABKhJREFUaEPtmF1oHFUUx///KXZmg7QgqFREqz74IFajxYJPKZLMjEofCg1o40PR1o+2otLSFm3mTlQIrSjSYrUWEaoR0gpqTXY2eWjAp1Baix8PPoi2ohUfREPtzkYyR2aSXXazXzOTTTSSedud8/Wbc++59xxikT9c5PFjCeDfzuBSBv5XGXBGJtcimOoi2AnBDSRXhYAicgnELwROBsIvXFv/qlXgLVlCrpd/TMgeCLpiBUaMUOQDx8ocjyXfQGhOAE62sIaaHIwdeHUgYxBxlZ0ZSwuSGsDNFjYJg0MAr0/rvKQ3DaHS2EkFMB28DKZxWF9HtiorcyypzcQAKpvvAHk6qaNY8iLrky6n5ACeHwbfESug5EJjyjLWJ1FLBKCyeQXSSeIgsWzC/RAbQA3+djVXrDgvwG2Jg0qgQOB7mZi4W3VfdzmOWmwAx/OfInAkjtG5ygjwtGsZb8exkwAgP0DwkThGZ2SGILgAYhKCW0FsiK/L95Wlb4kjHxtAef45AO0xjF4MiCf6TGO0XLY353dqgqMAVjezIZAzrpW5r5lc+L4pgDuSf0CEJgTbAbQ1M0rgYccyhl71ZNXfLNwbyl8l+tkXLV5yhv0uasg1t8G/BPIuBKeVbXzWSL4uQFhxqGmWiKxr5rDs/Y/KMm4Jf6ucPwjBpugdcUKZRnf0v+dfAHBTApvnIfJpvZO6JoDy/DcAPJfASVG0VMeV50u5vrKMyJdKf44cVpaxc3ZMVQAqVzgOkZ4UwYcq8wkQXswHlJXZXB5bBYDy/B0ADqUMfgEAosh2Kss4XIyxBNA/KisLU4VxAW7/LwMQ+E5fpq/b28k/K6qQyuZfAvnyHIJfqAyELd5+ZWdeqQTIFc5AZO2iAADOKcuISnRpCble4Q+BrFwcAJxQlh7FGgE4w1dupKb9NMfgF24JhfVoMrjZ3dB2cbo2t65JmecyWvaJZ5qf0hJysv4VEpk5ZmGhAHxlGVGsJQDl+R8D2JgUgOQpCYLwogdC+9ax9RMzJ27NkzjqpxHcEfmh1gnI/Ul9AvCUZdiVmzjnPy+C15MYI9njmPqHtXTqXSVmy6bp8kSCfa7d1l8BsN+7fJeGZaMEr40JcUxZxtayPeRo1Hb1msvPNspA31DhzkCTHdBwSpnG56Gsm/V3C3Egpt9fw9txcbpXcZXo9fJbNPC9WIZmNtHsAkDiGcc0jtTKQNU4po6NRv4DCR7ts9s+KspUX+bi3kSLznP+NgjeKXdKUolIxaCKwu6qWZLgqLKNJxNUwQPKMvZU+Kq5frP+QRC7Gn2JYt+qsvnVIH+IlbVZQtoU1/Q+pH+tcv6zELzZ0IbgNWUbu2fLNGpoOoTcS8CsZZjkuMjyB5XF39NN6rhZWfqA8uQacnK4XuMkQI4i/fUGXk1bSidb2EgG94Bsp6BdgGhkHj1lM5xEEJTHlZmJ9lpVFRL5GeQ4RL6Epn2jTP2TRplpCpBkacSCEGxXtvFWErsLBjBdEusPfil4wbGNsF1t2dPSDBSjqgUh5D7X1KPDp5XPvACUZWIPQUMkOJl2/t8Mdt4Amjlu1fslgFZ9ybR2ljKQ9su1Sm/RZ+Af8eEzT82+QLUAAAAASUVORK5CYII="; const articles = document .querySelector(".search-results-chunks") .getElementsByClassName("full-docsum"); // 插入图片 for (let i = 0; i < statusArr.length; i++) { if (statusArr[i]) { const img = document.createElement("img"); img.src = icon; img.style = "width:20px;height:20px;position:absolute;top:2px;right:-10px;cursor:pointer;"; img.addEventListener("click", function () { download(doiArr[i]); }); articles[i].append(img); } } } // 将doi文字替换成链接,并返回doi列表 function replaceDOIsWithLinks() { const spans = document .querySelector(".search-results-chunks") .getElementsByClassName("full-journal-citation"); const doiArr = []; spans.forEach(span => { const content = span.innerHTML; const matchResult = content.match( /\b(10[.][0-9]{4,}(?:[.][0-9]+)*\/(?:(?!["&\'<>])\S)+)\b/gi ); let doi = matchResult ? matchResult[0] : ""; doiArr.push(doi); if (doi) { // 将doi替换为链接 const link = document.createElement("a"); link.href = `https://sci-hub.ee/${doi}`; link.innerHTML = doi; link.target = "_blank"; const textArr = content.split(doi); span.innerHTML = ""; span.append(textArr[0], link, textArr[1]); } }); return doiArr; } function appendDiv() { let isLoading = true; // 下载按钮 const p1 = document.createElement("p"); p1.innerHTML = "下载所有"; const p2 = document.createElement("p"); p2.innerHTML = "下载选中"; p1.style = "background:red;color:white;font-size:12px;margin-bottom:10px;padding:2px 5px;border-radius:2px;"; p2.style = "background:green;color:white;font-size:12px;padding:2px 5px;border-radius:2px;"; // loading图片 const loadingImg = document.createElement("img"); loadingImg.src = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAAXNSR0IArs4c6QAABHJJREFUaEPtmVtoHGUUx/9nJq710jY7m4BRC2p2EjQVoUGq9CX6UK2XegFrvYuodWdsRbBFQWj7pLZeMHZmTVGEeGltH5Raq+BD8yJeaMQXL90ZMRCo2m1mgpTSXHaOzNJZ9pqZzc4km9Z92/3Od87/d853X8IC/9AC1485Abh04MiFp5yl3bEW8djxp676J8ykNQwQT5vLAWcVMVY4OdozvlEeKhaYSJv3ALyTGZ3535k2W2ry9bAgGgJoe+33xc5i8TsAPZ4gJuFOO9V50P3e+o7RJ4g4XCGWne2W2r0tDIiGAOLaHw8QOZ+UCuHdltK14ZwBiOuZzQS6C8AqAN8CNGgpyd1Bq+Nbgda3/mwVz5/scyA8J8B5OzcRGxp//spxN4DfELr8zdELTi067Q6hlcWCyOEbxp7t+kFKG0+A8X65WCY8bKfkj4NA+AIk0sYrzHjRc0aEV8dS8kved79J3DYw0uFMT2xgEq8jOKYAYe8JJTns9o/rxiABj1QAAB/aivxoKACSbvwF4JIiZ39bitwRxLmfjaRlvgTRbZWTnA9Zatftfv3ddt8KSLrxFYBbi5x9bSnymiDO/Wwk7eg2kLC1kVXKFyCeProeLN5P4LsZ9Dko96md6t7rJy5Ie3545aY+K54jDAzZinxTkP6BKuA5ctf08k0qaBA/uzbdWOuws0Ig4acTinxA0sxlLPAWYroD4BgBw2OKvLaaH98K+AUPu73WygXgF0uRl5fHqwBIaJnHGVgtYurprNpzMmyBfv7iaeMhYnxUza7a8loCcGZT2eF1thR5zitUc2K7oqocQcoAjMME9BXoQzyz+GXea5d04z4A+2rYr7MUeX9xW9NVwBUn6cb35bs3CN9YKXl108+BQiXS5gdgdzRwjEE/EmOTpSZHfQGClrpZ7OZ8ktYLLunmDoBvBtALYBjsHCy+SzQ1QEI3NzK4vwp0YTKXAES529ab+XbNTOaIjVr9pmOLEv8+uczKA1zcb7Sf14J97hLKoEFbST5Wb8Cw7WfIfj6Ud6fIA8Q1QyGCVhAhoMd6Rv41bFH1+Ivr5hoCH6rVR2SSs2rSzAOUXb6PWYp8WT3BorKVdMMFqHZ0328p8rp8JbzgLgSJ2EoC1PnOvqfpzDz4GcBFRUkqSXBTr0L5XbnfWIIW3AJ2ekCCeyKtfZSIaihE6bfpK+AHf/YBJHZlVjpEvbYq6370zdBesRMX3jKZXrDU5BvNIHImDaX3gaLrHDN0W5XVBQWw5L1RSZw4vZ4Eut7B1Pbx1NUj8wng3s7Kl81yPWffJJ7PjM8m9rlRgYSWuZeJJCcHM6rXudlkv+QwN5ODuGYcJ0I7g7fYStfO2QaLol+gIeQ9czALD9pq556whUjvGte4PmdzCg4EkL8zpH+7IqpldU4AZsq6K2ByEtmTm+Rs2NXx8xe4ArUctelmrwM+QsAXtZ7ApV3GjRDo2nr+vPMT7rU3DjAw0pGbnnqZ4GRr/ffrPdhG8VjcMEDQTEVl9z9AVJkN6vc/flrHQA66jp8AAAAASUVORK5CYII="; loadingImg.style = ` width: 30px; height: 30px; transform: rotate(0); transition: all 0.5s; `; let circle = 1; setInterval(() => { circle++; let angle = circle * 30; loadingImg.style.transform = `rotate(${angle}deg)`; }, 100); const container = document.createElement("div"); container.append(p1, p2, loadingImg); container.style = "position:fixed;top:105px;right:15px;z-index:1000;cursor:pointer;text-align:center;"; document.body.append(container); // 获取doi列表,将doi替换为链接 const doiArr = replaceDOIsWithLinks(); // 获取论文的可下载状态 let statusArr = []; judge(doiArr, arr => { statusArr = arr; container.removeChild(loadingImg); isLoading = false; }); p1.addEventListener("click", function () { if (isLoading) { message("数据加载中,请稍后..."); return; } downloadAll(doiArr, statusArr); }); p2.addEventListener("click", function () { if (isLoading) { message("数据加载中,请稍后..."); return; } downloadChoose(doiArr, statusArr); }); } // 全局弹窗提示 function message(text,flag = true) { const img = document.createElement("img"); img.src = flag ? "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAAXNSR0IArs4c6QAABRVJREFUaEPVWl1oHFUU/s6sbeMvgrQza1BBfBBLlexsqqQ7m8RYBZuK+JAXIXGrGNAq4l+poFSFVlsVUQQt2tikPvhDWmgUrY0xmUmRJrNRoZiHIFpId5b41ArGkp0jM5vd7m52d2Z2ZxIzsC97z/m+8+2998y95yzBp0dWwzEQ7gdzIwGNDDQi+7GeWQJmGZgF0SwY3+hKSvODmuoBkUfD94J4KwhdAG70iHUWjC/A9L3emjrh0Tdv7lnAxpH1VzWsFRJgSoDRVCtxkR9hCsR98xfNvjPtc397wXQtoPn0esm8KCRg0g4QbvFC4tqWMQOBDwlrzb6JzXOGGz9XAuQxaRuAdwMLvDRSSwjwjB43vnYS4SggqomPMtPHTkBBjBPxY5Ox9CfVsKsKiI5JLzLhzSCCc4tJjF2TcWN/JfuKAiKqlCDgkFuiIO0Y2JFUjL5yHGUFyJrUDsYPQQblGZtwtx4zRkr9lgho/lFqNkM47ZlgGRyEDDZPtBkThVRFAuxU+W/IUnnrMsRTC8W0sC7TXphiiwTImrgbTHtrQV42H+KX9Fh6X44vL8B+w4ZCU8uW62tVzJiZz2Sacm/svAB5XHwKJr1XK+6y+gn8tL4l/b7FeUmAJiV9O9sErYYwpceMSF5ARBU7CXQ8aF6X+GcAbHSyZfD2pJIesmcgqoofMehxJ6eAx/8hRvdk3PhKVsU7Afqp+hGCD04q6V5bgKxKswCuDzjAavBzDOpOKqlvc0ayKlnpvK2K0zldMRqpaUzsEIhOrmDwvwPUU3hDi2hSFzE+d4rJZL6HZC28F8y7nYwDGv9VWMj0TLTP/ZzD93QGI9pHsiodBtAdUIAVYRl0CqGFnmTLnHX2t5+oJu1khp0eXT79FFWlkwx0uHTwx4z5hNBg9hQeCWRV2gXgDS8EBAxbM/Cb67MP4Q8wDiySPAngNi+Eli0Bg+to4ZHx2F8X8htWk14D42WvWACmLQHnAVztxpkZiWTc+NTOXKfETTBpEOzhfkw4rG8xEiBwQbZ5G8CzbvjL2FzwJsDEq8lWY08OqGkkHBUu40EANzgFQMAHk4qxs9AuookfElOvk2+VcVuA+yWURerSFePLHGjz6IYWMyRYMyFWImJgf1IxrDWef+Qx8QiIHq4jeMt1utZNXCQiqkptDD4K0LVLAiK8oseM13Pf3/6LeOWa8zgC0IN1Bm/tJ3sT15pGi0TYVboQHwXjikuB0XO6knonH/y4uGGNaQe/td7gF/37632RFYlYPBQeAxBiUG9SSR3MLzVVvDnDwgARt/gUPJB9kYVjAKt1gBaL0MIPIYPLk62pz/KZZlTcBEEYAPiOOnjKuJKSO8z9WUNxthCwSERJprmLTBoI4KZ3VleMm7ICxqQDIDxf56+zRMTiQXEAQLhO7KXujLf0uPFCVoC1AQX+zgeSvIioJj7ATFbw1/iAuxTCpPussrzvV0oG9hDjOhCesDZzIMGXXintWVjtl/pVX1axZ2E1F7YsAXZpcT6kBpDy/NkKjBmhIaNULC0uptRtIAz5w+gzCqOztGtTtry+kl2ZSpIrdWsqNjj+D92ZnJhqXZqqLSZPFQKfV0sOrlp3xrJxbPKtaLemQlem8LdyFGBnp2zXpt/15b/+2ZgWMugu7caUg3UlIJ9iV2uju1D5qv2rQbnps25gArCdQZ01FIfPEXjIBI5bZfJaV53rJeREYJ/9BaHDzd9tTNMcnoqnh50w3Yz/B19VBNGHXa2nAAAAAElFTkSuQmCC" : "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAAXNSR0IArs4c6QAAA/pJREFUaEPtWT2IE1EQ/iZ32WiltZAXUDEb8KdQ0EJBG0E8Sw8LLbQ4UfGnUFDBPwQVtPAHlbtCCy38KVUEGwUtFLTwB7IRFfIC1lppNncZeZcfN5vdzXubvZOACymSzJv5vpl58+bNEgb8oQHHj/8EWhH8smBudmpocgunUkuZWRAg0PioRzIgiUhSvf5paGr40eLvvypJRL+vCBRFeiVAG4l5I4jWGwFifsFEzwB+VpC1d0ZrPcKxCCjgKaTGGDwW17B3HYEm6qhPxCFiTKAkMuNJAfeTV0TysrrbxClGBByReQnwWhMD5rL0ypbVdbrrtAk4WasMam9KXf3x5BjSrrg5ncVaBBxhsY6ypGVs6fbE11PAyVnvwVieNDgtfYQPdtldESUbScAR1gMAW7WMzZzQQ1u6o2HqQwnMZLUx5RpVnQIJqDpPoLc9DI0SI8WEe6aAOs4AxjYm1AGoaIc+DF4VdE4EEtDw/qgt3YfKmiOs7QDuxCSxw5bu3aYelaqhJMKi0EVAx/vE2JavuPdboJ1seieIbhmRYN5lV2q32zqEFUlAyQVFoYtASVinGDitAabtPSVbFOkxAo1rrFNAdhdkbcIEvJIl4HReumc6UtBvsJSzXjNjtQ4Q+LxYyqb3MtH1yLLHvC9fqd0wBT9NgPAmX3bXhBL4LOYsrKP+VQt8U6jbm5mDAF8O1kGHbFm9Egd8a00KqUVL5O9vre8dKVQUmf0EvmpCYNozPq8Wc5nDxHzRq4eJjhTK1Uv9gG/sAzpQkNVrgQScXOYGmPeYEmjId3q3JKyjDJxv5u6xvHQv9Au+YYZu2uXq3pAIWI8J2ByPANDl5Zx1Qumyy+7ZRMBPRwBPCtIdCY6AsD4AWBaXQJC3vbocjVKpYfujLd12b9axBxxh/QAwT0NJtAjhpNfrSjgh8ErVT1u688MiMPAEBjuFiiLhTdzIebT6piRSKXoTJ1hGfTnfbv76JhFVRnVagaDd6z/IQjZsIiT8tjqqkJquTQ5PSZMqZNiY9U1ieHJIeKd6Xd2ok00/156yxWiJAcQnwfzCrtQ2eB0ccB+wjhFwTiMKHe20YZ2PRYKB4wXpTrcngeeA+jHWhSbeCWtMQutCo0gYXil73qQioum9miZzpdSNgsrlJrDIy7hGKmrpMbrUa0ZBA1syIsZjlb+t72wMc3uRjB729h4tzuZQ189FY8jbk0Dz6B/c4W47nWZzyKsx1A09B6IycpaGvZHDXD8+rRTyLtI4I3rtytD/Z/wVU8vyQL/k87qvQYRGQNikPc1rKlBTNjCe1sGP47ydjLUHonJDTfWmwJuJUIh60c2M4hDoiXe6FjvnGvPSwX7+E/jX8fsDABEKT4je6toAAAAASUVORK5CYII="; img.style = ` width:20px; height:20px; margin-right:5px; `; const div = document.createElement("div"); div.style = `display:flex; justify-content: center; align-items: center; padding: 0 10px; height:50px; border-radius:5px; position:fixed; top:200px; left:50%; transform:translate(-50%, -100px); background:white; box-shadow:0 3px 6px -1px rgba(0,0,0,0.3); z-index:1000; `; div.append(img, text); document.body.append(div); setTimeout(() => { div.style.display = "none"; document.body.removeChild(div); }, 4000); } window.onload = function () { appendDiv(); const meta = document.createElement("meta"); meta.setAttribute("http-equiv", "Content-Security-Policy"); meta.setAttribute("content", "upgrade-insecure-requests"); document.getElementsByTagName("head")[0].appendChild(meta); }; })();