// ==UserScript== // @name Wos Download Bot // @namespace http://tampermonkey.net/ // @version 1.4.1 // @description wos核心论文集下载机器人 // @author AngelLiang // @match https://www.webofscience.com/wos/woscc/summary/*/relevance/* // @icon https://www.google.com/s2/favicons?sz=64&domain=webofscience.com // @require https://cdn.staticfile.org/jquery/3.4.1/jquery.min.js // @require https://cdn.bootcss.com/jquery-cookie/1.4.1/jquery.cookie.js // @require https://code.jquery.com/ui/1.13.0/jquery-ui.min.js // @grant GM_download // @connect * // @license MIT // @downloadURL https://update.greasyfork.icu/scripts/448810/Wos%20Download%20Bot.user.js // @updateURL https://update.greasyfork.icu/scripts/448810/Wos%20Download%20Bot.meta.js // ==/UserScript== (function() { 'use strict'; const DOWNLOAD_URL = "https://www.webofscience.com/api/wosnx/indic/export/saveToFile"; var total = ""; // 论文集的唯一码 var uuid = "" // wos的唯一码(?) var wosSid = "" // 等待秒数 var waitSecond = 30 var fileFormat = '' function getTotal() { total = $(".brand-blue").text() total = total.replace(",", "") total = parseInt(total) return total } // 获取期刊的uuid function getParentQid() { let currUrl = String(window.location.href); return currUrl.split('/')[6] } function get_bm_telemetry() { // return bmak['sensor_data'] // update: 20230709修改接口 return bmak.get_telemetry() } function get_fileOpt() { if (fileFormat == 'excel') { return "xls" } else if (fileFormat == 'ris') { return "othersoftware" } else if (fileFormat == 'bibtex'){ return "othersoftware" } else { return "othersoftware" } } function get_action() { if (fileFormat == 'excel') { return "saveToExcel" } else if (fileFormat == 'ris') { return "saveToRIS" } else if (fileFormat == 'bibtex'){ return "saveToBibtex" } else { return "saveToFieldTagged" } } function get_filters() { if (fileFormat == 'excel') { return "fullRecord" } else if (fileFormat == 'ris') { return "fullRecord" } else if (fileFormat == 'bibtex'){ return "fullRecordPlus" } else { return "fullRecordPlus" } } function getDownloadFileExt() { if (fileFormat == 'excel') { return ".xls" } else if (fileFormat == 'ris') { return ".ris" } else if (fileFormat == 'bibtex'){ return ".bib" } else { return ".txt" } } function genRequestData(start, stop) { let requestJson = { "parentQid": getParentQid(), "sortBy": "relevance", "displayTimesCited": "true", "displayCitedRefs": "true", "product": "UA", "colName": "WOS", "displayUsageInfo": "true", "fileOpt": get_fileOpt(), "action": get_action(), "markFrom": start, "markTo": stop, "view": "summary", "isRefQuery": "false", "locale": "en_US", "filters": get_filters(), // update: 20231211 不再需要这个字段 // "bm-telemetry": get_bm_telemetry() } let requestData = JSON.stringify(requestJson) return requestData } function downloadFile(fileName, content) { let downLink = document.createElement('a') downLink.download = fileName //字符内容转换为blod地址 let blob = new Blob([content]) downLink.href = URL.createObjectURL(blob) // 链接插入到页面 document.body.appendChild(downLink) downLink.click() // 移除下载链接 document.body.removeChild(downLink) } function sleep(delay) { for(var t = Date.now(); Date.now() - t <= delay;); } // 生成随机数 function randomNum(minNum, maxNum){ switch(arguments.length){ case 1: return parseInt(Math.random()*minNum+1,10); case 2: return parseInt(Math.random()*(maxNum-minNum+1)+minNum,10); default: return 0; } } function enableDownloadButton(){ $("#downloadButton").html('一键下载') $("#downloadButton").attr("disabled", false); } function disableDownloadButton(){ $("#downloadButton").html('正在下载...') $("#downloadButton").attr("disabled", true); } function requestFileByIndex(start, stop, total, callback) { start = "" + start; if (parseInt(stop) > total) { stop = total; } stop = "" + stop; console.log("正在下载" + start + "到" + stop + "份数据,总共" + total + "份") disableDownloadButton() try { var data = genRequestData(start, stop) } catch (error) { console.error(error) enableDownloadButton() alert('请求出错,请联系开发者') return } let reqAjax = $.ajax({ url:DOWNLOAD_URL, type: 'POST', headers: { "x-1p-wos-sid": wosSid, "accept": "application/json, text/plain, */*", "content-type": "application/json", "accept-language": "zh-CN,zh;q=0.9" }, "crossDomain": true, data: data, success: function(result){ //console.log(result); let filename = "" + start + '-' + stop + getDownloadFileExt() downloadFile(filename, result) }, error: function(err){ console.log(err); console.log(err.responseJSON); enableDownloadButton() alert('下载出错:'+JSON.stringify(err.responseJSON)) } }) $.when(reqAjax).done(function(){ var nextStart = parseInt(start) + 500 var nextStop = parseInt(stop) + 500 if (nextStart > total) { enableDownloadButton() console.log("===下载完成==="); alert('下载完成') return } let min_val = waitSecond - 5 let max_val = waitSecond + 5 var sleepNum = randomNum(min_val, max_val) console.log("等待" + sleepNum + "秒后再下载") sleep(sleepNum*1000) callback(nextStart, nextStop, total, callback) }) } function getSessionID() { // const sidRegex = /SID=([a-zA-Z0-9]+)/i; // // session ID is embedded in the static page inside an inline