Advertisement
iwanami

ebjdown210420

Apr 19th, 2021
1,196
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // ==UserScript==
  2. // @name         Ebookjapan hacker
  3. // @namespace    http://tampermonkey.net/
  4. // @version      0.1
  5. // @description  try to take over the world!
  6. // @author       You
  7. // @match        https://ebookjapan.yahoo.co.jp/bviewer/purchased/*
  8. // @match        https://ebookjapan.yahoo.co.jp/bviewer/trial/*
  9. // @grant        none
  10. // ==/UserScript==
  11.  
  12. (function() {
  13.   const showTips = {
  14.     info (msg) {
  15.       console.log('%c' + msg, 'color:blue');
  16.     },
  17.     success (msg) {
  18.       console.log('%c' + msg, 'color:green');
  19.     },
  20.     error (msg) {
  21.       console.log('%c' + msg, 'color:red');
  22.     }
  23.   }
  24.  
  25.   const delayExec = function(fn, delay) {
  26.     let timer = null
  27.     let context
  28.  
  29.     return function(...args) {
  30.       context = this
  31.       if (timer) {
  32.         clearTimeout(timer)
  33.       }
  34.  
  35.       timer = setTimeout(() => {
  36.         fn.apply(context, args)
  37.         timer = null
  38.       }, delay)
  39.     }
  40.   }
  41.  
  42.   const rename = num => num > 99 ? num : num > 9 ? '0' + num : '00' + num;
  43.  
  44.   const downloadPage = (resolve, index) => {
  45.     return function(blob) {
  46.       const a = document.createElement('a');
  47.       a.download = rename(index);
  48.       a.href = window.URL.createObjectURL(blob);
  49.       a.click();
  50.       window.URL.revokeObjectURL(a.href);
  51.       resolve();
  52.     }
  53.   }
  54.  
  55.   let toBlob; // 取回canvas元素转换为二进制文件的API
  56.   let getImageData;
  57.   let viewerCanvas;
  58.  
  59.   {
  60.     const iframe = document.createElement('iframe');
  61.     iframe.style.display = "none";
  62.  
  63.     iframe.onload = e => {
  64.       toBlob = iframe.contentWindow.HTMLCanvasElement.prototype.toBlob;
  65.       getImageData = iframe.contentWindow.CanvasRenderingContext2D.prototype.getImageData;
  66.  
  67.  
  68.       window.HTMLCanvasElement.prototype.toBlob = toBlob;
  69.       window.CanvasRenderingContext2D.prototype.getImageData = getImageData;
  70.  
  71.       showTips.success('iframe load success')
  72.     }
  73.  
  74.     document.body.appendChild(iframe);
  75.   }
  76.  
  77.   const getCanvas = function(whiteBorder = false, index) {
  78.     console.log(index)
  79.     const newCanvas = document.createElement('canvas')
  80.     newCanvas.width = viewerCanvas.width - (whiteBorder ? 1 : 0)
  81.     newCanvas.height = viewerCanvas.height
  82.  
  83.     const capture = getImageData.apply(viewerCanvas.getContext('2d'), [
  84.       whiteBorder ? (index % 2 === 0 ? 1 : 0) : 0,
  85.       0,
  86.       viewerCanvas.width - (whiteBorder ? 1 : 0),
  87.       viewerCanvas.height
  88.     ]);
  89.  
  90.     newCanvas.getContext('2d').putImageData(capture, 0, 0);
  91.  
  92.     return newCanvas;
  93.   }
  94.  
  95.   const drawed = delayExec(async function(whiteBorder, pageIndex) {
  96.     const mimeType = 'image/png';
  97.     const canvas = getCanvas(whiteBorder, pageIndex)
  98.     toBlob.apply(canvas, [downloadPage(() => {}, pageIndex), mimeType]);
  99.   }, 1500);
  100.  
  101.   const startDownload = function (whiteBorder, pageIndex = 0) {
  102.     const __drawImage = window.CanvasRenderingContext2D.prototype.drawImage;
  103.  
  104.     // 获取阅读器的canvas元素
  105.     viewerCanvas = document.querySelector('.viewer > canvas');
  106.  
  107.     window.CanvasRenderingContext2D.prototype.drawImage = function(...args) {
  108.       if (args.length !== 5) {
  109.         return __drawImage.apply(this, args);
  110.       }
  111.  
  112.       __drawImage.apply(this, args);
  113.       drawed(whiteBorder, pageIndex++);
  114.     }
  115.  
  116.     drawed(whiteBorder, pageIndex++);
  117.   };
  118.  
  119.   const btn = document.createElement('button')
  120.   btn.setAttribute('style', 'z-index:999999;position:absolute;top:0;left:0');
  121.   btn.innerHTML = '开始下载'
  122.   btn.addEventListener('click', function() {
  123.     startDownload()
  124.     btn.remove()
  125.   });
  126.  
  127.   window.onload = function() {
  128.     window.parent.document.body.appendChild(btn)
  129.   }
  130. })();
  131.  
  132. // ==使用==
  133. //先加入油猴脚本,单页。 要启动的话,页面加载完后左上角,会有个小小的按钮写着「开始下载」,点击那个后然后开始缓慢翻页即可。
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement