Sleazy Fork is available in English.

图集岛VIP中P(改)

VIP破解 + 单张下载 + 一键下载(批量单张下载)+ 打包下载 + Viwer预览(可以使用FancyBox但是不让发布不会js引用) + 简易收藏功能

  1. // ==UserScript==
  2. // @name 图集岛VIP中P(改)
  3. // @namespace http://tampermonkey.net/
  4. // @version 1.0.3
  5. // @description VIP破解 + 单张下载 + 一键下载(批量单张下载)+ 打包下载 + Viwer预览(可以使用FancyBox但是不让发布不会js引用) + 简易收藏功能
  6. // @author ss548
  7. // @include /https?:\/\/(\w+\.)?tujidao.\w+/
  8. // @icon https://yskhd.com/wp-content/themes/modown/static/img/smilies/rolleyes.png
  9. // @require https://lf6-cdn-tos.bytecdntp.com/cdn/expire-1-M/jszip/3.7.1/jszip.min.js
  10. // @require https://lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/FileSaver.js/2.0.5/FileSaver.min.js
  11. // @grant GM_xmlhttpRequest
  12. // @grant unsafeWindow
  13. // @grant GM_addStyle
  14. // @license MIT
  15. // ==/UserScript==
  16.  
  17. (function () {
  18. "use strict";
  19. GM_addStyle(".sc{position: absolute;top: 0;left: 0;background: #ebae12;border-radius: 50%;width: 35px;text-align: center;color: #FFF;z-index: 100;font-size: 13px;cursor: pointer;}");
  20. var locurl = window.location.href;
  21. var html1 =
  22. '<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><script type="text/javascript" src="https://www.tujidao02.com/Static/css/jquery.js"></script><script type="text/javascript" src="http://demo.jb51.net/js/viewerjs/js/js/viewer.js"></script><link rel="stylesheet" href="http://demo.jb51.net/js/viewerjs/js/css/viewer.css" type="text/css">' +
  23. "<style>img {vertical-align: top;text-align: center;}" +
  24. ".imgbox{margin-bottom:5px;position: relative;overflow: hidden;}" +
  25. ".imgbox img{max-width: 100%;cursor:pointer;}" +
  26. ".imgnum{cursor:pointer;position: absolute;left: 0px;top: 0px;background: rgba(255, 152, 0,0.5);z-index: 100;padding: 5px;color: #f9f9f9;border-radius: 0px;}" +
  27. ".btn-box{display:flex;justify-content: space-around;}" +
  28. ".btn{width:48%;cursor:pointer;background: rgba(255, 152, 0,0.8);z-index: 100;text-align: center;margin: 5px 0;padding: 10px 0px;color: #f9f9f9;border-radius: 2px;}" +
  29. "a:link{color:pink;}a:visited{color:purple;}" +
  30. ".contianer{column-count: 4;column-gap: 5px;margin:0;padding:0;}" +
  31. ".loading-box{width: 100%;height: 50px;display: none;align-items: center;position: absolute;top: 50px;left: 0;z-index: 999;}.loading{margin: 0 auto;width: 120px;height: 40px;line-height: 40px;color: #FFF;font-size: 17px;text-align: center;background: #1111119e;border-radius: 2px;}"+
  32. "</style></head>" +
  33. '<body bgcolor="#27282d"><div class="loading-box"><p class="loading">下载中...</p></div><ul id="images" align="center" class="contianer">';
  34. var pic_base =
  35. "<li class='imgbox'><div class='imgnum' onclick='download1({pic_id},{num})'>{imgnum} 下载"+
  36. "</div><img alt='{pic_id}_{num}.jpg' filename='{title}_{num}.jpg' data-original='https://tjg.gzhuibei.com/a/1/{pic_id}/{num}.jpg' src='https://tjg.gzhuibei.com/a/1/{pic_id}/{num}.jpg'></li>";
  37. var title = "";
  38. var flag = false;
  39. var layer = null;
  40. var toastMsg;
  41. layui.use('layer', function(){
  42. layer = layui.layer;
  43. });
  44. // 下载函数
  45. function download(pic_id,imageId) {
  46. //console.log('download')
  47. GM_xmlhttpRequest({
  48. method: "GET",
  49. url: `https://tjg.gzhuibei.com/a/1/${pic_id}/${imageId}.jpg`,
  50. headers: {
  51. referer: "https://www.tujidao02.com/"
  52. },
  53. responseType:"blob",
  54. onload: function(xhr) {
  55. var r = xhr.responseText,
  56. data = new Uint8Array(r.length),
  57. i = 0;
  58. while (i < r.length) {
  59. data[i] = r.charCodeAt(i);
  60. i++;
  61. }
  62. let blob = new Blob([data], {
  63. type: "image/jpeg"
  64. });
  65. var blobURL = window.URL.createObjectURL(blob);
  66. //console.log(blobURL)
  67. var downA = document.createElement("a");
  68. downA.href = blobURL;
  69. downA.setAttribute("download", document.title+`_${imageId}.jpg`);
  70. downA.click();
  71. window.URL.revokeObjectURL(blobURL);
  72. }
  73. })
  74. }
  75. // 一键下载函数
  76. function onekeydownload(pic_id,num) {
  77. for(let i=1;i<=num;i++){
  78. (function(j) {
  79. window.setTimeout(function(){
  80. download(pic_id,j);
  81. },100*i);
  82. })(i);
  83. }
  84. }
  85.  
  86.  
  87. //******新增打包下载点击
  88. function zipDown(){
  89. //批量下载
  90. if (!flag) {
  91. downloadPack();
  92. flag = true;
  93. } else {
  94. alert('下载中, 请耐心等待...\n点击确认继续下载');
  95. }
  96. }
  97. //******新增zip下载
  98. async function downloadPack() {
  99. console.log("start download...");
  100. $(".loading-box").css("display","flex");
  101. var start = performance.now();
  102.  
  103. var list = document.querySelectorAll('.imgbox>img');
  104. var title = document.title;
  105. var zip = new JSZip();
  106. for (const item of list) {
  107. var url = item.getAttribute('src');
  108. var filename = item.getAttribute('filename');
  109. //console.log(url,filename);
  110. const response = getFile(url);
  111. zip.file(filename, response);
  112.  
  113. }
  114.  
  115. zip.generateAsync({
  116. type: 'blob'
  117. }).then(function (content) {
  118. saveAs(content, title + '.zip');
  119. var end = performance.now();
  120. console.log('completed: ', `${(end - start) / 1000} ms`)
  121. $(".loading-box").css("display","none");
  122. });
  123. }
  124.  
  125. //******新增下载文件
  126. async function getFile(url) {
  127. return new Promise((resolve, reject) => {
  128. GM_xmlhttpRequest({
  129. method: "GET",
  130. url: url,
  131. headers: {
  132. referer: "https://" + window.location.host
  133. },
  134. responseType: "blob",
  135. onload: function (response) {
  136. resolve(response.response);
  137. },
  138. onerror: function (error) {
  139. reject(error);
  140. }
  141. });
  142. });
  143. }
  144.  
  145. // 打开新窗口展示图片
  146. var createnew = function (num, pic_id, tags) {
  147. var tagHtml = [];
  148. var last = tags.pop();
  149. var pic_new = pic_base.replaceAll("{pic_id}", pic_id).replaceAll('{title}', last.innerText);
  150. for (let t of tags) {
  151. tagHtml.push(t.outerHTML);
  152. }
  153. tagHtml.push(last.innerText);
  154. tagHtml =
  155. "<div style='color:white;font-size:25px'>" +
  156. tagHtml.join(" / ") + `<div class="btn-box"><div class='btn' onclick='download2(${pic_id},${num})'>一键下载</div><div onclick='zipDown()' class="btn">打包下载</div></div>`
  157. "</div>";
  158. var imgs = [];
  159. for (var i = 1; i <= num; i++) {
  160. imgs.push(
  161. pic_new.replaceAll("{num}", i).replace("{imgnum}", ` [${i}/${num}]`)
  162. );
  163. }
  164. let html = html1.replace("img_title", `${last.innerText} - ${num}P @ ${pic_id}`);
  165. html += imgs.join("\n");
  166. html += "</ul><script>const viewer = new Viewer(document.getElementById('images'),{inline: false,url: 'data-original',rotatable:false,scalable:false});</script>";
  167. //var w = window.open("https://www.tujidao02.com");
  168. var w = window.open(window.location.href);
  169. w.onload = () => {
  170. w.document.write('');
  171. w.document.write(tagHtml + html);
  172. w.document.title = last.innerText;
  173. w.document.close();
  174. };
  175. };
  176.  
  177. /**
  178. * 给已有的图片容器添加点击事件,移除原有跳转链接
  179. */
  180. function addEvent(list) {
  181. for (const li of list) {
  182. //console.log(li);
  183. addCollectAndRemoveDom(li);
  184.  
  185. //第一个a
  186. li.querySelector('img').onclick = function () {
  187. // 获取数量
  188. var num = li
  189. .querySelector("span.shuliang")
  190. .innerText.split("P")[0];
  191.  
  192. num = parseInt(num);
  193.  
  194. // id
  195. var aTag = li.querySelector("a");
  196. aTag.removeAttribute("href"); // 删除链接,防止跳转
  197. var id = li.querySelector(".biaoti a").getAttribute("href");
  198. id = id.split("id=")[1];
  199. //丢掉最后一个
  200. var tags = li.querySelectorAll("p>a");
  201. //console.log(tags);
  202. createnew(num, id, [...tags]);
  203. };
  204. }
  205. }
  206.  
  207. /**
  208. * 添加收藏与移除
  209. */
  210. function addCollectAndRemoveDom(li){
  211. let id = li.querySelector(".biaoti a").getAttribute("href");
  212. id = id.split("id=")[1];
  213. if(locurl.indexOf("shoucang")==-1){
  214. $(li).append('<p class="sc" style="height: 35px;line-height: 35px;">收藏</p>');
  215. li.querySelector('.sc').onclick = function (){
  216. let lii = li.cloneNode(true);
  217. let p_sl = lii.querySelector('p');
  218. if(p_sl.innerText.indexOf("收录")>-1){
  219. p_sl.remove();
  220. }
  221. let li_str = lii.outerHTML;
  222. collect(id, li_str);
  223. };
  224. }else{
  225. $(li).append('<p class="sc" style="height: 35px;line-height: 35px;">移除</p>');
  226. li.querySelector('.sc').onclick = function (){
  227. collectRemove(id);
  228. };
  229. }
  230. }
  231.  
  232. /**
  233. * 收藏
  234. */
  235. function collect(id, li_str){
  236. //console.log("id: ", id);
  237. //console.log("li: ",li_str);
  238. let list = localStorage.getItem("sclist");
  239. let obj = {
  240. "id": id,
  241. "li": li_str.replace('<p class="sc" style="height: 35px;line-height: 35px;">收藏</p>','')
  242. };
  243. let arr = [];
  244. if(list == null){
  245. //console.log("list不存在");
  246. arr.push(obj);
  247. localStorage.setItem("sclist",JSON.stringify(arr));
  248. }else{
  249. //console.log("list存在", JSON.parse(list));
  250. list = JSON.parse(list);
  251. for(let i=0; i<list.length; i++){
  252. if(id===list[i].id){
  253. layer.msg(id+"已收藏");
  254. if(i<list.length){
  255. return;
  256. }
  257. }
  258. if(i==list.length-1 && id != list[i].id){
  259. list.push(obj);
  260. localStorage.setItem("sclist",JSON.stringify(list));
  261. }
  262. }
  263. }
  264. }
  265. /**
  266. * 取消收藏
  267. */
  268. function collectRemove(id){
  269. let list = localStorage.getItem("sclist");
  270. list = JSON.parse(list);
  271. list.forEach((item,index,list) => {
  272. if(item.id === id){
  273. list.splice(index,1);
  274. }
  275. });
  276. localStorage.setItem("sclist",JSON.stringify(list));
  277. main();
  278. layer.msg(id+"已移除");
  279. }
  280.  
  281. /**
  282. * 获取收藏写入收藏页面
  283. */
  284. function getCollect(){
  285. if(locurl.indexOf("shoucang")>-1){
  286. $(".hezi ul").html("");
  287. let list = localStorage.getItem("sclist");
  288. if(list != null){
  289. list = JSON.parse(list);
  290. for(let item of list){
  291. $(".hezi ul").append(item.li);
  292. }
  293. }
  294. }
  295. }
  296.  
  297. /**
  298. * 获取当前页面的图片列表
  299. */
  300. function getLiList() {
  301. return document.querySelectorAll("div.hezi>ul>li");
  302. }
  303.  
  304. function main(){
  305. //console.log(locurl);
  306. if($(".unav")){
  307. let alist = $(".unav a");
  308. for(let i=0; i<alist.length; i++){
  309. //console.log(alist[i]);
  310. if(alist[i].innerText=='开通会员' || alist[i].innerText=='APP下载'){
  311. //console.log("success");
  312. alist[i].remove();
  313. }
  314. if(alist[i].innerText=='我的收藏'){
  315. alist[i].style.color = "#ffca00";
  316. }
  317. }
  318. }
  319. getCollect();
  320. addEvent(getLiList());
  321. }
  322. main();
  323.  
  324. if(!unsafeWindow.download1)
  325. {
  326. unsafeWindow.download1 = download;
  327. }
  328. if(!unsafeWindow.download2)
  329. {
  330. unsafeWindow.download2 = onekeydownload;
  331. }
  332. if(!unsafeWindow.zipDown)
  333. {
  334. unsafeWindow.zipDown = zipDown;
  335. }
  336.  
  337. var contentContainer = document.getElementById("search");
  338. var config = { childList: true, subtree: true };
  339. // 当观察到突变时执行的回调函数
  340. var callback = function (mutationsList) {
  341. mutationsList.forEach(function (item, index) {
  342. const { addedNodes } = item;
  343. addEvent(addedNodes);
  344. });
  345. };
  346.  
  347. // 创建一个链接到回调函数的观察者实例
  348. var observer = new MutationObserver(callback);
  349.  
  350. // 开始观察已配置突变的目标节点
  351. contentContainer && observer.observe(contentContainer, config);
  352.  
  353. })();