// ==UserScript== // @name 悦读pdf下载 // @namespace http://tampermonkey.net/ // @version 0.5 // @description try to take over the world! // @author You // @match *://yd.51zhy.cn/ebook/reader/index.html* // @require https://cdn.bootcdn.net/ajax/libs/jquery/1.10.0/jquery.min.js // @grant none // @license MIT // @downloadURL https://update.greasyfork.icu/scripts/411868/%E6%82%A6%E8%AF%BBpdf%E4%B8%8B%E8%BD%BD.user.js // @updateURL https://update.greasyfork.icu/scripts/411868/%E6%82%A6%E8%AF%BBpdf%E4%B8%8B%E8%BD%BD.meta.js // ==/UserScript== function loadStyle(url){ var link = document.createElement('link'); link.type = 'text/css'; link.rel = 'stylesheet'; link.href = url; var head = document.getElementsByTagName('head')[0]; head.appendChild(link); } function loadScript(url, callback){ var script = document.createElement ("script") script.type = "text/javascript"; if (script.readyState){ //IE script.onreadystatechange = function(){ if (script.readyState == "loaded" || script.readyState == "complete"){ script.onreadystatechange = null; if(typeof(callback) == 'function') { callback(); } } }; } else { //Others script.onload = function(){ if(typeof(callback) == 'function') { callback(); } }; } script.src = url; document.getElementsByTagName("head")[0].appendChild(script); } //获取元素在数组的下标 Array.prototype.indexOf = function(val) { for (var i = 0; i < this.length; i++) { if (this[i] == val) { return i; }; } return -1; }; function range(start, stop, step = 1) { return Array(Math.ceil((stop - start) / step)) .fill(start) .map((x, y) => x + y * step) } function Uint8ToString(u8a){ var CHUNK_SZ = 0x8000; var c = []; for (var i=0; i < u8a.length; i+=CHUNK_SZ) { c.push(String.fromCharCode.apply(null, u8a.subarray(i, i+CHUNK_SZ))); } return c.join(""); } function fakeClick(obj) { var ev = document.createEvent("MouseEvents"); ev.initMouseEvent("click", true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null); obj.dispatchEvent(ev); } function exportRaw(name, data) { var urlObject = window.URL || window.webkitURL || window; var export_blob = new Blob([data]); var save_link = document.createElementNS("http://www.w3.org/1999/xhtml", "a") save_link.href = urlObject.createObjectURL(export_blob); save_link.download = name; fakeClick(save_link); } var authorize_obj = null; var detail_obj = null; (function (open) { XMLHttpRequest.prototype.open = function () { if (arguments[1].includes("/content/authorize")) { this.addEventListener("load", function () { if(authorize_obj === null){ let responseOBJ = JSON.parse(this.responseText); authorize_obj = responseOBJ; } }, false); } else if (arguments[1].includes("Content/Detail")) { this.addEventListener("load", function () { if(detail_obj === null){ let responseOBJ = JSON.parse(this.responseText); detail_obj = responseOBJ; } }, false); } open.apply(this, arguments); }; })(XMLHttpRequest.prototype.open); function download_info(){ if(authorize_obj && detail_obj){ var v = $vm.$children[0].$children[0].$children[0]; var book_name = detail_obj['Data']['Title']; var obj = {"authorize":authorize_obj, "detail":detail_obj, "cookie":document.cookie.split(/;\s*/), "ast":ast.toString(), // "vue":{ // 'AuthorizeToken':v.AuthorizeToken, // 'readData':v.readData, // 'rsaKey':v.rsaKey, // 'tableOfContentList':v.tableOfContentList, // '_data':v._data // } }; var cache = []; console.log(obj); var str = JSON.stringify(obj, function(key, value) { if (typeof value === 'object' && value !== null) { if (cache.indexOf(value) !== -1) { // Circular reference found, discard key return; } // Store value in our collection cache.push(value); } return value; }, 4); exportRaw(book_name+'_51zhy_info.json', str); } } // 保存加载过的页面 // key 为页码,从0开始 // val 为u8n var pages_save = {}; // 浏览器直接下载时,pages_save不保存页面,pages_downloaded保存已经下载过的 var pages_downloaded = []; var download_direct = 1; // vue接口 var v; // 依赖vue接口 // v = window.$vm.$children[0].$children[0].$children[0] // v.pageArr // v.DetailData.Title // v.numberOfPages // v.pageIndex // v.setLoadTask() // 注册到window便于调试 window.pages_save = pages_save; window.v = v; // v = window.$vm.$children[0].$children[0].$children[0] // v.pageArr // 检查是否有新的页面已经下载 function check_new(){ v.pageArr.forEach(function (val,idx){ // idx 页码,从0开始 // console.log('check:',idx,val.isLoadIng,val); if(val == null)return; if(val.isLoadIng == true)return; // 直接下载 if(download_direct == 1){ // console.log('idx:',idx); // console.log('need_download_pages', need_download_pages); // console.log('pages_download', pages_downloaded); // idx 在need_download_pages中 且 不在pages_downloaded中 if(need_download_pages.indexOf(idx) >=0 && pages_downloaded.indexOf(idx)<0){ pages_downloaded.push(idx); var page_num = idx+1; exportRaw(v.DetailData.Title+'_' + page_num.toString()+".pdf", val.getUint8Array); show_msg("[Download] page:", page_num, '/', v.numberOfPages); v.pageArr[idx] = null; } } // 保存导出json下载 else{ if(pages_save[idx]==undefined){ pages_save[idx] = val.getUint8Array; show_msg("[Page] got page:", idx+1, '/', v.numberOfPages); } } }); // 计算进度 var cnt = 0; need_download_pages.forEach(function(num){ if(download_direct){ if(pages_downloaded.indexOf(num)>=0){ cnt++; } } else{ if(pages_save[num]!=undefined){ cnt++; } } }) var p = Math.round(cnt/need_download_pages.length*100); set_progress(p); } // 周期check var check_timer; function start_check(){ check_timer = setInterval(function (){ check_new(); },1000); } function stop_check(){ clearInterval(check_timer); } // 跳转到页 page_num从0开始 // 内部调用check function jump_page(page_num){ if(page_num>=v.numberOfPages){ show_msg('页码超出范围。',page_num); return; } v.pageIndex = page_num; v.setLoadTask(); check_new(); } // 对于need_download_pages中的下载任务,自动进行 var auto_next_timer; var current_task_idx; var is_done = 1; // tasks // 内容为页码 页码从0开始 var need_download_pages = []; window.need_download_pages = need_download_pages; // t 单位s 最小3s // start 开始的序号 // pages 需要下载的页码 从0开始 function start_auto_next(t, start, pages){ if(t<=3 || t == undefined){ t = 3; } if(start == undefined){ current_task_idx = 0; start = 0; } else{ current_task_idx = start; } if(pages == undefined) { pages = [...Array(v.numberOfPages).keys()]; } need_download_pages = []; pages_downloaded = []; for(var i=0;i=0) { need_download_pages.push(pages[i]); } } console.log('pages:', need_download_pages); auto_next_timer = setInterval(function(){ check_new(); var s = current_task_idx; var cnt = 0; while(cnt=0) || (pages_save[page_num]!=undefined)){ // 已经下载过了 s ++; s = s%need_download_pages.length; cnt++; } else{ break; } } if(cnt>=need_download_pages.length){ // 下载完成 is_done = 1; stop_auto_next(); set_progress(100); } else{ // 下载 show_msg('[Jump]',s,"page:",need_download_pages[s]+1); jump_page(need_download_pages[s]); current_task_idx = (s+1)%need_download_pages.length; } },t*1000); } function stop_auto_next(){ clearInterval(auto_next_timer); } var download_obj = {}; function export_pages(){ download_obj['pages']={}; var page_nums = Object.keys(pages_save); page_nums.forEach(function(val){ download_obj['pages'][val] = Uint8ToString(pages_save[val]); pages_save[val] = true; }) } function parse_pages(str){ var pages = []; str = str.replace('\n',','); var _pages = str.split(','); for(var i=0,len=_pages.length;i

Github:Star


Status:Ready!

', skin: 'layui-layer-molv', shade: 0, btnAlign: 'c' , offset: 'rt', area:'300px', btn: ['Download', 'Info', 'Cancel'], btn1: function(){ fun_btn(); return false; }, // btn2: function(){ // fun_btn(0); // return false; // }, btn2: function(){ download_info(); return false; }, btn3: function(){ cancel_download(); return false; } }); window.element = layui.element; window.element.init(); set_status('Wait initing...'); }) var wait_vue_timer; wait_vue_timer = setInterval(function(){ if(v == undefined){ v = window.$vm.$children[0].$children[0].$children[0]; show_msg('[Wait] window.$vm'); set_status('wait window.$vm'); } else{ show_msg('[OK] window.$vm'); set_status('Loading numberOfPages...'); var _t = setInterval(function (){ if(v.numberOfPages != undefined && v.numberOfPages > 0){ set_status('Ready! pages:'+v.numberOfPages.toString()); clearInterval(_t); } },200); clearInterval(wait_vue_timer); } },200)