Tukang Download Google Books Preview

Save books to jpg by direct download or by copying to canvas!

  1. // ==UserScript==
  2. // @name Tukang Download Google Books Preview
  3. // @namespace https://github.com/beritaprofit/tukang-e-book/edit/master/tukang-e-book.user.js
  4. // @version 0.3.0.3
  5. // @description Save books to jpg by direct download or by copying to canvas!
  6. // @author beritaprofit
  7. // @license https://creativecommons.org/licenses/by-sa/4.0/
  8. // @homepage https://github.com/beritaprofit/tukang-e-book
  9. // @supportURL https://github.com/beritaprofit/tukang-e-book/issues
  10. // @contributionURL https://github.com/beritaprofit/tukang-e-book#donate
  11. // @include https://books.google.*
  12. // @include https://www.google.com/books/*
  13. // @include https://books.google.*/books
  14. // @require https://gf.qytechs.cn/scripts/48306-waitforkeyelements/code/waitForKeyElements.js?version=275769
  15. // @require http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js
  16. // @require https://gf.qytechs.cn/scripts/381230-filesaver-min-js/code/FileSaverminjs.js?version=685345
  17. // @grant GM_xmlhttpRequest
  18. // @grant GM_log
  19.  
  20.  
  21. // ==/UserScript==
  22. this.$ = this.jQuery = jQuery.noConflict(true);
  23.  
  24.  
  25. //from google Book downloader foxyspeed
  26. Array.prototype.inArray = function (value,begin) {
  27. begin = (begin)?begin:0;
  28. for (var i=begin; i < this.length; i++) {
  29. if (this[i] === value) {
  30. return i;
  31. }
  32. }
  33. return -1;
  34. };
  35.  
  36. function uniq(a) {
  37. return a.sort().filter(function(item, pos, ary) {
  38. return !pos || item != ary[pos - 1];
  39. })
  40. }
  41.  
  42. function pad(n, width, z) {
  43. z = z || '0';
  44. n = n + '';
  45. return n.length >= width ? n : new Array(width - n.length + 1).join(z) + n;
  46. }
  47.  
  48. function addStyleSheet(style){
  49. var getHead = document.getElementsByTagName("HEAD")[0];
  50. var cssNode = window.document.createElement( 'style' );
  51. var elementStyle= getHead.appendChild(cssNode);
  52. elementStyle.innerHTML = style;
  53. return elementStyle;
  54. }
  55.  
  56. addStyleSheet('@import "https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css";');
  57.  
  58.  
  59.  
  60.  
  61. var items = [];
  62. var dllinks;
  63.  
  64. var i =0;
  65. var percentage
  66. var number;
  67.  
  68. var num;
  69.  
  70.  
  71. var imgBlob;
  72. var srclinks = new Map();
  73. function generateDownloadButton (jNode) {
  74. //jNode.attr ("src").match (/\d+/g);
  75. console.log(jNode.attr ("src"));
  76. //image = document.getElementById('foo')
  77.  
  78.  
  79.  
  80. var pids= new URL(jNode.attr ("src")).searchParams.get("pg");
  81. console.log(pids);
  82. if (pids!=null) {
  83. var pidsnum= pids;
  84. pidsnum.replace( /\D+/g, '');
  85.  
  86. //var string_a = "jkjkhj89898";
  87. var numstring = pidsnum.match(/[^\d]+|\d+/g);
  88.  
  89. var name = "Canvas " +numstring[0]+ pad(numstring[1], 4);
  90.  
  91.  
  92. var button2 = document.createElement("Button");
  93. button2.innerHTML = '<i class="fa fa-file-image-o"></i>';
  94. button2.setAttribute ('id', name);
  95. button2.value = jNode.attr ("src");
  96. //+ "background-color: DodgerBlue; border: none; color: white; padding: 12px 16px; font-size: 16px; cursor: pointer; "
  97. //button2.style = "position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%);-ms-transform: translate(-50%, -50%);background-color: #555;color: white;font-size: 16px;padding: 12px 24px;border: none;cursor: pointer;border-radius: 5px;z-index: 9999"
  98. button2.style = "position: absolute;top: 0%;left: 2px;transform: translate(2%, 2%);-ms-transform: translate(2%, 2%);z-index: 9999;"
  99. + "background-color: RoyalBlue; border: none; color: white; padding: 16px 16px; font-size: 16px; cursor: pointer";
  100. jNode.after(button2);
  101.  
  102. button2.addEventListener( 'click', function () {
  103. //alert("Hi"+name+this.value );
  104. var imgs = document.getElementsByTagName('img');
  105. for (var i = imgs.length - 1; i >= 0; i--) {
  106. if (imgs[i].src == this.value) {
  107. //var textNode = document.createElement('b');
  108. //imgBlob = base64img(imgs[i]);
  109. //alert(imgBlob);
  110. //saveImage(base64imgraw(imgs[i]))
  111. //saveAs(imgBlob, "hello world.png");
  112. saveAs(b64toFile(base64img(imgs[i])), name+".jpg") ;
  113. }}
  114. }, true );
  115.  
  116. var button3 = document.createElement("Button");
  117. name = numstring[0]+ pad(numstring[1], 4);
  118.  
  119. button3.innerHTML = '<i class="fa fa-download"></i>';
  120. //button3.innerHTML = numstring[0]+ pad(numstring[1], 4);;
  121. button3.setAttribute ('id', name);
  122. button3.value = jNode.attr ("src");
  123. //button3.style = "position: absolute;top: 0%;left: 100%;transform: translate(-102%, 2%);-ms-transform: translate(-102%, 2%);background-color: #555;color: white;font-size: 16px;padding: 12px 24px;border: none;cursor: pointer;border-radius: 5px;z-index: 9999"
  124. button3.style = "position: absolute;top: 0%;left: 100%;transform: translate(-102%, 2%);-ms-transform: translate(-102%, 2%);z-index: 9999;"
  125. + "background-color: RoyalBlue; border: none; color: white; padding: 16px 16px; font-size: 16px; cursor: pointer";
  126. button2.after(button3);
  127. button3.addEventListener( 'click', function () {
  128. saveAs(this.value, name+".jpg");
  129.  
  130. }, true );
  131.  
  132. if (items.inArray(jNode.attr ("src")) == -1) {
  133. items.push(jNode.attr ("src"));
  134. }
  135. }
  136.  
  137. var imgId = jNode.attr("id");
  138. //button.innerHTML =jNode.attr ("src");
  139. dllinks=jNode.attr ("src");
  140. //add(jNode.attr ("src"));
  141.  
  142.  
  143. }
  144.  
  145.  
  146. waitForKeyElements ("img[src*='content']", generateDownloadButton);
  147.  
  148.  
  149.  
  150. function scalePreserveAspectRatio(imgW,imgH,maxW,maxH){
  151. return(Math.min((maxW/imgW),(maxH/imgH)));
  152. }
  153.  
  154. function base64img(i){
  155. var canvas = document.createElement('canvas');
  156. canvas.width = i.width;
  157. canvas.height = i.height;
  158. var context = canvas.getContext("2d");
  159.  
  160. context.mozImageSmoothingEnabled = false;
  161. context.imageSmoothingEnabled = false;
  162. context.webkitImageSmoothingEnabled = false;
  163.  
  164. context.drawImage(i, 0, 0,canvas.width, canvas.height);
  165. //var blob = canvas.toDataURL("image/png");
  166. var blob = canvas.toDataURL("image/jpg");
  167. return blob.replace(/^data:image\/(png|jpg);base64,/, "");
  168. }
  169.  
  170.  
  171. function base64imgraw(i){
  172. var canvas = document.createElement('canvas');
  173. canvas.width = i.width;
  174. canvas.height = i.height;
  175. var context = canvas.getContext("2d");
  176.  
  177. context.mozImageSmoothingEnabled = false;
  178. context.imageSmoothingEnabled = false;
  179. context.webkitImageSmoothingEnabled = false;
  180.  
  181. context.drawImage(i, 0, 0,canvas.width, canvas.height);
  182.  
  183. //context.drawImage(i, 0, 0,canvas.width, canvas.height);
  184. //var blob = canvas.toDataURL("image/png");
  185. var blob = canvas.toDataURL("image/jpg");
  186. return blob;
  187. }
  188.  
  189.  
  190. function b64toFile(b64Data, filename, contentType) {
  191. var sliceSize = 512;
  192. var byteCharacters = atob(b64Data);
  193. var byteArrays = [];
  194.  
  195. for (var offset = 0; offset < byteCharacters.length; offset += sliceSize) {
  196. var slice = byteCharacters.slice(offset, offset + sliceSize);
  197. var byteNumbers = new Array(slice.length);
  198.  
  199. for (var i = 0; i < slice.length; i++) {
  200. byteNumbers[i] = slice.charCodeAt(i);
  201. }
  202. var byteArray = new Uint8Array(byteNumbers);
  203. byteArrays.push(byteArray);
  204. }
  205. var file = new File(byteArrays, filename, {type: contentType});
  206. return file;
  207. }
  208.  
  209.  
  210. //console.log('sukses');
  211. //alert("hello");

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址