Advertisement
Guest User

t

a guest
Jul 22nd, 2016
45
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // ==UserScript==
  2. // @name        PixivUserBatchDownload
  3. // @name:zh-CN  P站画师个人作品批量下载工具
  4. // @namespace   http://www.mapaler.com/
  5. // @description Batch download pixiv user's images in one key.
  6. // @description:zh-CN   一键批量下载P站画师的全部作品
  7. // @include  http://www.pixiv.net/*
  8. // @exclude     http://www.pixiv.net/*mode=manga&illust_id*
  9. // @exclude     http://www.pixiv.net/*mode=big&illust_id*
  10. // @exclude     http://www.pixiv.net/*mode=manga_big*
  11. // @exclude     http://www.pixiv.net/*search.php*
  12. // @version  2.6.0
  13. // @grant      none
  14. // @copyright   2016+, Mapaler <mapaler@163.com>
  15. // @icon        http://www.pixiv.net/favicon.ico
  16. // ==/UserScript==
  17.  
  18. (function() {
  19. var pICD = 20; //pageIllustCountDefault默认每页作品数量
  20. var Version = 3; //当前设置版本,用于提醒是否需要
  21. if (!getConfig("PUBD_reset", -1))ResetConfig(); //新用户重置设置
  22. if (getConfig("PUBD_reset", 1) < Version)
  23. { //老用户提醒更改设置
  24.     alert("2.1.0版本可自定义下载网址了,可以按需修改。");
  25.     ResetConfig(true);
  26. }
  27.  
  28.  
  29. var download_mod = getConfig("PUBD_download_mode",1); //下载模式
  30. var illustPattern = "https?://([^/]+)/.+/(\\d{4})/(\\d{2})/(\\d{2})/(\\d{2})/(\\d{2})/(\\d{2})/((\\d+)(-[0-9a-zA-Z]+)?(?:_p\\d+|_ugoira\\d+x\\d+)?)(?:_\\w+)?\\.([\\w\\d]+)"; //P站图片地址正则匹配式
  31. //var userImagePattern = "https?://([^/]+)/.+/(\w+)/(\\d+)\\.([\\w\\d]+)"; //P站用户头像图片地址正则匹配式
  32.  
  33. var getPicNum = 0; //Ajax获取了文件的数量
  34. var downOver; //检测下载是否完成的循环函数
  35.  
  36. var dataset =
  37. {
  38.     user_id: 0, //作者ID
  39.     user_pixiv_id: "", //作者账户,可以从作者头像文件获取。
  40.     user_name: "", //作者昵称
  41.     user_head: "", //作者头像url。将来可考虑生成ico保存到文件夹
  42.     illust_count: 0, //作品总数
  43.     illust_file_count: 0, //作品文件总数(含多图)
  44.     illust:[
  45.     ]
  46. }
  47. function illust()
  48. {
  49.     var obj =
  50.     {
  51.         illust_id: 0, //作品ID
  52.         illust_page: 0, //在作者的第几页
  53.         illust_index: 0, //全部作品中序号
  54.         illust_index_inverted: 0, //全部作品中序号_倒序
  55.         illust_index_in_page: 0, //该页上序号
  56.         illust_index_in_page_inverted: 0, //该页上序号_倒序
  57.         title: "", //作品标题
  58.         type: 0, //类型,单页、漫画、动画
  59.         //type_name: "", //类型用文字表示
  60.         filename: [""], //文件名
  61.         hash: "", //加密字符串
  62.         //page: [0], //第几页(漫画)
  63.         extention: [""], //扩展名
  64.         original_src: [""], //原始图片链接
  65.         page_count: 0, //共几页(漫画)
  66.         year: 0,
  67.         month: 0,
  68.         day: 0,
  69.         hour: 0,
  70.         minute: 0,
  71.         second: 0,
  72.  
  73.         thumbnail_src: "", //缩略图地址
  74.         domain: "", //域名
  75.         url: "", //作品页面
  76.         time: "", //显示时间
  77.         size: "", //显示大小
  78.         width: 0, //宽
  79.         height: 0, //高
  80.         tools: [""], //使用工具
  81.         caption: "", //说明
  82.         tags: [""], //标签
  83.         //添加作品的顺序
  84.         addIndexFromPage: function (index, page, illcount)
  85.         {
  86.             if (index == undefined)
  87.                 index = this.illust_index_in_page;
  88.             else
  89.                 this.illust_index_in_page = index;
  90.             if (page == undefined)
  91.                 page = this.illust_page;
  92.             else
  93.                 this.illust_page = page;
  94.             if (illcount == undefined)
  95.                 illcount = dataset.illust_count;
  96.             this.illust_index = (this.illust_page - 1) * pICD + this.illust_index_in_page;
  97.             this.illust_index_inverted = illcount - this.illust_index + 1;
  98.             if ((illcount - this.illust_index) >= pICD)
  99.                 this.illust_index_in_page_inverted = pICD - index + 1;
  100.             else
  101.                 this.illust_index_in_page_inverted = illcount % pICD - index + 1;
  102.         },
  103.         //从图片地址添加作品
  104.         addDataFromImgSrc: function (src)
  105.         {
  106.             if (src == undefined)
  107.                 src = this.thumbnail_src;
  108.             var regSrc = new RegExp(illustPattern, "ig");
  109.             var aImg = regSrc.exec(src);
  110.             this.page_count = 1;
  111.             this.domain = aImg[1];
  112.             this.year = aImg[2];
  113.             this.month = aImg[3];
  114.             this.day = aImg[4];
  115.             this.hour = aImg[5];
  116.             this.minute = aImg[6];
  117.             this.second = aImg[7];
  118.             this.filename[0] = aImg[8];
  119.             this.illust_id = aImg[9];
  120.             this.hash = aImg[10];
  121.             this.extention[0] = aImg[11];
  122.             this.original_src[0] = "http://" + this.domain + "/img-original/img/" +
  123.                 this.year + "/" + this.month + "/" + this.day + "/" +
  124.                 this.hour + "/" + this.minute + "/" + this.second + "/" +
  125.                 this.filename[0] + "." + this.extention[0];
  126.             switch(this.type)
  127.             {
  128.                 case 0: //单图
  129.                     this.page_count = 1;
  130.                     getPicNum++;
  131.                     break;
  132.                 case 1: //多图
  133.                     var mangaUrl = this.url.replace(/mode=[^&]+/, "mode=manga");
  134.                     getSource(mangaUrl, dealMangaFast, this);
  135.                     break;
  136.                 case 2: //动图
  137.                     this.page_count = 1;
  138.                     this.filename[0] += "_ugoira1920x1080";
  139.                     this.extention[0] = "zip";
  140.                     this.original_src[0] = "http://" + this.domain + "/img-original/img/" +
  141.                         this.year + "/" + this.month + "/" + this.day + "/" +
  142.                         this.hour + "/" + this.minute + "/" + this.second + "/" +
  143.                         this.filename[0] + "." + this.extention[0];
  144.                     getPicNum++;
  145.                     break;
  146.                 case 3: //漫画单图
  147.                     this.page_count = 1;
  148.                     getPicNum++;
  149.                     break;
  150.                 default:
  151.             }
  152.         },
  153.         //ajax读取原始页面数据
  154.         ajaxLoad: function (url)
  155.         {
  156.             if (url == undefined)
  157.                 url = this.url;
  158.             else
  159.                 this.url = url;
  160.             if (this.illust_id < 1)
  161.             {
  162.                 var regSrc = /illust_id=(\d+)/ig;
  163.                 var iid = regSrc.exec(url);
  164.                 if (iid.length >= 2) this.illust_id = iid[1];
  165.             }
  166.             getSource(url, dealIllust, this);
  167.         },
  168.     }
  169.     return obj;
  170. }
  171.  
  172. var menuInsertPlace = document.getElementsByClassName("user-relation")[0];
  173. if (menuInsertPlace == undefined) return;
  174. var li1 = document.createElement("li");
  175. var li2 = document.createElement("li");
  176. menuInsertPlace.appendChild(li1);
  177. menuInsertPlace.appendChild(li2);
  178. li1.className = "ui-selectbox-container";
  179. li2.className = "infoProgress";
  180.  
  181. var menu_ul = buildMenu();
  182.  
  183. var btnStart = document.createElement("button");
  184. btnStart.className = "_button following";
  185. btnStart.innerHTML = "获取全部作品";
  186.  
  187. btnStart.onclick = function (e)
  188. {
  189.     if (menu_ul.parentNode == li1)
  190.         li1.removeChild(menu_ul);
  191.     else
  192.         li1.appendChild(menu_ul);
  193. }
  194. li1.appendChild(btnStart);
  195.  
  196. //生成设置窗口DOM
  197. var setInsertPlace = document.getElementsByClassName("column-header")[0] || document.body;
  198. var setWindow = buildSetting();
  199. //生成导出窗口DOM
  200. var exportInsertPlace = setInsertPlace;
  201. var exportWindow = buildExport();
  202. //生成直接链接窗口DOM
  203. var directLinkInsertPlace = setInsertPlace;
  204. var directLinkWindow = buildDirectLink();
  205.  
  206. //开始程序
  207. function startProgram(mode)
  208. {
  209.     download_mod = getConfig("PUBD_download_mode",1); //重新判断下载模式
  210.     if(getPicNum<1)
  211.     {
  212.         dealUserPage1();
  213.     }
  214.     clearInterval(downOver);
  215.     downOver = setInterval(function () { startProgramCheck(mode) }, 500);
  216. }
  217.  
  218. function dealUserPage1(userId)
  219. {
  220.     if (userId == undefined)
  221.         userId = pixiv.context.userId;
  222.     dataset.user_id = userId;
  223.  
  224.     var locationSearch = (document.location.search.length > 0 ? document.location.search.replace(/mode=\w+/ig, "").replace(/illust_id=\d+/ig, "").replace(/id=\d+/ig, "") : "?");
  225.     var linkPre = document.location.origin + "/member_illust.php" + locationSearch + "&id=" + userId;
  226.     var link = getPageSrc(linkPre, 1);
  227.  
  228.     getSource(link, dealUser, linkPre, userId)
  229. }
  230. //开始分析本作者
  231. function dealUser(response, linkPre, userId)
  232. {
  233.     var parser = new DOMParser();
  234.     PageDOM = parser.parseFromString(response, "text/html");
  235.  
  236.     var count_badge = PageDOM.getElementsByClassName("count-badge")[0];
  237.     if (!count_badge)
  238.     {
  239.         alert("未发现作品数DOM");
  240.         clearInterval(downOver);
  241.         return;
  242.     }
  243.  
  244.     var regPC = /(\d+)/ig;
  245.     var photoCount = regPC.exec(count_badge.textContent);
  246.  
  247.     if (photoCount.length >= 2) {
  248.         dataset.illust_count = parseInt(photoCount[1]);
  249.         if (dataset.illust_count < 1)
  250.         {
  251.             alert("作品数为0");
  252.             clearInterval(downOver);
  253.             return;
  254.         }
  255.         dataset.illust_file_count = dataset.illust_count;
  256.         var pageCount = Math.ceil(dataset.illust_count / 20);
  257.     }
  258.     else
  259.     {
  260.         alert("未发现作品数字符串");
  261.         clearInterval(downOver);
  262.         return;
  263.     }
  264.  
  265.     var user_link = PageDOM.getElementsByClassName("user-link")[0];
  266.     var user_dom = user_link.getElementsByClassName("user")[0];
  267.     dataset.user_name = user_dom.textContent;
  268.  
  269.     var userImage = PageDOM.getElementsByClassName("user-image")[0];
  270.     dataset.user_head = userImage?userImage.src:"";
  271.     var tabFeed = PageDOM.getElementsByClassName("tab-feed")[0];
  272.     var regUserFeed = /.+\/([\w\-]+)$/ig; //用户账户正则匹配式,您只可以输入小字母a-z, 数字, 英文破折号(-), 以及英文下划线( _ )
  273.     var regrlt = regUserFeed.exec(tabFeed?tabFeed.getAttribute("href"):"");
  274.     if (regrlt.length>1) dataset.user_pixiv_id = regrlt[1];
  275.  
  276.     dealPage(response, 1);
  277.     //列表页循环
  278.     for (pi = 2; pi <= pageCount; pi++)
  279.     //for (pi = 0; pi < 1; pi++)
  280.     {
  281.         var link = getPageSrc(linkPre, pi);
  282.         getSource(link, dealPage, pi);
  283.     }
  284.  
  285. }
  286.  
  287. //获取页面网址
  288. function getPageSrc(linkPre, page)
  289. {
  290.     return linkPre + "&p=" + page;
  291. }
  292.  
  293. //直接通过XMLHttpRequest对象获取远程网页源代码
  294. function getSource(url,callback,index, index2)
  295. {
  296.     var xhr = new XMLHttpRequest(); //创建XMLHttpRequest对象
  297.     xhr.onreadystatechange = function()  //设置回调函数
  298.     {
  299.         if (xhr.readyState == 4 && xhr.status == 200)
  300.             callback(xhr.responseText, index, index2);
  301.     }
  302.     xhr.open("GET", url, true);
  303.     xhr.send(null);
  304.     return xhr.responseText;
  305. }
  306. //处理列表页面的回调函数
  307. function dealPage(response, pageIndex)
  308. {
  309.     /*
  310.     老式构建网页dom方法
  311.     var PageDOM = document.createElement("div"); //创建一个容器
  312.     PageDOM.innerHTML = response; //插入代码
  313.     */
  314.  
  315.     var parser = new DOMParser();
  316.     PageDOM = parser.parseFromString(response, "text/html");
  317.  
  318.     var _image_items = PageDOM.getElementsByClassName("_image-items");
  319.     if (_image_items.length >= 0)
  320.     {
  321.         var image_items = _image_items[0].getElementsByClassName("image-item");
  322.         //作品循环
  323.         for (ii = 0; ii < image_items.length; ii++)
  324.         //for (ii = 6; ii <= 6; ii++)
  325.         {
  326.             var _thumbnail = image_items[ii].getElementsByClassName("_thumbnail")[0];
  327.             var title = image_items[ii].getElementsByClassName("title")[0];
  328.             var link = image_items[ii].getElementsByTagName("a");
  329.  
  330.             var ill = new illust;
  331.             if (link[0].href.length < 1)
  332.             {
  333.                 console.warn("你的浏览器无法获取DOMParser内a标签的href。目前只有Chrome这么做。")
  334.                 ill.url = document.location.origin + link[0].getAttribute("href");
  335.             }
  336.             else
  337.             {
  338.                 ill.url = link[0].href;
  339.             }
  340.             ill.title = title.textContent;
  341.             ill.addIndexFromPage(ii + 1, pageIndex, dataset.illust_count);
  342.             ill.thumbnail_src = _thumbnail.src;
  343.  
  344.             if (image_items[ii].getElementsByClassName("ugoku-illust").length > 0)
  345.                 ill.type = 2;
  346.             else if (image_items[ii].getElementsByClassName("multiple").length > 0)
  347.                 ill.type = 1;
  348.             else if (image_items[ii].getElementsByClassName("manga").length > 0)
  349.                 ill.type = 3;
  350.             else
  351.                 ill.type = 0;
  352.  
  353.             if (download_mod == 1)
  354.             {
  355.                 ill.addDataFromImgSrc(ill.thumbnail_src);
  356.             }
  357.             else
  358.             {
  359.                 ill.ajaxLoad();
  360.             }
  361.             dataset.illust.push(ill);
  362.         }
  363.     }
  364. }
  365.  
  366. //处理作品的回调函数
  367. function dealIllust(response, ill)
  368. {
  369.     //var regSrc = /https?:\/\/([^\/]+)\/.+\/(\d{4})\/(\d{2})\/(\d{2})\/(\d{2})\/(\d{2})\/(\d{2})\/((\d+)(?:[\-_][\w\d\-]+)?)\.([\w\d]+)/ig; //P站图片命名规则
  370.     var regSrc = new RegExp(illustPattern, "ig");
  371.     var parser = new DOMParser();
  372.     PageDOM = parser.parseFromString(response, "text/html");
  373.     //work_info
  374.     var work_info = PageDOM.getElementsByClassName("work-info")[0];
  375.     var works_display = PageDOM.getElementsByClassName("works_display")[0];
  376.     //var title = work_info.getElementsByClassName("title")[0];
  377.     //ill.title = title.textContent;
  378.     var caption = work_info.getElementsByClassName("caption")[0];
  379.     if (caption) ill.caption = caption.textContent;
  380.     //metas
  381.     var metas = work_info.getElementsByClassName("meta")[0];
  382.     var meta = metas.getElementsByTagName("li");
  383.     ill.time = meta[0].textContent;
  384.     ill.size = meta[1].textContent;
  385.     var tools = metas.getElementsByClassName("tools")[0]
  386.     if (tools)
  387.     {
  388.         var toolsli = tools.getElementsByTagName("li");
  389.         for (ti = 0; ti < toolsli.length; ti++)
  390.         {
  391.             ill.tools[ti] = toolsli[ti].textContent;
  392.  
  393.         }
  394.     }
  395.     //TAG
  396.     var tagsDom = PageDOM.getElementsByClassName("work-tags")[0].getElementsByClassName("tags-container")[0].getElementsByClassName("tags");
  397.     if (tagsDom.length > 0)
  398.     {
  399.         var tags = tagsDom[0].getElementsByClassName("tag");
  400.         for (ti = 0; ti < tags.length; ti++)
  401.         {
  402.             ill.tags[ti] = tags[ti].getElementsByClassName("text")[0].textContent;
  403.         }
  404.     }
  405.  
  406.  
  407.     var script = PageDOM.getElementById("wrapper").getElementsByTagName("script")[0];
  408.     //建立内部临时变量,避免影响到原始页面
  409.     var pixiv = new Object; pixiv.context = new Object;
  410.     //执行获取到的代码
  411.     eval(script.innerHTML);
  412.     ill.illust_id = pixiv.context.illustId;
  413.     ill.width = pixiv.context.illustSize[0];
  414.     ill.height = pixiv.context.illustSize[1];
  415.     ill.title = pixiv.context.illustTitle;
  416.     //dataset.user_name = pixiv.context.userName;
  417.     //添加静图
  418.     if (PageDOM.getElementsByClassName("original-image")[0]) {//静图
  419.         var originalImage = PageDOM.getElementsByClassName("original-image")[0].getAttribute("data-src");
  420.         ill.page_count = 1;
  421.         ill.type = 0;
  422.         ill.original_src[0] = originalImage;
  423.         var aImg = regSrc.exec(originalImage);
  424.         if (aImg.length >= 1)
  425.         {
  426.             ill.domain = aImg[1];
  427.             ill.year = aImg[2];
  428.             ill.month = aImg[3];
  429.             ill.day = aImg[4];
  430.             ill.hour = aImg[5];
  431.             ill.minute = aImg[6];
  432.             ill.second = aImg[7];
  433.             ill.filename[0] = aImg[8];
  434.             ill.hash = aImg[10];
  435.             ill.extention[0] = aImg[11];
  436.             getPicNum++;
  437.         }else
  438.         {
  439.             alert("获取单图原始图片路径信息失败,可能需要更新正则匹配模式。");
  440.  
  441.         }
  442.     }
  443.     //添加动图
  444.     else if (PageDOM.getElementsByClassName("_ugoku-illust-player-container").length > 0)
  445.     {
  446.         var zipUrl = pixiv.context.ugokuIllustFullscreenData.src;
  447.         ill.page_count = pixiv.context.ugokuIllustFullscreenData.frames.length;
  448.         ill.type = 2;
  449.         ill.original_src[0] = zipUrl;
  450.         var aImg = regSrc.exec(zipUrl);
  451.         if (aImg.length >= 1) {
  452.             ill.domain = aImg[1];
  453.             ill.year = aImg[2];
  454.             ill.month = aImg[3];
  455.             ill.day = aImg[4];
  456.             ill.hour = aImg[5];
  457.             ill.minute = aImg[6];
  458.             ill.second = aImg[7];
  459.             ill.filename[0] = aImg[8];
  460.             ill.hash = aImg[10];
  461.             ill.extention[0] = aImg[11];
  462.             getPicNum++;
  463.         } else {
  464.             alert("获取动图原始图片路径信息失败,可能需要更新正则匹配模式。");
  465.         }
  466.     }
  467.     //添加多图
  468.     else if (PageDOM.getElementsByClassName("multiple").length > 0)
  469.     {
  470.         ill.type = 1;
  471.         var aImg = regSrc.exec(ill.thumbnail_src);
  472.         if (aImg.length >= 1) {
  473.             ill.domain = aImg[1];
  474.             ill.year = aImg[2];
  475.             ill.month = aImg[3];
  476.             ill.day = aImg[4];
  477.             ill.hour = aImg[5];
  478.             ill.minute = aImg[6];
  479.             ill.second = aImg[7];
  480.             ill.filename[0] = aImg[8];
  481.             ill.hash = aImg[10];
  482.             ill.extention[0] = aImg[11];
  483.         }
  484.  
  485.         var regPageCont = /.+\s+(\d+)[pP]/ig;
  486.         var rs = regPageCont.exec(ill.size);
  487.         if (rs.length >= 2)
  488.         {
  489.             ill.page_count = parseInt(rs[1]);
  490.             console.info("%s为多图,存在%d张", ill.illust_id, ill.page_count);
  491.             dataset.illust_file_count += ill.page_count - 1; //图片总数里增加多图的张数
  492.            
  493.             var manga_big = ill.url.replace(/mode=[^&]+/, "mode=manga_big");
  494.             var manga_big_url = manga_big + "&page=" + 0;
  495.             getSource(manga_big_url, dealManga, ill);
  496.            
  497.             /*以前以为能够多图扩展名不一样
  498.             for (var pi = 0; pi < ill.page_count; pi++) {
  499.                 var manga_big_url = manga_big + "&page=" + pi;
  500.                 getSource(manga_big_url, dealManga, ill, pi);
  501.             }
  502.             */
  503.         }
  504.         else
  505.         {
  506.             alert("获取多图总张数失败");
  507.         }
  508.     }
  509.     //添加漫画
  510.     else if (works_display.getElementsByClassName("manga").length > 0)
  511.     {
  512.         //因为Ajax无法设置Referer,而Mode=big无Referer会跳转回作品信息页面,因此这里只能用现有信息来猜
  513.         var thumbnailImage = works_display.getElementsByClassName("_layout-thumbnail")[0].getElementsByTagName("img")[0];
  514.         ill.page_count = 1;
  515.         ill.type = 3;
  516.         console.info("%s此图为漫画单图,下面开始获取扩展名。", ill.illust_id);
  517.  
  518.         addFrm(ill);
  519.     }
  520.     else
  521.     {
  522.         alert("未知的作品类型。作品ID:" + ill.illust_id);
  523.     }
  524. }
  525. //
  526. function addFrm(ill)
  527. {
  528.     var ifrm = document.createElement("iframe");
  529.     ifrm.name = "medium_" + ill.illust_id;
  530.     ifrm.src = ill.url;
  531.     ifrm.style.display = "none";
  532.     if (ifrm.attachEvent)
  533.     {
  534.         ifrm.attachEvent('onload', function () { addBig(self.frames["medium_" + ill.illust_id], ill); });
  535.     } else
  536.     {
  537.         ifrm.onload = function () { addBig(self.frames["medium_" + ill.illust_id], ill); };
  538.     }
  539.     document.body.appendChild(ifrm);
  540. }
  541. function addBig(prt,ill)
  542. {
  543.     var ifrm = prt.document.createElement("iframe");
  544.     ifrm.name = "big_" + ill.illust_id;
  545.     ifrm.src = prt.document.getElementsByClassName("works_display")[0].getElementsByClassName("_work")[0].href;
  546.     if (ifrm.attachEvent)
  547.     {
  548.         ifrm.attachEvent('onload', function ()
  549.         {
  550.             findBig(prt.frames["big_" + ill.illust_id], ill);
  551.         });
  552.     } else
  553.     {
  554.         ifrm.onload = function ()
  555.         {
  556.             findBig(prt.frames["big_" + ill.illust_id], ill);
  557.         };
  558.     }
  559.     prt.document.body.appendChild(ifrm);
  560. }
  561. function findBig(prt, ill)
  562. {
  563.     var finnaly_pic = prt.document.getElementsByTagName("img")[0].src;
  564.     ill.original_src[0] = finnaly_pic;
  565.  
  566.     var regSrc = new RegExp(illustPattern, "ig");
  567.     var aImg = regSrc.exec(ill.original_src[0]);
  568.  
  569.     if (aImg.length >= 1)
  570.     {
  571.         ill.domain = aImg[1];
  572.         ill.year = aImg[2];
  573.         ill.month = aImg[3];
  574.         ill.day = aImg[4];
  575.         ill.hour = aImg[5];
  576.         ill.minute = aImg[6];
  577.         ill.second = aImg[7];
  578.         ill.filename[0] = aImg[8];
  579.         ill.hash = aImg[10];
  580.         ill.extention[0] = aImg[11];
  581.  
  582.         getPicNum++;
  583.         console.info("%s为漫画单图,扩展名为%s", ill.illust_id, ill.extention[0]);
  584.     } else
  585.     {
  586.         alert("获取漫画单图原始图片路径信息失败,可能需要更新正则匹配模式。");
  587.  
  588.     }
  589.  
  590.     return finnaly_pic;
  591. }
  592. //处理多图的回调函数
  593. function dealManga(response, ill, index)
  594. {
  595.     var parser = new DOMParser();
  596.     PageDOM = parser.parseFromString(response, "text/html");
  597.     var picture = PageDOM.getElementsByTagName("img")[0];
  598.     ill.original_src[0] = picture.src;
  599.     //var regSrc = /https?:\/\/([^\/]+)\/.+\/(\d{4})\/(\d{2})\/(\d{2})\/(\d{2})\/(\d{2})\/(\d{2})\/((\d+)(?:[\-_][\w\d\-]+)?)\.([\w\d]+)/ig; //P站图片命名规则
  600.     var regSrc = new RegExp(illustPattern, "ig");
  601.     var aImg = regSrc.exec(picture.src);
  602.     if (aImg.length >= 1)
  603.     {
  604.         ill.domain = aImg[1];
  605.         ill.year = aImg[2];
  606.         ill.month = aImg[3];
  607.         ill.day = aImg[4];
  608.         ill.hour = aImg[5];
  609.         ill.minute = aImg[6];
  610.         ill.second = aImg[7];
  611.         ill.filename[0] = aImg[8];
  612.         ill.hash = aImg[10];
  613.         ill.extention[0] = aImg[11];
  614.         getPicNum++;
  615.     } else
  616.     {
  617.         alert("获取多图原始图片信息失败,可能需要更新正则匹配模式。");
  618.     }
  619.    
  620.     for (var mpi = 1; mpi < ill.page_count; mpi++)
  621.     {
  622.         ill.filename[mpi] = ill.filename[0].replace(/_p\d+$/ig, "_p" + mpi);
  623.         ill.extention[mpi] = ill.extention[0];
  624.         ill.original_src[mpi] = ill.original_src[0].replace(ill.filename[0], ill.filename[mpi]);
  625.         getPicNum++;
  626.     }
  627. }
  628.  
  629. //快速模式处理多图的回调函数
  630. function dealMangaFast(response, ill, index)
  631. {
  632.     var parser = new DOMParser();
  633.     PageDOM = parser.parseFromString(response, "text/html");
  634.  
  635.     var mangaSec = PageDOM.getElementsByClassName("manga")[0];
  636.     var items = mangaSec.getElementsByClassName("item-container");
  637.  
  638.     ill.page_count = items.length;
  639.     console.info("%s为多图,存在%d张", ill.illust_id, ill.page_count);
  640.  
  641.     dataset.illust_file_count += ill.page_count - 1;
  642.     getPicNum++;
  643.     for (var mpi = 1; mpi < ill.page_count; mpi++)
  644.     {
  645.         ill.filename[mpi] = ill.filename[0].replace(/_p\d+$/ig, "_p" + mpi);
  646.         ill.extention[mpi] = ill.extention[0];
  647.         ill.original_src[mpi] = ill.original_src[0].replace(ill.filename[0], ill.filename[mpi]);
  648.         getPicNum++;
  649.     }
  650.  
  651. }
  652. var ARIA2 = (function () {
  653.     var jsonrpc_version = '2.0';
  654.  
  655.     function get_auth(url) {
  656.         return url.match(/^(?:(?![^:@]+:[^:@\/]*@)[^:\/?#.]+:)?(?:\/\/)?(?:([^:@]*(?::[^:@]*)?)?@)?/)[1];
  657.     };
  658.  
  659.     function request(jsonrpc_path, method, params, getVersion) {
  660.         var xhr = new XMLHttpRequest();
  661.         var auth = get_auth(jsonrpc_path);
  662.         jsonrpc_path = jsonrpc_path.replace(/^((?![^:@]+:[^:@\/]*@)[^:\/?#.]+:)?(\/\/)?(?:(?:[^:@]*(?::[^:@]*)?)?@)?(.*)/, '$1$2$3'); // auth string not allowed in url for firefox
  663.  
  664.         var request_obj = {
  665.             jsonrpc: jsonrpc_version,
  666.             method: method,
  667.             id: getVersion ? "1" : (new Date()).getTime().toString(),
  668.         };
  669.         if (params) request_obj['params'] = params;
  670.         if (auth && auth.indexOf('token:') == 0) params.unshift(auth);
  671.  
  672.         xhr.open("POST", jsonrpc_path + "?tm=" + (new Date()).getTime().toString(), true);
  673.         xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
  674.         if (auth && auth.indexOf('token:') != 0) {
  675.             xhr.setRequestHeader("Authorization", "Basic " + btoa(auth));
  676.         }
  677.         xhr.send(JSON.stringify(request_obj));
  678.         if (getVersion) {
  679.             xhr.onreadystatechange = function ()  //设置回调函数
  680.             {
  681.                 if (xhr.readyState == 4 && xhr.status == 200)
  682.                 {
  683.                     var JSONreq = JSON.parse(xhr.responseText);
  684.                     document.getElementsByName("PUBD_PRC_path_check")[0].innerHTML="发现Aria2 ver" + JSONreq.result.version;
  685.                 }
  686.                 else if (xhr.readyState == 4 && xhr.status != 200)
  687.                     document.getElementsByName("PUBD_PRC_path_check")[0].innerHTML="Aria2连接失败";
  688.             }
  689.         }
  690.     };
  691.  
  692.     return function (jsonrpc_path) {
  693.         this.jsonrpc_path = jsonrpc_path;
  694.         this.addUri = function (uri, options) {
  695.             request(this.jsonrpc_path, 'aria2.addUri', [[uri, ], options]);
  696.         };
  697.         this.getVersion = function () {
  698.             request(this.jsonrpc_path, 'aria2.getVersion', [], true);
  699.         };
  700.         return this;
  701.     }
  702. })();
  703. //生成菜单
  704. function buildMenu()
  705. {
  706.     var menu_ul = document.createElement("ul");
  707.     menu_ul.className = "items";
  708.     //menu_ul.style.display = "none";
  709.     menu_ul.style.display = "block";
  710.     var li = document.createElement("li");
  711.     var a = document.createElement("a");
  712.     a.className = "item";
  713.     a.innerHTML = "Aria2 RPC";
  714.     a.onclick = function () { startProgram(0); li1.removeChild(menu_ul); };
  715.     li.appendChild(a);
  716.     menu_ul.appendChild(li);
  717.     var li = document.createElement("li");
  718.     var a = document.createElement("a");
  719.     a.className = "item";
  720.     a.innerHTML = "导出下载文件";
  721.     a.onclick = function ()
  722.     {
  723.         if (exportWindow.parentNode != exportInsertPlace)
  724.             exportInsertPlace.appendChild(exportWindow);
  725.         li1.removeChild(menu_ul);
  726.         startProgram(1);
  727.     };
  728.     li.appendChild(a);
  729.     menu_ul.appendChild(li);
  730.     var li = document.createElement("li");
  731.     var a = document.createElement("a");
  732.     a.className = "item";
  733.     a.innerHTML = "生成直接链接";
  734.     a.onclick = function ()
  735.     {
  736.         if (directLinkWindow.parentNode != directLinkInsertPlace)
  737.             exportInsertPlace.appendChild(directLinkWindow);
  738.         li1.removeChild(menu_ul);
  739.         startProgram(2);
  740.     };
  741.     li.appendChild(a);
  742.     menu_ul.appendChild(li);
  743.     var li = document.createElement("li");
  744.     li.className = "separated";
  745.     var a = document.createElement("a");
  746.     a.className = "item";
  747.     a.innerHTML = "设置";
  748.     a.onclick = function ()
  749.     {
  750.         if (setWindow.parentNode != setInsertPlace)
  751.             setInsertPlace.appendChild(setWindow);
  752.         li1.removeChild(menu_ul);
  753.     }
  754.     li.appendChild(a);
  755.     menu_ul.appendChild(li);
  756.     return menu_ul;
  757. }
  758. function buildSetting()
  759. {
  760.     var set = document.createElement("div");
  761.     set.id = "PixivUserBatchDownloadSetting";
  762.     set.className = "notification-popup";
  763.     set.style.display = "block";
  764.     //自定义CSS
  765.     var style = document.createElement("style");
  766.     set.appendChild(style);
  767.     style.type = "text/css";
  768.     style.innerHTML +=
  769.         [
  770.             ".PUBD_type_name" + "{\r\n" + [
  771.                 'width:120px',
  772.             ].join(';\r\n') + "\r\n}",
  773.             ".PUBD_PRC_path" + "{\r\n" + [
  774.                 'width:180px' ,
  775.             ].join(';') + "\r\n}",
  776.             ".PUBD_save_dir,.PUBD_save_path,.PUBD_multiple_mask,.PUBD_image_src,.PUBD_referer" + "{\r\n" + [
  777.                 'width:340px' ,
  778.             ].join(';') + "\r\n}",
  779.             "#PixivUserBatchDownloadSetting .thread" + "{\r\n" + [
  780.                 'margin:0',
  781.                 'padding-left:5px',
  782.             ].join(';') + "\r\n}",
  783.             "#PixivUserBatchDownloadSetting .type_name" + "{\r\n" + [
  784.                 'height:60px',
  785.             ].join(';') + "\r\n}",
  786.             "#PixivUserBatchDownloadSetting .text" + "{\r\n" + [
  787.                 'height:4em',
  788.                 'margin-right:0',
  789.             ].join(';') + "\r\n}",
  790.         ].join('\r\n');
  791.  
  792.  
  793.     //标题行
  794.     var h2 = document.createElement("h2");
  795.     h2.innerHTML = "Pixiv画师作品批量获取工具" + (typeof (GM_info) != "undefined" ? " v" + GM_info.script.version : "");
  796.     h2.appendChild(document.createElement("br"));
  797.     var a = document.createElement("a");
  798.     a.style.color = "red";
  799.     a.href = "https://github.com/Mapaler/PixivUserBatchDownload/tree/develop";
  800.     a.target = "_blank";
  801.     a.innerHTML = "试用3.0,提供反馈,参与开发";
  802.     h2.appendChild(a);
  803.  
  804.     var a = document.createElement("a");
  805.     a.className = "_official-badge";
  806.     a.innerHTML = "设置说明";
  807.     a.href = "https://github.com/Mapaler/PixivUserBatchDownload/blob/master/README.md";
  808.     a.target = "_blank";
  809.     h2.appendChild(a);
  810.     //设置内容
  811.     var ul = document.createElement("ul");
  812.     ul.className = "notification-list message-thread-list";
  813.    
  814.     //设置-模式
  815.     var li = document.createElement("li");
  816.     li.className = "thread download_mode";
  817.     var divTime = document.createElement("div");
  818.     divTime.className = "time date";
  819.     var divName = document.createElement("div");
  820.     divName.className = "name";
  821.     var divText = document.createElement("div");
  822.     divText.className = "text";
  823.     li.appendChild(divTime);
  824.     li.appendChild(divName);
  825.     li.appendChild(divText);
  826.     ul.appendChild(li);
  827.  
  828.     divName.innerHTML = "分析模式";
  829.     divTime.innerHTML = "选择是否获得文件的准确扩展名"
  830.  
  831.     var lbl = document.createElement("label");
  832.     var ipt = document.createElement("input");
  833.     ipt.type = "radio";
  834.     ipt.value = 0;
  835.     if (download_mod == ipt.value) ipt.setAttribute('checked', 'true');
  836.     ipt.name = "PUBD_download_mode";
  837.     lbl.appendChild(ipt);
  838.     lbl.innerHTML += "准确模式(分析扩展名)";
  839.     divText.appendChild(lbl);
  840.     var lbl = document.createElement("label");
  841.     var ipt = document.createElement("input");
  842.     ipt.type = "radio";
  843.     ipt.value = 1;
  844.     if (download_mod == ipt.value) ipt.setAttribute('checked', 'true');
  845.     ipt.name = "PUBD_download_mode";
  846.     lbl.appendChild(ipt);
  847.     lbl.innerHTML += "快速模式(直接生成3种可能的扩展名,无法获取作品介绍)";
  848.     divText.appendChild(lbl);
  849.  
  850.     //设置-RPC Path
  851.     var li = document.createElement("li");
  852.     li.className = "thread";
  853.     var divTime = document.createElement("div");
  854.     divTime.className = "time date";
  855.     var divName = document.createElement("div");
  856.     divName.className = "name";
  857.     var divText = document.createElement("div");
  858.     divText.className = "text";
  859.     li.appendChild(divTime);
  860.     li.appendChild(divName);
  861.     li.appendChild(divText);
  862.     ul.appendChild(li);
  863.  
  864.     divName.innerHTML = "Aria2 JSON-RPC Path";
  865.     divTime.innerHTML = "填写Aria2 JSON-RPC地址"
  866.     var ipt = document.createElement("input");
  867.     ipt.type = "text";
  868.     ipt.className = "PUBD_PRC_path";
  869.     ipt.name = "PUBD_PRC_path";
  870.     ipt.value = getConfig("PUBD_PRC_path");
  871.     divText.appendChild(ipt);
  872.     var btnCheckLink = document.createElement("button");
  873.     btnCheckLink.className = "_button";
  874.     btnCheckLink.name = "PUBD_PRC_path_check";
  875.     btnCheckLink.innerHTML = "检测地址";
  876.     btnCheckLink.onclick = function ()
  877.     {
  878.         this.innerHTML = "正在连接...";
  879.         var aria2 = new ARIA2(document.getElementsByName("PUBD_PRC_path")[0].value);
  880.         aria2.getVersion();
  881.     }
  882.     divText.appendChild(btnCheckLink);
  883.     //设置-下载目录
  884.     var li = document.createElement("li");
  885.     li.className = "thread";
  886.     var divTime = document.createElement("div");
  887.     divTime.className = "time date";
  888.     var divName = document.createElement("div");
  889.     divName.className = "name";
  890.     var divText = document.createElement("div");
  891.     divText.className = "text";
  892.     li.appendChild(divTime);
  893.     li.appendChild(divName);
  894.     li.appendChild(divText);
  895.     ul.appendChild(li);
  896.  
  897.     divName.innerHTML = "下载目录";
  898.     divTime.innerHTML = "下载主目录绝对路径,留空使用Aria2默认路径"
  899.     var ipt = document.createElement("input");
  900.     ipt.type = "text";
  901.     ipt.className = "PUBD_save_dir";
  902.     ipt.name = "PUBD_save_dir";
  903.     ipt.value = getConfig("PUBD_save_dir");
  904.     divText.appendChild(ipt);
  905.     //设置-图片网址
  906.     var li = document.createElement("li");
  907.     li.className = "thread";
  908.     var divTime = document.createElement("div");
  909.     divTime.className = "time date";
  910.     var divName = document.createElement("div");
  911.     divName.className = "name";
  912.     var divText = document.createElement("div");
  913.     divText.className = "text";
  914.     li.appendChild(divTime);
  915.     li.appendChild(divName);
  916.     li.appendChild(divText);
  917.     ul.appendChild(li);
  918.  
  919.     divName.innerHTML = "图片网址";
  920.     divTime.innerHTML = "下载的图片文件地址"
  921.     var ipt = document.createElement("input");
  922.     ipt.type = "text";
  923.     ipt.className = "PUBD_image_src";
  924.     ipt.name = "PUBD_image_src";
  925.     ipt.value = getConfig("PUBD_image_src");
  926.     divText.appendChild(ipt);
  927.     //设置-下载路径
  928.     var li = document.createElement("li");
  929.     li.className = "thread";
  930.     var divTime = document.createElement("div");
  931.     divTime.className = "time date";
  932.     var divName = document.createElement("div");
  933.     divName.className = "name";
  934.     var divText = document.createElement("div");
  935.     divText.className = "text";
  936.     li.appendChild(divTime);
  937.     li.appendChild(divName);
  938.     li.appendChild(divText);
  939.     ul.appendChild(li);
  940.  
  941.     divName.innerHTML = "保存路径";
  942.     divTime.innerHTML = "分组保存的文件夹和文件名"
  943.     var ipt = document.createElement("input");
  944.     ipt.type = "text";
  945.     ipt.className = "PUBD_save_path";
  946.     ipt.name = "PUBD_save_path";
  947.     ipt.value = getConfig("PUBD_save_path");
  948.     divText.appendChild(ipt);
  949.     //设置-referer(引用)地址
  950.     var li = document.createElement("li");
  951.     li.className = "thread";
  952.     var divTime = document.createElement("div");
  953.     divTime.className = "time date";
  954.     var divName = document.createElement("div");
  955.     divName.className = "name";
  956.     var divText = document.createElement("div");
  957.     divText.className = "text";
  958.     li.appendChild(divTime);
  959.     li.appendChild(divName);
  960.     li.appendChild(divText);
  961.     ul.appendChild(li);
  962.  
  963.     divName.innerHTML = "引用页面";
  964.     divTime.innerHTML = "Referer,访问来源页面地址"
  965.     var ipt = document.createElement("input");
  966.     ipt.type = "text";
  967.     ipt.className = "PUBD_referer";
  968.     ipt.name = "PUBD_referer";
  969.     ipt.value = getConfig("PUBD_referer");
  970.     divText.appendChild(ipt);
  971.     //设置-类型命名
  972.     var li = document.createElement("li");
  973.     li.className = "thread type_name";
  974.     var divTime = document.createElement("div");
  975.     divTime.className = "time date";
  976.     var divName = document.createElement("div");
  977.     divName.className = "name";
  978.     var divText = document.createElement("div");
  979.     divText.className = "text";
  980.     li.appendChild(divTime);
  981.     li.appendChild(divName);
  982.     li.appendChild(divText);
  983.     ul.appendChild(li);
  984.  
  985.     divName.innerHTML = "类型命名";
  986.     divTime.innerHTML = "%{type_name}的内容"
  987.  
  988.     var lbl = document.createElement("label");
  989.     lbl.innerHTML = "单图:";
  990.     var ipt = document.createElement("input");
  991.     ipt.type = "text";
  992.     ipt.className = "PUBD_type_name";
  993.     ipt.name = "PUBD_type_name0";
  994.     ipt.value = getConfig("PUBD_type_name0");
  995.     lbl.appendChild(ipt);
  996.     divText.appendChild(lbl);
  997.  
  998.     var lbl = document.createElement("label");
  999.     lbl.innerHTML = "多图:";
  1000.     var ipt = document.createElement("input");
  1001.     ipt.type = "text";
  1002.     ipt.className = "PUBD_type_name";
  1003.     ipt.name = "PUBD_type_name1";
  1004.     ipt.value = getConfig("PUBD_type_name1");
  1005.     lbl.appendChild(ipt);
  1006.     divText.appendChild(lbl);
  1007.  
  1008.     var lbl = document.createElement("label");
  1009.     lbl.innerHTML = "动图:";
  1010.     var ipt = document.createElement("input");
  1011.     ipt.type = "text";
  1012.     ipt.className = "PUBD_type_name";
  1013.     ipt.name = "PUBD_type_name2";
  1014.     ipt.value = getConfig("PUBD_type_name2");
  1015.     lbl.appendChild(ipt);
  1016.     divText.appendChild(lbl);
  1017.  
  1018.     var lbl = document.createElement("label");
  1019.     lbl.innerHTML = "单漫:";
  1020.     var ipt = document.createElement("input");
  1021.     ipt.type = "text";
  1022.     ipt.className = "PUBD_type_name";
  1023.     ipt.name = "PUBD_type_name3";
  1024.     ipt.value = getConfig("PUBD_type_name3");
  1025.     lbl.appendChild(ipt);
  1026.     divText.appendChild(lbl);
  1027.     //设置-多图掩码
  1028.     var li = document.createElement("li");
  1029.     li.className = "thread";
  1030.     var divTime = document.createElement("div");
  1031.     divTime.className = "time date";
  1032.     var divName = document.createElement("div");
  1033.     divName.className = "name";
  1034.     var divText = document.createElement("div");
  1035.     divText.className = "text";
  1036.     li.appendChild(divTime);
  1037.     li.appendChild(divName);
  1038.     li.appendChild(divText);
  1039.     ul.appendChild(li);
  1040.  
  1041.     divName.innerHTML = "多图掩码内容";
  1042.     divTime.innerHTML = "替换%{multiple}的内容"
  1043.     var ipt = document.createElement("input");
  1044.     ipt.type = "text";
  1045.     ipt.className = "PUBD_multiple_mask";
  1046.     ipt.name = "PUBD_multiple_mask";
  1047.     ipt.value = getConfig("PUBD_multiple_mask");
  1048.     divText.appendChild(ipt);
  1049.  
  1050.     //确定按钮行
  1051.     var confirmbar = document.createElement("div");
  1052.     confirmbar.className = "_notification-request-permission";
  1053.     confirmbar.style.display = "block";
  1054.     var btnConfirm = document.createElement("button");
  1055.     btnConfirm.className = "_button";
  1056.     btnConfirm.innerHTML = "确定";
  1057.     var btnCancel = document.createElement("button");
  1058.     btnCancel.className = "_button";
  1059.     btnCancel.innerHTML = "取消";
  1060.     btnCancel.onclick = function () { set.parentNode.removeChild(set); }
  1061.     var btnReset = document.createElement("button");
  1062.     btnReset.className = "_button";
  1063.     btnReset.innerHTML = "重置设置";
  1064.     btnReset.onclick = function () { ResetConfig(); }
  1065.     confirmbar.appendChild(btnConfirm);
  1066.     confirmbar.appendChild(btnCancel);
  1067.     confirmbar.appendChild(btnReset);
  1068.  
  1069.     set.appendChild(h2);
  1070.     set.appendChild(ul);
  1071.     set.appendChild(confirmbar);
  1072.  
  1073.     btnConfirm.onclick = function ()
  1074.     {
  1075.         setConfig("PUBD_reset", Version);
  1076.         var radioObj = document.getElementsByName("PUBD_download_mode");
  1077.         for (var oi = 0; oi < radioObj.length; oi++)
  1078.         {
  1079.             if (radioObj[oi].checked)
  1080.             {
  1081.                 setConfig("PUBD_download_mode", oi); //radioObj[oi].value
  1082.                 break;
  1083.             }
  1084.         }
  1085.         setConfig("PUBD_PRC_path", document.getElementsByName("PUBD_PRC_path")[0].value);
  1086.         setConfig("PUBD_save_dir", document.getElementsByName("PUBD_save_dir")[0].value);
  1087.         setConfig("PUBD_image_src", document.getElementsByName("PUBD_image_src")[0].value);
  1088.         setConfig("PUBD_save_path", document.getElementsByName("PUBD_save_path")[0].value);
  1089.         setConfig("PUBD_referer", document.getElementsByName("PUBD_referer")[0].value);
  1090.         setConfig("PUBD_type_name0", document.getElementsByName("PUBD_type_name0")[0].value);
  1091.         setConfig("PUBD_type_name1", document.getElementsByName("PUBD_type_name1")[0].value);
  1092.         setConfig("PUBD_type_name2", document.getElementsByName("PUBD_type_name2")[0].value);
  1093.         setConfig("PUBD_type_name3", document.getElementsByName("PUBD_type_name3")[0].value);
  1094.         setConfig("PUBD_multiple_mask", document.getElementsByName("PUBD_multiple_mask")[0].value);
  1095.  
  1096.         btnCancel.onclick();
  1097.     }
  1098.  
  1099.     return set;
  1100. }
  1101.  
  1102. //生成导出下载窗口
  1103. function buildExport() {
  1104.     var set = document.createElement("div");
  1105.     set.id = "PixivUserBatchDownloadExport";
  1106.     set.className = "notification-popup";
  1107.     set.style.display = "block";
  1108.     //自定义CSS
  1109.     var style = document.createElement("style");
  1110.     set.appendChild(style);
  1111.     style.type = "text/css";
  1112.     style.innerHTML +=
  1113.         [
  1114.             ".PUBD_batch" + "{\r\n" + [
  1115.                 'width:350px',
  1116.                 'max-width:350px',
  1117.                 'min-width:350px',
  1118.                 'height:300px',
  1119.             ].join(';\r\n') + "\r\n}",
  1120.         ].join('\r\n');
  1121.  
  1122.     //标题行
  1123.     var h2 = document.createElement("h2");
  1124.     h2.innerHTML = "Aria2导出";
  1125.  
  1126.     //设置内容
  1127.     var ul = document.createElement("ul");
  1128.     ul.className = "notification-list message-thread-list";
  1129.  
  1130.     //导出-Batch
  1131.     var li = document.createElement("li");
  1132.     //li.className = "thread";
  1133.     //var divTime = document.createElement("div");
  1134.     //divTime.className = "time date";
  1135.     var divName = document.createElement("div");
  1136.     divName.className = "name";
  1137.     var divText = document.createElement("div");
  1138.     divText.className = "text";
  1139.     //li.appendChild(divTime);
  1140.     li.appendChild(divName);
  1141.     li.appendChild(divText);
  1142.     ul.appendChild(li);
  1143.  
  1144.     divName.innerHTML = "命令行提示符批处理";
  1145.     //divTime.innerHTML = "保存为bat文件运行"
  1146.     var ipt = document.createElement("textarea");
  1147.     ipt.className = "PUBD_batch";
  1148.     ipt.name = "PUBD_batch";
  1149.     ipt.wrap = "off";
  1150.     divText.appendChild(ipt);
  1151.  
  1152.     //导出-Down
  1153.     var li = document.createElement("li");
  1154.     //li.className = "thread";
  1155.     //var divTime = document.createElement("div");
  1156.     //divTime.className = "time date";
  1157.     //var divName = document.createElement("div");
  1158.     //divName.className = "name";
  1159.     var divText = document.createElement("div");
  1160.     divText.className = "text";
  1161.     //li.appendChild(divTime);
  1162.     //li.appendChild(divName);
  1163.     li.appendChild(divText);
  1164.     ul.appendChild(li);
  1165.  
  1166.     //divName.innerHTML = "下载命令";
  1167.     //divTime.innerHTML = "保存为bat文件运行"
  1168.     var btnExport = document.createElement("a");
  1169.     btnExport.className = "_button";
  1170.     btnExport.name = "PUBD_down";
  1171.     btnExport.target = "_blank"
  1172.     btnExport.download = "aria2" + ".session.txt"
  1173.     btnExport.innerHTML = "导出Aria2会话文件";
  1174.     //btnExport.onclick = function () { startProgram(2); }
  1175.     divText.appendChild(btnExport);
  1176.  
  1177.     //确定按钮行
  1178.     var confirmbar = document.createElement("div");
  1179.     confirmbar.className = "_notification-request-permission";
  1180.     confirmbar.style.display = "block";
  1181.     var btnClose = document.createElement("button");
  1182.     btnClose.className = "_button";
  1183.     btnClose.innerHTML = "关闭";
  1184.     btnClose.onclick = function () { set.parentNode.removeChild(set); }
  1185.  
  1186.     confirmbar.appendChild(btnClose);
  1187.  
  1188.     set.appendChild(h2);
  1189.     set.appendChild(ul);
  1190.     set.appendChild(confirmbar);
  1191.     return set;
  1192. }
  1193.  
  1194. //生成直接下载链接窗口
  1195. function buildDirectLink()
  1196. {
  1197.     var set = document.createElement("div");
  1198.     set.id = "PixivUserBatchDownloadDirectLink";
  1199.     set.className = "notification-popup";
  1200.     set.style.display = "block";
  1201.     //自定义CSS
  1202.     var style = document.createElement("style");
  1203.     set.appendChild(style);
  1204.     style.type = "text/css";
  1205.     style.innerHTML +=
  1206.         [
  1207.             ".PUBD_dLink" + "{\r\n" + [
  1208.                 'width:100%',
  1209.                 'height:300px',
  1210.                 'overflow:scroll',
  1211.                 'border:1px solid #becad8',
  1212.             ].join(';\r\n') + "\r\n}",
  1213.             "#PixivUserBatchDownloadDirectLink a" + "{\r\n" + [
  1214.                 'display:inline',
  1215.                 'padding:0',
  1216.                 'background:none',
  1217.                 'color: #258fb8',
  1218.                 'white-space:nowrap',
  1219.             ].join(';\r\n') + "\r\n}",
  1220.         ].join('\r\n');
  1221.  
  1222.     //标题行
  1223.     var h2 = document.createElement("h2");
  1224.     h2.innerHTML = "直接下载链接";
  1225.  
  1226.     //设置内容
  1227.     var ul = document.createElement("ul");
  1228.     ul.className = "notification-list message-thread-list";
  1229.  
  1230.     //导出-Batch
  1231.     var li = document.createElement("li");
  1232.     //li.className = "thread";
  1233.     //var divTime = document.createElement("div");
  1234.     //divTime.className = "time date";
  1235.     var divName = document.createElement("div");
  1236.     divName.className = "name";
  1237.     var divText = document.createElement("div");
  1238.     divText.className = "text";
  1239.     //li.appendChild(divTime);
  1240.     li.appendChild(divName);
  1241.     li.appendChild(divText);
  1242.     ul.appendChild(li);
  1243.  
  1244.     divName.innerHTML = "用<a href=\"https://addons.mozilla.org/firefox/addon/downthemall/\" target=\"_blank\">DownThemAll!</a>的批量下载,重命名掩码设置为“*title*”<br />" +
  1245.         "如果发生403错误,使用<a href=\"https://addons.mozilla.org/firefox/addon/referrer-control/\" target=\"_blank\">RefControl</a>添加站点“pixiv.net”,设置“伪装-发送站点根目录”";
  1246.     //divTime.innerHTML = "保存为bat文件运行"
  1247.     var ipt = document.createElement("div");
  1248.     ipt.className = "PUBD_dLink";
  1249.     divText.appendChild(ipt);
  1250.  
  1251.     //确定按钮行
  1252.     var confirmbar = document.createElement("div");
  1253.     confirmbar.className = "_notification-request-permission";
  1254.     confirmbar.style.display = "block";
  1255.     var btnClose = document.createElement("button");
  1256.     btnClose.className = "_button";
  1257.     btnClose.innerHTML = "关闭";
  1258.     btnClose.onclick = function () { set.parentNode.removeChild(set); }
  1259.  
  1260.     confirmbar.appendChild(btnClose);
  1261.  
  1262.     set.appendChild(h2);
  1263.     set.appendChild(ul);
  1264.     set.appendChild(confirmbar);
  1265.     return set;
  1266. }
  1267.  
  1268. //检测下载完成情况
  1269. function startProgramCheck(mode) {
  1270.     if (getPicNum > 0 && getPicNum >= dataset.illust_file_count) {
  1271.         li2.innerHTML = "获取完成:" + getPicNum + "/" + dataset.illust_file_count;
  1272.         startDownload(mode);
  1273.         clearInterval(downOver);
  1274.     }
  1275.     else
  1276.     {
  1277.         li2.innerHTML = "已获取图像地址:" + getPicNum + "/" + dataset.illust_file_count;
  1278.         var PUBD_batch = document.getElementsByName("PUBD_batch")[0];
  1279.         if (PUBD_batch) PUBD_batch.value = li2.innerHTML;
  1280.         var PUBD_dLink = document.getElementsByClassName("PUBD_dLink")[0];
  1281.         if (PUBD_dLink) PUBD_dLink.innerHTML = li2.innerHTML;
  1282.     }
  1283.     console.debug("获取%d/%d",getPicNum, dataset.illust_file_count);
  1284. }
  1285. //开始构建下载
  1286. function startDownload(mode) {
  1287.     switch (mode)
  1288.     {
  1289.         case 0: //RPC模式
  1290.             var aria2 = new ARIA2(getConfig("PUBD_PRC_path"));
  1291.  
  1292.             for (var ii = 0; ii < dataset.illust.length; ii++) {
  1293.                 var ill = dataset.illust[ii];
  1294.                 for (var pi = 0; pi < ill.original_src.length; pi++)
  1295.                 {
  1296.                     var ext = ill.extention[pi];
  1297.                     for (var dmi = 0; dmi < ((download_mod == 1 && ill.type != 2) ? 3 : 1) ; dmi++)
  1298.                     {
  1299.                         var srtObj = {
  1300.                             "out": replacePathSafe(showMask(getConfig("PUBD_save_path"), ill, pi, replacePathSafe), true),
  1301.                             "referer": showMask(getConfig("PUBD_referer"), ill, pi),
  1302.                             "remote-time": "true",
  1303.                             "allow-overwrite": "false",
  1304.                             "auto-file-renaming": "false"
  1305.                         }
  1306.                         if(getConfig("PUBD_save_dir").length>0)
  1307.                         {
  1308.                             srtObj.dir = replacePathSafe(showMask(getConfig("PUBD_save_dir"), ill, pi, replacePathSafe), true);
  1309.                         }
  1310.                         aria2.addUri(showMask(getConfig("PUBD_image_src"), ill, pi), srtObj);
  1311.  
  1312.                         //快速模式重新更改扩展名
  1313.                         if (download_mod == 1)
  1314.                         {
  1315.                             switch (dmi)
  1316.                             {
  1317.                                 case 0:
  1318.                                     ill.extention[pi] = ext == "jpg" ? "png" : "jpg";
  1319.                                     break;
  1320.                                 case 1:
  1321.                                     ill.extention[pi] = ext != "gif" ? "gif" : "png";
  1322.                                     break;
  1323.                                 case 2:
  1324.                                     ill.extention[pi] = ext; //操作完还原
  1325.                                     break;
  1326.                                 default:
  1327.                             }
  1328.                             ill.original_src[pi] = ill.original_src[0].replace(/\.\w+$/, "." + ill.extention[pi]);
  1329.                         }
  1330.                     }
  1331.                 }
  1332.             }
  1333.             alert("全部发送完毕");
  1334.             break;
  1335.         case 1: //生成BAT下载命令模式
  1336.             var txt = "";
  1337.             var downtxt = "";
  1338.             for (var ii = 0; ii < dataset.illust.length; ii++)
  1339.             {
  1340.                 var ill = dataset.illust[ii];
  1341.                 for (var pi = 0; pi < ill.original_src.length; pi++)
  1342.                 {
  1343.                     var ext = ill.extention[pi];
  1344.                     for (var dmi = 0; dmi < ((download_mod == 1 && ill.type != 2) ? 3 : 1) ; dmi++)
  1345.                     {
  1346.                         txt += "aria2c --allow-overwrite=false --auto-file-renaming=false --remote-time=true " + ((getConfig("PUBD_save_dir").length > 0) ? "--dir=\"" + replacePathSafe(showMask(getConfig("PUBD_save_dir"), ill, pi, replacePathSafe), true) + "\" " : "") + "--out=\"" + replacePathSafe(showMask(getConfig("PUBD_save_path"), ill, pi, replacePathSafe), true) + "\" --referer=\"" + showMask(getConfig("PUBD_referer"), ill, pi) + "\" \"" + showMask(getConfig("PUBD_image_src"), ill, pi) + "\"";
  1347.                         downtxt += showMask(getConfig("PUBD_image_src"), ill, pi)
  1348.                             + ((getConfig("PUBD_save_dir").length > 0) ? "\r\n dir=" + replacePathSafe(showMask(getConfig("PUBD_save_dir"), ill, pi, replacePathSafe), true) : "")
  1349.                             + "\r\n out=" + replacePathSafe(showMask(getConfig("PUBD_save_path"), ill, pi, replacePathSafe), true)
  1350.                             + "\r\n referer=" + showMask(getConfig("PUBD_referer"), ill, pi)
  1351.                             + "\r\n allow-overwrite=false"
  1352.                             + "\r\n auto-file-renaming=false"
  1353.                             + "\r\n remote-time=true"
  1354.                         ;
  1355.                         txt += "\r\n";
  1356.                         downtxt += "\r\n";
  1357.                         //快速模式重新更改扩展名
  1358.                         if (download_mod == 1)
  1359.                         {
  1360.                             switch (dmi)
  1361.                             {
  1362.                                 case 0:
  1363.                                     ill.extention[pi] = ext == "jpg" ? "png" : "jpg";
  1364.                                     break;
  1365.                                 case 1:
  1366.                                     ill.extention[pi] = ext != "gif" ? "gif" : "png";
  1367.                                     break;
  1368.                                 case 2:
  1369.                                     ill.extention[pi] = ext; //操作完还原
  1370.                                     break;
  1371.                                 default:
  1372.                             }
  1373.                             ill.original_src[pi] = ill.original_src[0].replace(/\.\w+$/, "." + ill.extention[pi]);
  1374.                         }
  1375.                     }
  1376.                 }
  1377.             }
  1378.             var txta = document.getElementsByName("PUBD_batch")[0];
  1379.             var btn = document.getElementsByName("PUBD_down")[0];
  1380.             if (txta) txta.value = txt;
  1381.             var downBlob = new Blob([downtxt], {'type': 'text\/plain'});
  1382.             var downurl = window.URL.createObjectURL(downBlob);//"data:text/plain;charset=utf-8," + encodeURIComponent(downtxt);
  1383.             if (btn)
  1384.             {
  1385.                 btn.href = downurl;
  1386.                 btn.download = dataset.user_id + "_" + dataset.user_name + ".session.txt"
  1387.             }
  1388.             break;
  1389.         case 2: //生成直接下载链接模式
  1390.             var linksDom = document.getElementsByClassName("PUBD_dLink")[0];
  1391.             linksDom.innerHTML = "";
  1392.             for (var ii = 0; ii < dataset.illust.length; ii++)
  1393.             {
  1394.                 var ill = dataset.illust[ii];
  1395.                 for (var pi = 0; pi < ill.original_src.length; pi++)
  1396.                 {
  1397.                     var ext = ill.extention[pi];
  1398.                     for (var dmi = 0; dmi < ((download_mod == 1 && ill.type != 2) ? 3 : 1) ; dmi++)
  1399.                     {
  1400.                         var dlink = document.createElement("p");
  1401.                         var br = document.createElement("br");
  1402.                         dlink.textContent = showMask(getConfig("PUBD_image_src"), ill, pi);
  1403.                         //dlink.title = replacePathSafe(showMask(getConfig("PUBD_save_path"), ill, pi, replacePathSafe), true);
  1404.                         //dlink.innerHTML = dlink.title; //showMask("%{illust_id}_%{title}_p%{page}", ill, pi);
  1405.                         linksDom.appendChild(dlink);
  1406.                         //linksDom.appendChild(br);
  1407.                         //快速模式重新更改扩展名
  1408.                         if (download_mod == 1)
  1409.                         {
  1410.                             switch (dmi)
  1411.                             {
  1412.                                 case 0:
  1413.                                     ill.extention[pi] = ext == "jpg" ? "png" : "jpg";
  1414.                                     break;
  1415.                                 case 1:
  1416.                                     ill.extention[pi] = ext != "gif" ? "gif" : "png";
  1417.                                     break;
  1418.                                 case 2:
  1419.                                     ill.extention[pi] = ext; //操作完还原
  1420.                                     break;
  1421.                                 default:
  1422.                             }
  1423.                             ill.original_src[pi] = ill.original_src[0].replace(/\.\w+$/, "." + ill.extention[pi]);
  1424.                         }
  1425.                     }
  1426.                 }
  1427.             }
  1428.             break;
  1429.         default:
  1430.             alert("未知的下载模式");
  1431.             break;
  1432.     }
  1433. };
  1434.    
  1435. function getConfig(key, type)
  1436. {
  1437.     //-1原始,返回null,0 = 字符,返回空, 1 = 数字返回0,
  1438.     if (type == undefined)
  1439.         type = 0;
  1440.     var value = window.localStorage.getItem(key);
  1441.     if (window.localStorage)
  1442.     {
  1443.         switch (type)
  1444.         {
  1445.             case 0: //字符
  1446.                 return value || "";
  1447.                 break;
  1448.             case 1: //数字
  1449.                 return value ? parseInt(0 + value.replace(/\D/ig, "")) : 0;
  1450.                 break;
  1451.             default: //原始
  1452.                 return value;
  1453.         }
  1454.     } else
  1455.     {
  1456.         alert("浏览器不支持本地储存。");
  1457.     }
  1458. };
  1459. function setConfig(key, value)
  1460. {
  1461.     if (window.localStorage)
  1462.     {
  1463.         window.localStorage.setItem(key, value);
  1464.     } else
  1465.     {
  1466.         alert("浏览器不支持本地储存。");
  1467.     }
  1468. };
  1469. function ResetConfig(part)
  1470. {
  1471.     function partReset(key,value,ispart)
  1472.     {
  1473.         if (ispart && !getConfig(key, -1) || !ispart) setConfig(key, value);
  1474.     }
  1475.     partReset("PUBD_reset", Version, part);
  1476.     partReset("PUBD_PRC_path", "http://localhost:6800/jsonrpc", part);
  1477.     partReset("PUBD_download_mode", 0, part);
  1478.     partReset("PUBD_save_dir", "C:\\Users\\Public\\Pictures\\PixivUserBatchDownload\\", part);
  1479.     partReset("PUBD_image_src", "%{original_src}", part);
  1480.     partReset("PUBD_save_path", "%{user_id}_%{user_name}/%{multiple}%{filename}.%{extention}", part);
  1481.     partReset("PUBD_referer", "%{url}", part);
  1482.     partReset("PUBD_type_name0", "", part);
  1483.     partReset("PUBD_type_name1", "multiple", part);
  1484.     partReset("PUBD_type_name2", "ugoku", part);
  1485.     partReset("PUBD_type_name3", "manga", part);
  1486.     partReset("PUBD_multiple_mask", "%{illust_id}_%{title}/", part);
  1487.  
  1488.     if (document.getElementsByName("PUBD_PRC_path")[0]) document.getElementsByName("PUBD_PRC_path")[0].value = getConfig("PUBD_PRC_path");
  1489.     //if (document.getElementsByName("PUBD_download_mode")[0]) document.getElementsByName("PUBD_download_mode")[getConfig("PUBD_download_mode",1)].checked = true;
  1490.     if (document.getElementsByName("PUBD_download_mode")[0]) document.getElementsByName("PUBD_download_mode")[0].checked = true;
  1491.     if (document.getElementsByName("PUBD_save_dir")[0]) document.getElementsByName("PUBD_save_dir")[0].value = getConfig("PUBD_save_dir");
  1492.     if (document.getElementsByName("PUBD_image_src")[0]) document.getElementsByName("PUBD_image_src")[0].value = getConfig("PUBD_image_src");
  1493.     if (document.getElementsByName("PUBD_save_path")[0]) document.getElementsByName("PUBD_save_path")[0].value = getConfig("PUBD_save_path");
  1494.     if (document.getElementsByName("PUBD_referer")[0]) document.getElementsByName("PUBD_referer")[0].value = getConfig("PUBD_referer");
  1495.     if (document.getElementsByName("PUBD_type_name0")[0]) document.getElementsByName("PUBD_type_name0")[0].value = getConfig("PUBD_type_name0");
  1496.     if (document.getElementsByName("PUBD_type_name1")[0]) document.getElementsByName("PUBD_type_name1")[0].value = getConfig("PUBD_type_name1");
  1497.     if (document.getElementsByName("PUBD_type_name2")[0]) document.getElementsByName("PUBD_type_name2")[0].value = getConfig("PUBD_type_name2");
  1498.     if (document.getElementsByName("PUBD_type_name3")[0]) document.getElementsByName("PUBD_type_name3")[0].value = getConfig("PUBD_type_name3");
  1499.     if (document.getElementsByName("PUBD_multiple_mask")[0]) document.getElementsByName("PUBD_multiple_mask")[0].value = getConfig("PUBD_multiple_mask");
  1500. };
  1501.  
  1502. function showMask(str,ill,index,deal)
  1503. {
  1504.     if (deal == undefined)
  1505.         deal = function (arg) { return arg;}
  1506.     var newTxt = str;
  1507.     var regMask = /%{([^}]+)}/g;
  1508.     var rs = regMask.exec(str);
  1509.     while (rs != null) {
  1510.         if (rs[1] == "multiple")
  1511.         {
  1512.             var rp = "";
  1513.             if (ill.type == 1)
  1514.             {
  1515.                 if (getConfig("PUBD_multiple_mask").indexOf("%{multiple}") >= 0 || getConfig("PUBD_multiple_mask").indexOf("%{type_name}") >= 0 && getConfig("PUBD_type_name" + ill.type).indexOf("%{multiple}" >= 0))
  1516.                     console.error("掩码中存在循环自身引用");
  1517.                 else
  1518.                     var rp = showMask(getConfig("PUBD_multiple_mask"), ill, index, deal);
  1519.             }
  1520.             newTxt = newTxt.replace(rs[0], rp);
  1521.         }
  1522.         else if (rs[1] == "type_name")
  1523.         {
  1524.             var rp = "";
  1525.             if (getConfig("PUBD_type_name" + ill.type).indexOf("%{type_name}") >= 0 || getConfig("PUBD_type_name" + ill.type).indexOf("%{multiple}") >= 0 && getConfig("PUBD_multiple_mask").indexOf("%{type_name}" >= 0))
  1526.                 console.error("掩码中存在循环自身引用");
  1527.             else
  1528.                 var rp = showMask(getConfig("PUBD_type_name" + ill.type), ill, index, deal);
  1529.             newTxt = newTxt.replace(rs[0], rp);
  1530.         }
  1531.         else if (rs[1] == "page")
  1532.             newTxt = newTxt.replace(rs[0], index);
  1533.         else if (rs[1] == "filename" || rs[1] == "extention" || rs[1] == "original_src")
  1534.             newTxt = newTxt.replace(rs[0], deal(ill[rs[1]][index]));
  1535.         else if (ill[rs[1]] != undefined)
  1536.             newTxt = newTxt.replace(rs[0], deal(ill[rs[1]]));
  1537.         else if (dataset[rs[1]] != undefined)
  1538.             newTxt = newTxt.replace(rs[0], deal(dataset[rs[1]]));
  1539.         var rs = regMask.exec(str);
  1540.     }
  1541.     return newTxt;
  1542. }
  1543.  
  1544. function replacePathSafe(str, keepTree) //去除Windows下无法作为文件名的字符,目前为了支持Linux暂不替换两种斜杠吧。
  1545. {
  1546.     if (typeof(str) == "undefined")
  1547.         return "";
  1548.     if (keepTree)
  1549.         var nstr = str.replace(/[\*\?"<>\|]/ig, "_");
  1550.     else
  1551.         var nstr = str.replace(/[\\\/:\*\?"<>\|]/ig, "_");
  1552.     return nstr;
  1553. }
  1554. })();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement