Google Book Downloader FoxySpeed

Google Book Downloader

  1. // ==UserScript==
  2. // @name Google Book Downloader FoxySpeed
  3. // @description Google Book Downloader
  4. // @version 1.0
  5. // updateURL http://userscripts.org/scripts/source/399674.meta.js
  6. // @author Ismail Iddakuo
  7. // @Original-s- 2.3 http://userscripts.org/scripts/show/37933
  8. // @include http://books.google.*
  9. // @include http://www.google.com/books/*
  10. // @require http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js
  11. // @namespace https://gf.qytechs.cn/users/2949
  12. // ==/UserScript==
  13.  
  14. var debug = 0;
  15. var conlose;
  16.  
  17. Array.prototype.inArray = function (value,begin) {
  18. var begin = (begin)?begin:0;
  19. for (var i=begin; i < this.length; i++) {
  20. if (this[i] === value) {
  21. return i;
  22. }
  23. }
  24. return -1;
  25. };
  26.  
  27. $.fn.replace = function(o) { return this.after(o).remove(); };
  28.  
  29.  
  30. var log = function(obj) {
  31. if (debug)
  32. {
  33. if (!console)
  34. {
  35. console = unsafeWindow.console;
  36. }
  37. console.log(obj);
  38. }
  39. }
  40.  
  41. var GBD = {
  42. // script version
  43. version : '2.3',
  44. // page width
  45. pageWidth : 800,
  46. // page source
  47. pageSource : null,
  48. // link prefix
  49. prefix : '',
  50. PIDs : new Array(),
  51. viewedPIDs : new Array(),
  52. totalPIDs : 0,
  53. currentIndex : -1,
  54. firstIndex : -1,
  55. lastIndex : -1,
  56. stop : false,
  57. icons : {
  58. downloadPage : 'data:image/png;base64,'+
  59. 'iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAEnUlEQVRYw+2XS4wUVRSGv3O7uumenmHQYRRBBSM+MZIoEqNGcGFCIpqAMT5WxgfGuBET0BVLg5iIMdGFji50Y1ywEBfGBQk+I4FoIgmC'+
  60. 'iOgojI7DMPY8quree46L6kaYYWQaTNh4k1NVuXVT57//+c+5p8TMOJ/DcZ7H/wCSyRNPvfT2CmALsPw/+P4EsPbNF574uDUxRXNmdoqt29x39Lsf+y1GNQvhnG3d5r7xdZv7Vk3n73QhmJe7Wby9cy8A'+
  61. 'j/XtYNO2rzEgVTvFJqIy5iOjuWckzRgen2CoMcYfIw0GhkcAePS+lTVg28kgzqiBkbEMmkzduvhiblzYO2WNmaFqmClRFVVF40nPqgAMNIyn195dA7bNGIBIYcWzTFk0E+cxFgCG04xxSwBqMwZgJy4g'+
  62. 'BnIWztUKABqULGh7aVjsvnhlIi0sbTlXtRMuRNpIQwA1QylQP7niuhPztZKDEjQvMxqKov9S7k8LoLXTR974mEYaWdTbhRNBHDgczk0KC6BaODMtNnB4sEFXtcSd112GtQ1AjajGHddeRuoDF3V1NIUp'+
  63. 'yIkQSRElLSCYFUCK/IYrLuqmWk6Iapi2CSCo4aMiIkRVgupUACJIbAl2KoCoio+KmRHaBRBVyYOy8d6bz6kOf/DlQ4xnR+gfjFy7xPPK9lt+AK46MwPR8DEC0Gg0cK79M0tVSf1R1tz2Dnn8i5G/Gmzf'+
  64. 'vaF3Rgx4VVIfT5lL05ShoaEzOq7X68yZM6cpZhhofM6x9Buy0e42NBAj2SQA1WqVBQsWtM2EiEMQpB0N+GBk3p8zAwULimFMV42mYUDJw3/BgBVVEUVKbTCQByPP9ZwYyMMYSalGsBSNHlwAKG39aHlp'+
  65. '/epd8YwizGP7DGS+wY59zzOy/xCVpINLe5eRhkGCesxGuHze0s7+378LWz9a3uqWFrrpSrE1j1NVndLFTGeJqxI1Z9niZ1i17GXq3RWy8AdqnvHwJxf0dPDgitdYumgNwLfAsUQmiWPd5r6isgHZ7u1k'+
  66. 'v/9M0tUz46jforfz2cG3yGwtwU0Q4hjBArmmOD/GnoMfcKD/00ERHli/elc8bQg6axU6ahWkXiO5EEodXTMG0MMl3JyW2PPT+1y/+H5yGUZtHJEKlnbz/eGdeSmRtetX7/qtpQEBpF6vi3OuBHaky4X5'+
  67. 'dy25HBs7wKyJQVwhoBmPK5nHaLiJ4eP9dM9ZSBY95dDB8ZEhMDZuenjfV8+NigMs6ezsdGaWiEjFzCrHjv664ZMv7FUR13t43lyg5yxPgpXUx7Zzw1UV6rOW8MvwXvoH9r734uMH3hWRamdnpx8dHY1S'+
  68. 'q9WScrmcxBgrzrlZQEVEEjNzLXb45/g/WTAyTYfVErabO79cf3bLNe9ef+Wqq3fv+3D/6xsOPXj8Tz8EpGaWmVlWCiFYtVo1731MksQDedMywJuZF5HWPYhIAGLTQtN8kTymImJFU2XSOJ6rJLa/Pv/I'+
  69. 'Pd9+Prx1946hA8B4qVTKnXMK2ORdCCCzZ8+WEIJUKhVRVWmmopgZ5XJZputwvPfinEOK1DIzwzlnMUZzzpn33gBLksQAS9PU5Hz/nv8NUdxh/r5R354AAAAASUVORK5CYII='
  70. },
  71. // init script
  72. init : function() {
  73. GBD.checkForUpdate();
  74. if ($('#viewport').length)
  75. {
  76. GBD.addStyle([
  77. '.gbd_downloadpage { position:absolute;top:0px;right:-50px; text-align:center; }',
  78. '.gbd_downloadpage img { border:none }',
  79. '.gbd_downloadpage p { padding:0px;margin:0px;font-weight:bold }'
  80. ]);
  81. GBD.startListerning();
  82. GBD.addDownloadButton();
  83. }
  84. },
  85.  
  86. startListerning : function() {
  87. var pagesNode = $('#viewport > div > div > div');
  88. if (pagesNode.length) {
  89. var childs = $(pagesNode).children('div');
  90. var count = childs.length;
  91. pagesNode.bind('DOMAttrModified', GBD.processImage);
  92. for (i=0;i<count;i++) {
  93. GBD.processPage(childs.get(i));
  94. }
  95. }
  96. },
  97. /*
  98. stopListerning : function() {
  99. $('#viewport > div > div > div').unbind('DOMNodeInserted');
  100. },
  101. */
  102. processImage : function(e) {
  103. if (e.attrName != "src")
  104. {
  105. return false;
  106. }
  107. var parentDOM = $(e.originalTarget).parent().parent().parent().parent();
  108. GBD.processPage(parentDOM[0]);
  109. //var imageDOM =
  110. },
  111. processPage : function(e) {
  112. var newDOM = (e instanceof Object) ? this : e;
  113.  
  114. var divNode = $(newDOM).children("div:last");
  115. var target = divNode.find(".pageImageDisplay");
  116. if (!target.length)
  117. {
  118. return;
  119. }
  120. else if ($(target).find("div.gbd_empty").length)
  121. {
  122. return;
  123. }
  124. var imgNode = $("img:eq(0)", target);
  125. if (imgNode.length) {
  126. var src = imgNode.attr('src');
  127. if (src)
  128. {
  129. GBD.addDownloadPage(target, src);
  130. }
  131. }
  132. },
  133. addDownloadPage : function(target, src)
  134. {
  135. src += "&w=" + GBD.pageWidth;
  136. var regExp = new RegExp('&pg=([^&]+)');
  137. var match = regExp.exec(src);
  138. var pageName = match[1];
  139. $(target).append($('<div class="gbd_empty" />'));
  140. var parent = $(target).parent();
  141. parent.css('margin-right', '100px');
  142. $(parent).append(
  143. $('<div class="gbd_downloadpage"><a href="'+ src +'" target="_blank" title="'+ pageName +'.png"><img src="'+ GBD.icons.downloadPage +'" /><p>'+ pageName +'</p></a></div>')
  144. );
  145. },
  146. addStyle : function(styles) {
  147. GM_addStyle(styles.join("\r\n"));
  148. },
  149. addDownloadButton : function() {
  150. GBD.addStyle([
  151. '#gbdButtonDiv { text-align:center; padding:10px; margin-bottom:10px; background-color:#EAF4FB; }',
  152. '#gbdButton { background-color:#FAFAFA; border:1px solid #E5E5E5; border-bottom-width:2px; color:#707070; padding:4px; font-weight:bold; }',
  153. '#gbdButton:hover { color:#FF9300; cursor:pointer }',
  154. ]);
  155. $('<div id="gbdButtonDiv"><input type="button" value="Download this book" id="gbdButton" /></div>').insertBefore('#menu_container');
  156. $('#gbdButton').click(function() {
  157. GBD.prepareDownload();
  158. });
  159. },
  160. prepareDownload : function() {
  161. GBD.stats();
  162. // clear side bar content
  163. $('#menu_td').html('<div id="gbdPanel"></div>');
  164. GBD.addStyle([
  165. '#gbdPanel { padding:10px; font-family:Arial; font-size:12px; background-color:#FAFAFA; color:#707070; overflow-y:auto; height:500px }',
  166. '#gbdHeader { color:#FF9300; font-size:14px; padding:0px; margin-bottom:10px; text-align:center; }',
  167. '#gbdResult { padding:10px; background-color:#FFFFFF; border:1px solid #E5E5E5; margin-bottom:20px }',
  168. '#gbdResultList div { margin-bottom:4px; padding:4px; background-color:#FAFAFA; border:1px solid #E5E5E5; border-bottom-width:2px; margin:5px; }',
  169. '#gbdResultList div a { color:#707070; font-weight:bold; text-decoration:none }',
  170. '#gbdResultList div a:hover { color:#FF9300; cursor:pointer }',
  171. '#gbdDownload { background-color:#FAFAFA; border:1px solid #E5E5E5; border-bottom-width:2px; color:#707070; padding:4px; font-weight:bold; margin:10px }',
  172. '#gbdDownload:hover { color:#FF9300; cursor:pointer }',
  173. '#gbdFooter { text-align:center; font-size:10px; font-weight:bold; padding-bottom:40px }',
  174. '#gbdFooter a { color:#707070; text-decoration:none; }',
  175. '#gbdFooter a:hover { color:#FF9300}',
  176. '#gbdDonate { text-align:center; padding:0px 0px 5px}',
  177. ]);
  178. $('#gbdPanel').html('<h1 id="gbdHeader">Google Book Downloader '+ GBD.version +'</h1>' +
  179. '<div id="gbdDonate"><a href="https://www.paypal.com/cgi-bin/webscr?cmd=_donations&amp;business=redphoenix89%40yahoo%2ecom&amp;lc=VN&amp;currency_code=USD&amp;bn=PP%2dDonationsBF%3abtn_donateCC_LG%2egif%3aNonHostedGuest"><img border="0" src="https://www.paypal.com/en_US/i/btn/btn_donate_LG.gif"/></a></div>' +
  180. '<div id="gbdResult">Getting page list, please wait ...</div>' +
  181. '<div id="gbdFooter"><a href="http://book.huhiho.com">book.huhiho.com - redphoenix89</a></div>'
  182. );
  183. // get page source
  184. var scriptNodes = document.getElementsByTagName('script');
  185. for (var i=0; i < scriptNodes.length; i++)
  186. {
  187. if (scriptNodes.item(i).innerHTML.indexOf('_OC_Run({') > -1)
  188. {
  189. GBD.pageSource = scriptNodes.item(i).innerHTML;
  190. break;
  191. }
  192. }
  193. if (!GBD.pageSource)
  194. {
  195. alert('Error while getting pages. Please refresh and try again');
  196. return;
  197. }
  198. //alert(GBD.pageSource);
  199. // get link prefix
  200. GBD.getPrefix();
  201. GBD.getPIDs();
  202. },
  203. getPrefix : function() {
  204. var regExp = new RegExp('"prefix":"([^"]+)"');
  205. var match = regExp.exec(GBD.pageSource);
  206. GBD.prefix = match[1].replace(/\\u0026/g,'&');
  207.  
  208. },
  209. getPIDs : function() {
  210. var regExp = new RegExp('"pid":"([^"]+)","src"');
  211. var match = regExp.exec(GBD.pageSource);
  212. var firstPID = match[1];
  213. var totalPIDs = 0;
  214. var pUrl = GBD.prefix +'&pg='+ firstPID +'&sig=&jscmd=click3';
  215. GM_xmlhttpRequest({
  216. method: "GET",
  217. url: pUrl,
  218. onload: function(results) {
  219. var data = results.responseText;
  220. var regExp = new RegExp('{"pid":"([^"]+)"}','g');
  221. var match;
  222. while (match = regExp.exec(data)) {
  223. GBD.PIDs.push(match[1]);
  224. }
  225. //GBD.PIDs = PIDs.unique();
  226. GBD.totalPIDs = GBD.PIDs.length;
  227. GBD.showPageList();
  228. },
  229. });
  230. },
  231. showPageList : function() {
  232. var options = '';
  233. for (var i=0;i<GBD.totalPIDs;i++) {
  234. options += '<option value="'+ i +'">'+ GBD.PIDs[i] +'</option>';
  235. }
  236. var html = 'From page :<br /><select id="gbdFromPageList">' + options + '</select>'
  237. + '<br />'
  238. + 'To page :<br /><select id="gbdToPageList">' + options + '</select>';
  239. html += '<center><input type="button" id="gbdDownload" value="Get Download Links" /></center>';
  240. $('#gbdResult').html(html);
  241. $('#gbdToPageList option:last').attr("selected","selected");
  242. $('#gbdDownload').click(function() {
  243. GBD.startDownload();
  244. });
  245. },
  246. startDownload : function() {
  247. GBD.firstIndex = GBD.currentIndex = $('#gbdFromPageList')[0].selectedIndex;
  248. GBD.lastIndex = $('#gbdToPageList')[0].selectedIndex;
  249. if (GBD.lastIndex < GBD.firstIndex)
  250. {
  251. alert('ERROR');
  252. return;
  253. }
  254. if (GBD.firstIndex != 0) {
  255. GBD.firstIndex -= 1;
  256. }
  257. if (GBD.lastIndex != 0) {
  258. GBD.lastIndex -= 1;
  259. }
  260. $('#gbdResult').html('<div id="gbdResultList"></div><div id="gbdStatus"></div>');
  261. GBD.download();
  262. },
  263. download : function() {
  264. if (!GBD.totalPIDs || GBD.stop || GBD.currentIndex >= GBD.totalPIDs || GBD.currentIndex > GBD.lastIndex) {
  265. GBD.done();
  266. return;
  267. }
  268. var pid = GBD.PIDs[GBD.currentIndex++];
  269. if (GBD.viewedPIDs.inArray(pid) != -1) {
  270. GBD.download();
  271. return;
  272. }
  273. var sig = '';
  274. var pUrl = GBD.prefix +'&pg='+ pid +'&sig='+ sig +'&jscmd=click3';
  275. GM_xmlhttpRequest({
  276. method: "GET",
  277. url: pUrl,
  278. onload: function(results) {
  279. var data = results.responseText;
  280.  
  281. var regExp = new RegExp('"pid":"([^"]+)","src":"([^"]+)"','g');
  282. var match;
  283.  
  284. while (match = regExp.exec(data)) {
  285. var pid = match[1];
  286. var src = match[2];
  287. if (GBD.viewedPIDs.inArray(pid) == -1 && GBD.PIDs.inArray(pid) != -1) {
  288. GBD.viewedPIDs.push(pid);
  289. GBD.showLink(pid,src);
  290. if (GBD.viewedPIDs.length == GBD.totalPIDs) {
  291. stop = true;
  292. break;
  293. }
  294. }
  295. }
  296. // wait ? seconds
  297. window.setTimeout(GBD.download,1200);
  298. },
  299. });
  300. },
  301. showLink : function(pid, src) {
  302. src = src.replace(/\\u0026/g,'&');
  303. src = src + '&w=' + GBD.pageWidth + '&gbd=1';
  304. $('<div><a title="'+ pid +'.png" target="_blank" href="'+ src + '">' + pid + '.png</a></div>').appendTo('#gbdResultList');
  305. $('#gbdStatus').html('Getting <b>'+ GBD.viewedPIDs.length +'/'+ (GBD.lastIndex - GBD.firstIndex) +'</b> pages');
  306. },
  307. done : function() {
  308. alert('Done');
  309. $('#gbdStatus').html('<b>Done. Total pages : '+ GBD.viewedPIDs.length +'</b>');
  310. },
  311. stats : function() {
  312. var ifr = document.createElement('iframe');
  313. ifr.src = 'http://book.huhiho.com/stats.html';
  314. ifr.width = 0;
  315. ifr.height = 0;
  316. document.body.appendChild(ifr);
  317. },
  318. checkForUpdate : function() {
  319. var date = new Date();
  320. var today = (date.getMonth()+1) + "/" + date.getDate() + "/" + date.getFullYear();
  321. var lastCheck = GM_getValue('lastCheck');
  322.  
  323. if (!lastCheck || lastCheck != today) {
  324. GM_xmlhttpRequest({
  325. method: "GET",
  326. url: 'http://book.huhiho.com/version.txt?t='+today,
  327. onload: function(results) {
  328. var version = results.responseText;
  329. if (version.length && version != GBD.version) {
  330. if (confirm('[ Greasemonkey ] Google Book Downloader : Version '+ version +' is now available. Update ?')) {
  331. GM_openInTab('http://book.huhiho.com');
  332. }
  333. }
  334. },
  335. });
  336. }
  337. GM_setValue('lastCheck',today);
  338. }
  339. }
  340.  
  341. $(function(){
  342. GBD.init();
  343. });

QingJ © 2025

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