P站画师个人作品批量下载工具

一键批量下载P站画师的全部作品

目前为 2016-03-28 提交的版本。查看 最新版本

  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. // @version 1.3.0
  12. // @grant none
  13. // @copyright 2016+, Mapaler <mapaler@163.com>
  14. // @icon http://www.pixiv.net/favicon.ico
  15. // ==/UserScript==
  16.  
  17. (function() {
  18. var pICD = 20; //pageIllustCountDefault默认每页作品数量
  19. var getPicNum = 0; //Ajax获取了文件的数量
  20. var downOver; //检测下载是否完成的循环函数
  21.  
  22. if (getConfig("PUBD_reset") != "1") ResetConfig(); //新用户重置设置
  23.  
  24. var dataset =
  25. {
  26. user_id: 0, //作者ID
  27. user_name: "", //作者昵称
  28. illust_count: 0, //作品总数
  29. illust_file_count: 0, //作品文件总数(含多图)
  30. illust:[
  31. ]
  32. }
  33. function illust()
  34. {
  35. var obj =
  36. {
  37. illust_id: 0, //作品ID
  38. illust_page: 0, //在作者的第几页
  39. illust_index: 0, //全部作品中序号
  40. illust_index_inverted: 0, //全部作品中序号_倒序
  41. illust_index_in_page: 0, //该页上序号
  42. illust_index_in_page_inverted: 0, //该页上序号_倒序
  43. title: "", //作品标题
  44. type: 0, //类型,单页、漫画、动画
  45. //type_name: "", //类型用文字表示
  46. filename: [""], //文件名
  47. extention: [""], //扩展名
  48. original_src: [""], //原始图片链接
  49. //page: 0, //第几页(漫画)
  50. page_count: 0, //共几页(漫画)
  51. year: 0,
  52. month: 0,
  53. day: 0,
  54. hour: 0,
  55. minute: 0,
  56. second: 0,
  57.  
  58. thumbnail_src: "", //缩略图地址
  59. domain: "", //域名
  60. url: "", //作品页面
  61. time: "", //显示时间
  62. size: "", //显示大小
  63. width: 0, //宽
  64. height: 0, //高
  65. tools: [""], //使用工具
  66. caption: "", //说明
  67. tags: [""], //标签
  68. //添加作品的顺序
  69. addIndexFromPage: function (index, page, illcount)
  70. {
  71. if (index == undefined)
  72. index = this.illust_index_in_page;
  73. else
  74. this.illust_index_in_page = index;
  75. if (page == undefined)
  76. page = this.illust_page;
  77. else
  78. this.illust_page = page;
  79. if (illcount == undefined)
  80. illcount = dataset.illust_count;
  81. this.illust_index = (this.illust_page - 1) * pICD + this.illust_index_in_page;
  82. this.illust_index_inverted = illcount - this.illust_index + 1;
  83. if ((illcount - this.illust_index) >= pICD)
  84. this.illust_index_in_page_inverted = pICD - index + 1;
  85. else
  86. this.illust_index_in_page_inverted = illcount % pICD - index + 1;
  87. },
  88. //ajax读取原始页面数据
  89. ajaxLoad: function (url)
  90. {
  91. if (url == undefined)
  92. url = this.url;
  93. else
  94. this.url = url;
  95. if (this.illust_id < 1)
  96. {
  97. var regSrc = /illust_id=(\d+)/ig;
  98. var iid = regSrc.exec(url);
  99. if (iid.length >= 2) this.illust_id = iid[1];
  100. }
  101. getSource(url, dealIllust, this);
  102. },
  103. }
  104. return obj;
  105. }
  106.  
  107. var menuInsertPlace = document.getElementsByClassName("user-relation")[0];
  108. if (menuInsertPlace == undefined) return;
  109. var li1 = document.createElement("li");
  110. var li2 = document.createElement("li");
  111. menuInsertPlace.appendChild(li1);
  112. menuInsertPlace.appendChild(li2);
  113. li1.className = "ui-selectbox-container";
  114. li2.className = "infoProgress";
  115.  
  116. var menu_ul = buildMenu();
  117.  
  118. var btnStart = document.createElement("button");
  119. btnStart.className = "_button following";
  120. btnStart.innerHTML = "获取全部作品";
  121.  
  122. btnStart.onclick = function (e)
  123. {
  124. if (menu_ul.parentNode == li1)
  125. li1.removeChild(menu_ul);
  126. else
  127. li1.appendChild(menu_ul);
  128. }
  129. li1.appendChild(btnStart);
  130.  
  131. //生成设置窗口DOM
  132. var setInsertPlace = document.getElementsByClassName("column-header")[0] || document.body;
  133. var setWindow = buildSetting();
  134. //生成导出窗口DOM
  135. var exportInsertPlace = setInsertPlace;
  136. var exportWindow = buildExport();
  137. //生成直接链接窗口DOM
  138. var directLinkInsertPlace = setInsertPlace;
  139. var directLinkWindow = buildDirectLink();
  140.  
  141. //开始程序
  142. function startProgram(mode)
  143. {
  144. if(getPicNum<1)
  145. {
  146. dealUserPage1();
  147. }
  148. clearInterval(downOver);
  149. downOver = setInterval(function () { startProgramCheck(mode) }, 500);
  150. }
  151.  
  152. function dealUserPage1(userId)
  153. {
  154. if (userId == undefined)
  155. userId = pixiv.context.userId;
  156. dataset.user_id = userId;
  157.  
  158. var locationSearch = (document.location.search.length > 0 ? document.location.search.replace(/mode=\w+/ig, "").replace(/illust_id=\d+/ig, "").replace(/id=\d+/ig, "") : "?");
  159. var linkPre = document.location.origin + "/member_illust.php" + locationSearch + "&id=" + userId;
  160. var link = getPageSrc(linkPre, 1);
  161.  
  162. getSource(link, dealUser, linkPre, userId)
  163. }
  164. //开始分析本作者
  165. function dealUser(response, linkPre, userId)
  166. {
  167. var parser = new DOMParser();
  168. PageDOM = parser.parseFromString(response, "text/html");
  169.  
  170. var user_link = PageDOM.getElementsByClassName("user-link")[0];
  171. var user_dom = user_link.getElementsByClassName("user")[0];
  172. dataset.user_name = user_dom.textContent;
  173. var count_badge = PageDOM.getElementsByClassName("count-badge");
  174. if (count_badge.length < 1)
  175. {
  176. alert("未发现作品数DOM");
  177. clearInterval(downOver);
  178. return;
  179. }
  180.  
  181. var regPC = /(\d+)/ig;
  182. var photoCount = regPC.exec(count_badge[0].textContent);
  183.  
  184. if (photoCount.length >= 2) {
  185. dataset.illust_count = parseInt(photoCount[1]);
  186. if (dataset.illust_count < 1)
  187. {
  188. alert("作品数为0");
  189. clearInterval(downOver);
  190. return;
  191. }
  192. dataset.illust_file_count = dataset.illust_count;
  193. var pageCount = Math.ceil(dataset.illust_count / 20);
  194. }
  195. else
  196. {
  197. alert("未发现作品数字符串");
  198. clearInterval(downOver);
  199. return;
  200. }
  201.  
  202. var column_title = PageDOM.getElementsByClassName("column-title");
  203. var self = column_title[0].getElementsByClassName("self");
  204.  
  205. dealPage(response, 1);
  206. //列表页循环
  207. for (pi = 2; pi <= pageCount; pi++)
  208. //for (pi = 0; pi < 1; pi++)
  209. {
  210. var link = getPageSrc(linkPre, pi);
  211. getSource(link, dealPage, pi);
  212. }
  213.  
  214. }
  215.  
  216. //获取页面网址
  217. function getPageSrc(linkPre, page)
  218. {
  219. return linkPre + "&p=" + page;
  220. }
  221.  
  222. //直接通过XMLHttpRequest对象获取远程网页源代码
  223. function getSource(url,callback,index, index2)
  224. {
  225. var xhr = new XMLHttpRequest(); //创建XMLHttpRequest对象
  226. xhr.onreadystatechange = function() //设置回调函数
  227. {
  228. if (xhr.readyState == 4 && xhr.status == 200)
  229. callback(xhr.responseText, index, index2);
  230. }
  231. xhr.open("GET", url, true);
  232. xhr.send(null);
  233. return xhr.responseText;
  234. }
  235. //处理列表页面的回调函数
  236. function dealPage(response, pageIndex)
  237. {
  238. /*
  239. 老式构建网页dom方法
  240. var PageDOM = document.createElement("div"); //创建一个容器
  241. PageDOM.innerHTML = response; //插入代码
  242. */
  243.  
  244. var parser = new DOMParser();
  245. PageDOM = parser.parseFromString(response, "text/html");
  246.  
  247. var _image_items = PageDOM.getElementsByClassName("_image-items");
  248. if (_image_items.length >= 0)
  249. {
  250. var image_items = _image_items[0].getElementsByClassName("image-item");
  251. //作品循环
  252. for (ii = 0; ii < image_items.length; ii++)
  253. //for (ii = 6; ii <= 6; ii++)
  254. {
  255. var _thumbnail = image_items[ii].getElementsByClassName("_thumbnail")[0];
  256. var title = image_items[ii].getElementsByClassName("title")[0];
  257. var link = image_items[ii].getElementsByTagName("a");
  258.  
  259. var ill = new illust;
  260. if (link[0].href.length < 1)
  261. {
  262. console.log("你的浏览器无法获取DOMParser内a标签的href。目前只有Chrome这么做。")
  263. ill.url = document.location.origin + link[0].getAttribute("href");
  264. }
  265. else
  266. {
  267. ill.url = link[0].href;
  268. }
  269. ill.title = title.textContent;
  270. ill.addIndexFromPage(ii + 1, pageIndex, dataset.illust_count);
  271. //ill.illust_index_in_page = ii + 1;
  272. //ill.addFromThumbnail(_thumbnail.src);
  273. ill.thumbnail_src = _thumbnail.src;
  274. ill.ajaxLoad();
  275. //ill.addFromUrl(link.href);
  276. if (image_items[ii].getElementsByClassName("ugoku-illust").length > 0)
  277. ill.type = 2;
  278. else if (image_items[ii].getElementsByClassName("multiple").length > 0)
  279. ill.type = 1;
  280. else if (image_items[ii].getElementsByClassName("manga").length > 0)
  281. ill.type = 3;
  282. else
  283. ill.type = 0;
  284. dataset.illust.push(ill);
  285. }
  286. }
  287. }
  288.  
  289. //处理作品的回调函数
  290. function dealIllust(response, ill)
  291. {
  292. var regSrc = /https?:\/\/([^\/]+)\/.+\/(\d{4})\/(\d{2})\/(\d{2})\/(\d{2})\/(\d{2})\/(\d{2})\/((\d+)(?:[\-_][\w\d\-]+)?)\.([\w\d]+)/ig; //P站图片命名规则
  293. var parser = new DOMParser();
  294. PageDOM = parser.parseFromString(response, "text/html");
  295. //work_info
  296. var work_info = PageDOM.getElementsByClassName("work-info")[0];
  297. var works_display = PageDOM.getElementsByClassName("works_display")[0];
  298. //var title = work_info.getElementsByClassName("title")[0];
  299. //ill.title = title.textContent;
  300. var caption = work_info.getElementsByClassName("caption")[0];
  301. if (caption) ill.caption = caption.textContent;
  302. //metas
  303. var metas = work_info.getElementsByClassName("meta")[0];
  304. var meta = metas.getElementsByTagName("li");
  305. ill.time = meta[0].textContent;
  306. ill.size = meta[1].textContent;
  307. var tools = metas.getElementsByClassName("tools")[0]
  308. if (tools)
  309. {
  310. var toolsli = tools.getElementsByTagName("li");
  311. for (ti = 0; ti < toolsli.length; ti++)
  312. {
  313. ill.tools[ti] = toolsli[ti].textContent;
  314.  
  315. }
  316. }
  317. //TAG
  318. var tagsDom = PageDOM.getElementsByClassName("work-tags")[0].getElementsByClassName("tags-container")[0].getElementsByClassName("tags");
  319. if (tagsDom.length > 0)
  320. {
  321. var tags = tagsDom[0].getElementsByClassName("tag");
  322. for (ti = 0; ti < tags.length; ti++)
  323. {
  324. ill.tags[ti] = tags[ti].getElementsByClassName("text")[0].textContent;
  325. }
  326. }
  327.  
  328.  
  329. var script = PageDOM.getElementById("wrapper").getElementsByTagName("script")[0];
  330. //建立内部临时变量,避免影响到原始页面
  331. var pixiv = new Object; pixiv.context = new Object;
  332. //执行获取到的代码
  333. eval(script.innerHTML);
  334. ill.illust_id = pixiv.context.illustId;
  335. ill.width = pixiv.context.illustSize[0];
  336. ill.height = pixiv.context.illustSize[1];
  337. ill.title = pixiv.context.illustTitle;
  338. //dataset.user_name = pixiv.context.userName;
  339. //添加静图
  340. if (PageDOM.getElementsByClassName("original-image")[0]) {//静图
  341. var originalImage = PageDOM.getElementsByClassName("original-image")[0].getAttribute("data-src");
  342. ill.page_count = 1;
  343. ill.type = 0;
  344. ill.original_src[0] = originalImage;
  345. //originalImage = "http://i2.pixiv.net/img-original/img/2016/01/26/00/01/01/54911277_p0.jpg";
  346. var aImg = regSrc.exec(originalImage);
  347. //console.log(aImg);
  348. //["http://i2.pixiv.net/img-...0/01/01/54911277_p0.jpg", "i2.pixiv.net", "2016", "01", "26", "00", "01", "01", "54911277_p0", "54911277", "jpg"]
  349. if (aImg.length >= 1)
  350. {
  351. ill.domain = aImg[1];
  352. ill.year = aImg[2];
  353. ill.month = aImg[3];
  354. ill.day = aImg[4];
  355. ill.hour = aImg[5];
  356. ill.minute = aImg[6];
  357. ill.second = aImg[7];
  358. ill.filename[0] = aImg[8];
  359. ill.extention[0] = aImg[10];
  360. getPicNum+=1;
  361. }else
  362. {
  363. alert("获取单图原始图片路径信息失败,可能需要更新正则匹配模式。");
  364.  
  365. }
  366. }
  367. //添加动图
  368. else if (PageDOM.getElementsByClassName("_ugoku-illust-player-container").length > 0)
  369. {
  370. var zipUrl = pixiv.context.ugokuIllustFullscreenData.src;
  371. ill.page_count = pixiv.context.ugokuIllustFullscreenData.frames.length;
  372. ill.type = 2;
  373. ill.original_src[0] = zipUrl;
  374. //zipUrl = "http://i3.pixiv.net/img-zip-ugoira/img/2015/06/02/01/50/26/50680914_ugoira1920x1080.zip";
  375. var aImg = regSrc.exec(zipUrl);
  376. //console.log(aImg);
  377. //["http://i3.pixiv.net/img-...914_ugoira1920x1080.zip", "i3.pixiv.net", "2015", "06", "02", "01", "50", "26", "50680914_ugoira1920x1080", "50680914", "zip"]
  378. if (aImg.length >= 1) {
  379. ill.domain = aImg[1];
  380. ill.year = aImg[2];
  381. ill.month = aImg[3];
  382. ill.day = aImg[4];
  383. ill.hour = aImg[5];
  384. ill.minute = aImg[6];
  385. ill.second = aImg[7];
  386. ill.filename[0] = aImg[8];
  387. ill.extention[0] = aImg[10];
  388. getPicNum+=1;
  389. } else {
  390. alert("获取动图原始图片路径信息失败,可能需要更新正则匹配模式。");
  391. }
  392. }
  393. //添加多图
  394. else if (PageDOM.getElementsByClassName("multiple").length > 0)
  395. {
  396. ill.type = 1;
  397. var aImg = regSrc.exec(ill.thumbnail_src);
  398. if (aImg.length >= 1) {
  399. ill.domain = aImg[1];
  400. ill.year = aImg[2];
  401. ill.month = aImg[3];
  402. ill.day = aImg[4];
  403. ill.hour = aImg[5];
  404. ill.minute = aImg[6];
  405. ill.second = aImg[7];
  406. ill.filename[0] = aImg[8];
  407. ill.extention[0] = aImg[10];
  408. }
  409.  
  410. var regPageCont = /.+\s+(\d+)[pP]/ig;
  411. var rs = regPageCont.exec(ill.size);
  412. if (rs.length >= 2)
  413. {
  414. ill.page_count = parseInt(rs[1]);
  415. console.log(ill.illust_id + "为多图,存在" + ill.page_count + "张")
  416. dataset.illust_file_count += ill.page_count - 1; //图片总数里增加多图的张数
  417. var manga_big = ill.url.replace(/mode=[^&]+/, "mode=manga_big");
  418. var manga_big_url = manga_big + "&page=" + 0;
  419. getSource(manga_big_url, dealManga, ill);
  420. /*以前以为能够多图扩展名不一样
  421. for (var pi = 0; pi < ill.page_count; pi++) {
  422. var manga_big_url = manga_big + "&page=" + pi;
  423. getSource(manga_big_url, dealManga, ill, pi);
  424. }
  425. */
  426. }
  427. else
  428. {
  429. alert("获取多图总张数失败");
  430. }
  431. }
  432. //添加漫画
  433. else if (works_display.getElementsByClassName("manga").length > 0)
  434. {
  435. //因为Ajax无法设置Referer,而Mode=big无Referer会跳转回作品信息页面,因此这里只能用现有信息来猜
  436. var thumbnailImage = works_display.getElementsByClassName("_layout-thumbnail")[0].getElementsByTagName("img")[0];
  437. ill.page_count = 1;
  438. ill.type = 3;
  439. //thumbnailImage = "http://i3.pixiv.net/c/600x600/img-master/img/2015/05/13/21/36/35/50358638_p0_master1200.jpg";
  440. var aImg = regSrc.exec(thumbnailImage.src);
  441. //console.log(aImg);
  442. //["http://i2.pixiv.net/img-...0/01/01/54911277_p0.jpg", "i2.pixiv.net", "2016", "01", "26", "00", "01", "01", "54911277_p0", "54911277", "jpg"]
  443. if (aImg.length >= 1)
  444. {
  445. ill.domain = aImg[1];
  446. ill.year = aImg[2];
  447. ill.month = aImg[3];
  448. ill.day = aImg[4];
  449. ill.hour = aImg[5];
  450. ill.minute = aImg[6];
  451. ill.second = aImg[7];
  452. //因为不知道扩展名是什么,因此3种可能的扩展名都加入(反正不正确的无法下载)
  453. ill.filename[0] = aImg[9] + "_p0";
  454. ill.extention[0] = aImg[10];
  455. ill.filename[1] = ill.filename[0];
  456. ill.extention[1] = aImg[10] == "jpg" ? "png" : "jpg";
  457. ill.filename[2] = ill.filename[0];
  458. ill.extention[2] = aImg[10] != "gif" ? "gif" : "png";
  459. for (ti = 0; ti < 3; ti++)
  460. {
  461. ill.original_src[ti] = "http://" + ill.domain + "/img-original/img/" +
  462. ill.year + "/" + ill.month + "/" + ill.day + "/" +
  463. ill.hour + "/" + ill.minute + "/" + ill.second + "/" +
  464. ill.filename[ti] + "." + ill.extention[ti] + "";
  465. }
  466. getPicNum += 1;
  467. } else
  468. {
  469. alert("获取漫画原始图片路径信息失败,可能需要更新正则匹配模式。");
  470.  
  471. }
  472. }
  473. else
  474. {
  475. console.log(ill);
  476. alert("未知的作品类型。作品ID:" + ill.illust_id);
  477. }
  478. }
  479.  
  480. //处理多图的回调函数
  481. function dealManga(response, ill, index)
  482. {
  483. var parser = new DOMParser();
  484. PageDOM = parser.parseFromString(response, "text/html");
  485. var picture = PageDOM.getElementsByTagName("img")[0];
  486. ill.original_src[0] = picture.src;
  487. var regSrc = /https?:\/\/([^\/]+)\/.+\/(\d{4})\/(\d{2})\/(\d{2})\/(\d{2})\/(\d{2})\/(\d{2})\/((\d+)(?:[\-_][\w\d\-]+)?)\.([\w\d]+)/ig; //P站图片命名规则
  488. var aImg = regSrc.exec(picture.src);
  489. if (aImg.length >= 1)
  490. {
  491. ill.domain = aImg[1];
  492. ill.year = aImg[2];
  493. ill.month = aImg[3];
  494. ill.day = aImg[4];
  495. ill.hour = aImg[5];
  496. ill.minute = aImg[6];
  497. ill.second = aImg[7];
  498. ill.filename[0] = aImg[8];
  499. ill.extention[0] = aImg[10];
  500. getPicNum += 1;
  501. } else
  502. {
  503. alert("获取多图原始图片信息失败,可能需要更新正则匹配模式。");
  504. }
  505. for (var pi = 1; pi < ill.page_count; pi++)
  506. {
  507. ill.extention[pi] = ill.extention[0];
  508. ill.filename[pi] = ill.filename[0].replace("_p0", "_p" + pi);
  509. ill.original_src[pi] = ill.original_src[0].replace(ill.filename[0], ill.filename[pi]);
  510. getPicNum += 1;
  511. }
  512. }
  513.  
  514. var ARIA2 = (function () {
  515. var jsonrpc_version = '2.0';
  516.  
  517. function get_auth(url) {
  518. return url.match(/^(?:(?![^:@]+:[^:@\/]*@)[^:\/?#.]+:)?(?:\/\/)?(?:([^:@]*(?::[^:@]*)?)?@)?/)[1];
  519. };
  520.  
  521. function request(jsonrpc_path, method, params, getVersion) {
  522. var xhr = new XMLHttpRequest();
  523. var auth = get_auth(jsonrpc_path);
  524. jsonrpc_path = jsonrpc_path.replace(/^((?![^:@]+:[^:@\/]*@)[^:\/?#.]+:)?(\/\/)?(?:(?:[^:@]*(?::[^:@]*)?)?@)?(.*)/, '$1$2$3'); // auth string not allowed in url for firefox
  525.  
  526. var request_obj = {
  527. jsonrpc: jsonrpc_version,
  528. method: method,
  529. id: getVersion ? "1" : (new Date()).getTime().toString(),
  530. };
  531. if (params) request_obj['params'] = params;
  532. if (auth && auth.indexOf('token:') == 0) params.unshift(auth);
  533.  
  534. xhr.open("POST", jsonrpc_path + "?tm=" + (new Date()).getTime().toString(), true);
  535. xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
  536. if (auth && auth.indexOf('token:') != 0) {
  537. xhr.setRequestHeader("Authorization", "Basic " + btoa(auth));
  538. }
  539. xhr.send(JSON.stringify(request_obj));
  540. if (getVersion) {
  541. xhr.onreadystatechange = function () //设置回调函数
  542. {
  543. if (xhr.readyState == 4 && xhr.status == 200)
  544. {
  545. var JSONreq = JSON.parse(xhr.responseText);
  546. document.getElementsByName("PUBD_PRC_path_check")[0].innerHTML="发现Aria2 ver" + JSONreq.result.version;
  547. }
  548. else if (xhr.readyState == 4 && xhr.status != 200)
  549. document.getElementsByName("PUBD_PRC_path_check")[0].innerHTML="Aria2连接失败";
  550. }
  551. }
  552. };
  553.  
  554. return function (jsonrpc_path) {
  555. this.jsonrpc_path = jsonrpc_path;
  556. this.addUri = function (uri, options) {
  557. request(this.jsonrpc_path, 'aria2.addUri', [[uri, ], options]);
  558. };
  559. this.getVersion = function () {
  560. request(this.jsonrpc_path, 'aria2.getVersion', [], true);
  561. };
  562. return this;
  563. }
  564. })();
  565. //生成菜单
  566. function buildMenu()
  567. {
  568. var menu_ul = document.createElement("ul");
  569. menu_ul.className = "items";
  570. //menu_ul.style.display = "none";
  571. menu_ul.style.display = "block";
  572. var li = document.createElement("li");
  573. var a = document.createElement("a");
  574. a.className = "item";
  575. a.innerHTML = "Aria2 RPC";
  576. a.onclick = function () { startProgram(0); li1.removeChild(menu_ul); };
  577. li.appendChild(a);
  578. menu_ul.appendChild(li);
  579. var li = document.createElement("li");
  580. var a = document.createElement("a");
  581. a.className = "item";
  582. a.innerHTML = "导出下载文件";
  583. a.onclick = function ()
  584. {
  585. if (exportWindow.parentNode != exportInsertPlace)
  586. exportInsertPlace.appendChild(exportWindow);
  587. li1.removeChild(menu_ul);
  588. startProgram(1);
  589. };
  590. li.appendChild(a);
  591. menu_ul.appendChild(li);
  592. var li = document.createElement("li");
  593. var a = document.createElement("a");
  594. a.className = "item";
  595. a.innerHTML = "生成直接链接";
  596. a.onclick = function ()
  597. {
  598. if (directLinkWindow.parentNode != directLinkInsertPlace)
  599. exportInsertPlace.appendChild(directLinkWindow);
  600. li1.removeChild(menu_ul);
  601. startProgram(2);
  602. };
  603. li.appendChild(a);
  604. menu_ul.appendChild(li);
  605. var li = document.createElement("li");
  606. li.className = "separated";
  607. var a = document.createElement("a");
  608. a.className = "item";
  609. a.innerHTML = "设置";
  610. a.onclick = function ()
  611. {
  612. if (setWindow.parentNode != setInsertPlace)
  613. setInsertPlace.appendChild(setWindow);
  614. li1.removeChild(menu_ul);
  615. }
  616. li.appendChild(a);
  617. menu_ul.appendChild(li);
  618. return menu_ul;
  619. }
  620. function buildSetting()
  621. {
  622. var set = document.createElement("div");
  623. set.id = "PixivUserBatchDownloadSetting";
  624. set.className = "notification-popup";
  625. set.style.display = "block";
  626. //自定义CSS
  627. var style = document.createElement("style");
  628. set.appendChild(style);
  629. style.type = "text/css";
  630. style.innerHTML +=
  631. [
  632. ".PUBD_type_name" + "{\r\n" + [
  633. 'width:120px',
  634. ].join(';\r\n') + "\r\n}",
  635. ".PUBD_PRC_path" + "{\r\n" + [
  636. 'width:180px' ,
  637. ].join(';') + "\r\n}",
  638. ".PUBD_save_path,.PUBD_multiple_mask" + "{\r\n" + [
  639. 'width:340px' ,
  640. ].join(';') + "\r\n}",
  641. "#PixivUserBatchDownloadSetting .thread" + "{\r\n" + [
  642. 'height:40px',
  643. ].join(';') + "\r\n}",
  644. "#PixivUserBatchDownloadSetting .type_name" + "{\r\n" + [
  645. 'height:60px',
  646. ].join(';') + "\r\n}",
  647. "#PixivUserBatchDownloadSetting .text" + "{\r\n" + [
  648. 'height:4em',
  649. ].join(';') + "\r\n}",
  650. ].join('\r\n');
  651.  
  652.  
  653. //标题行
  654. var h2 = document.createElement("h2");
  655. h2.innerHTML = "Pixiv画师作品批量获取工具选项";
  656.  
  657. var a = document.createElement("a");
  658. a.className = "_official-badge";
  659. a.innerHTML = "设置说明";
  660. a.href = "https://github.com/Mapaler/PixivUserBatchDownload/blob/master/README.md";
  661. a.target = "_blank";
  662. h2.appendChild(a);
  663. //设置内容
  664. var ul = document.createElement("ul");
  665. ul.className = "notification-list message-thread-list";
  666.  
  667. /*
  668. //设置-模式
  669. var li = document.createElement("li");
  670. li.className = "thread";
  671. li.style.display = "none";
  672. var divTime = document.createElement("div");
  673. divTime.className = "time date";
  674. var divName = document.createElement("div");
  675. divName.className = "name";
  676. var divText = document.createElement("div");
  677. divText.className = "text";
  678. li.appendChild(divTime);
  679. li.appendChild(divName);
  680. li.appendChild(divText);
  681. //ul.appendChild(li);
  682.  
  683. divName.innerHTML = "功能选择(开发中)";
  684. divTime.innerHTML = "选择基本功能或自定义高级参数"
  685.  
  686. var lbl = document.createElement("label");
  687. var ipt = document.createElement("input");
  688. ipt.type = "radio";
  689. ipt.value = 0;
  690. ipt.name = "PUBD_mode";
  691. lbl.appendChild(ipt);
  692. lbl.innerHTML += "简单模式";
  693. divText.appendChild(lbl);
  694. var lbl = document.createElement("label");
  695. var ipt = document.createElement("input");
  696. ipt.type = "radio";
  697. ipt.value = 1;
  698. ipt.name = "PUBD_mode";
  699. lbl.appendChild(ipt);
  700. lbl.innerHTML += "专家模式";
  701. divText.appendChild(lbl);
  702. */
  703.  
  704.  
  705. //设置-RPC Path
  706. var li = document.createElement("li");
  707. li.className = "thread";
  708. var divTime = document.createElement("div");
  709. divTime.className = "time date";
  710. var divName = document.createElement("div");
  711. divName.className = "name";
  712. var divText = document.createElement("div");
  713. divText.className = "text";
  714. li.appendChild(divTime);
  715. li.appendChild(divName);
  716. li.appendChild(divText);
  717. ul.appendChild(li);
  718.  
  719. divName.innerHTML = "Aria2 JSON-RPC Path";
  720. divTime.innerHTML = "填写Aria2 JSON-RPC地址"
  721. var ipt = document.createElement("input");
  722. ipt.type = "text";
  723. ipt.className = "PUBD_PRC_path";
  724. ipt.name = "PUBD_PRC_path";
  725. ipt.value = getConfig("PUBD_PRC_path");
  726. divText.appendChild(ipt);
  727. var btnCheckLink = document.createElement("button");
  728. btnCheckLink.className = "_button";
  729. btnCheckLink.name = "PUBD_PRC_path_check";
  730. btnCheckLink.innerHTML = "检测地址";
  731. btnCheckLink.onclick = function ()
  732. {
  733. this.innerHTML = "正在连接...";
  734. var aria2 = new ARIA2(document.getElementsByName("PUBD_PRC_path")[0].value);
  735. aria2.getVersion();
  736. }
  737. divText.appendChild(btnCheckLink);
  738. //设置-下载路径
  739. var li = document.createElement("li");
  740. li.className = "thread";
  741. var divTime = document.createElement("div");
  742. divTime.className = "time date";
  743. var divName = document.createElement("div");
  744. divName.className = "name";
  745. var divText = document.createElement("div");
  746. divText.className = "text";
  747. li.appendChild(divTime);
  748. li.appendChild(divName);
  749. li.appendChild(divText);
  750. ul.appendChild(li);
  751.  
  752. divName.innerHTML = "下载路径";
  753. divTime.innerHTML = "下载到本地路径和文件名"
  754. var ipt = document.createElement("input");
  755. ipt.type = "text";
  756. ipt.className = "PUBD_save_path";
  757. ipt.name = "PUBD_save_path";
  758. ipt.value = getConfig("PUBD_save_path");
  759. divText.appendChild(ipt);
  760. //设置-类型命名
  761. var li = document.createElement("li");
  762. li.className = "thread type_name";
  763. var divTime = document.createElement("div");
  764. divTime.className = "time date";
  765. var divName = document.createElement("div");
  766. divName.className = "name";
  767. var divText = document.createElement("div");
  768. divText.className = "text";
  769. li.appendChild(divTime);
  770. li.appendChild(divName);
  771. li.appendChild(divText);
  772. ul.appendChild(li);
  773.  
  774. divName.innerHTML = "类型命名";
  775. divTime.innerHTML = "%{type_name}的内容"
  776.  
  777. var lbl = document.createElement("label");
  778. lbl.innerHTML = "单图:";
  779. var ipt = document.createElement("input");
  780. ipt.type = "text";
  781. ipt.className = "PUBD_type_name";
  782. ipt.name = "PUBD_type_name0";
  783. ipt.value = getConfig("PUBD_type_name0");
  784. lbl.appendChild(ipt);
  785. divText.appendChild(lbl);
  786.  
  787. var lbl = document.createElement("label");
  788. lbl.innerHTML = "多图:";
  789. var ipt = document.createElement("input");
  790. ipt.type = "text";
  791. ipt.className = "PUBD_type_name";
  792. ipt.name = "PUBD_type_name1";
  793. ipt.value = getConfig("PUBD_type_name1");
  794. lbl.appendChild(ipt);
  795. divText.appendChild(lbl);
  796.  
  797. var lbl = document.createElement("label");
  798. lbl.innerHTML = "动图:";
  799. var ipt = document.createElement("input");
  800. ipt.type = "text";
  801. ipt.className = "PUBD_type_name";
  802. ipt.name = "PUBD_type_name2";
  803. ipt.value = getConfig("PUBD_type_name2");
  804. lbl.appendChild(ipt);
  805. divText.appendChild(lbl);
  806.  
  807. var lbl = document.createElement("label");
  808. lbl.innerHTML = "漫画:";
  809. var ipt = document.createElement("input");
  810. ipt.type = "text";
  811. ipt.className = "PUBD_type_name";
  812. ipt.name = "PUBD_type_name3";
  813. ipt.value = getConfig("PUBD_type_name3");
  814. lbl.appendChild(ipt);
  815. divText.appendChild(lbl);
  816. //设置-多图掩码
  817. var li = document.createElement("li");
  818. li.className = "thread";
  819. var divTime = document.createElement("div");
  820. divTime.className = "time date";
  821. var divName = document.createElement("div");
  822. divName.className = "name";
  823. var divText = document.createElement("div");
  824. divText.className = "text";
  825. li.appendChild(divTime);
  826. li.appendChild(divName);
  827. li.appendChild(divText);
  828. ul.appendChild(li);
  829.  
  830. divName.innerHTML = "多图掩码内容";
  831. divTime.innerHTML = "替换%{multiple}的内容"
  832. var ipt = document.createElement("input");
  833. ipt.type = "text";
  834. ipt.className = "PUBD_multiple_mask";
  835. ipt.name = "PUBD_multiple_mask";
  836. ipt.value = getConfig("PUBD_multiple_mask");
  837. divText.appendChild(ipt);
  838.  
  839. //确定按钮行
  840. var confirmbar = document.createElement("div");
  841. confirmbar.className = "_notification-request-permission";
  842. confirmbar.style.display = "block";
  843. var btnConfirm = document.createElement("button");
  844. btnConfirm.className = "_button";
  845. btnConfirm.innerHTML = "确定";
  846. var btnCancel = document.createElement("button");
  847. btnCancel.className = "_button";
  848. btnCancel.innerHTML = "取消";
  849. btnCancel.onclick = function () { set.parentNode.removeChild(set); }
  850. var btnReset = document.createElement("button");
  851. btnReset.className = "_button";
  852. btnReset.innerHTML = "重置设置";
  853. btnReset.onclick = function () { ResetConfig(); }
  854. confirmbar.appendChild(btnConfirm);
  855. confirmbar.appendChild(btnCancel);
  856. confirmbar.appendChild(btnReset);
  857.  
  858. set.appendChild(h2);
  859. set.appendChild(ul);
  860. set.appendChild(confirmbar);
  861.  
  862. btnConfirm.onclick = function ()
  863. {
  864. setConfig("PUBD_PRC_path", document.getElementsByName("PUBD_PRC_path")[0].value);
  865. setConfig("PUBD_save_path", document.getElementsByName("PUBD_save_path")[0].value);
  866. setConfig("PUBD_type_name0", document.getElementsByName("PUBD_type_name0")[0].value);
  867. setConfig("PUBD_type_name1", document.getElementsByName("PUBD_type_name1")[0].value);
  868. setConfig("PUBD_type_name2", document.getElementsByName("PUBD_type_name2")[0].value);
  869. setConfig("PUBD_type_name3", document.getElementsByName("PUBD_type_name3")[0].value);
  870. setConfig("PUBD_multiple_mask", document.getElementsByName("PUBD_multiple_mask")[0].value);
  871.  
  872. btnCancel.onclick();
  873. }
  874.  
  875. return set;
  876. }
  877.  
  878. //生成导出下载窗口
  879. function buildExport() {
  880. var set = document.createElement("div");
  881. set.id = "PixivUserBatchDownloadExport";
  882. set.className = "notification-popup";
  883. set.style.display = "block";
  884. //自定义CSS
  885. var style = document.createElement("style");
  886. set.appendChild(style);
  887. style.type = "text/css";
  888. style.innerHTML +=
  889. [
  890. ".PUBD_batch" + "{\r\n" + [
  891. 'width:350px',
  892. 'max-width:350px',
  893. 'min-width:350px',
  894. 'min-height:100px',
  895. ].join(';\r\n') + "\r\n}",
  896. ].join('\r\n');
  897.  
  898. //标题行
  899. var h2 = document.createElement("h2");
  900. h2.innerHTML = "Aria2导出";
  901.  
  902. //设置内容
  903. var ul = document.createElement("ul");
  904. ul.className = "notification-list message-thread-list";
  905.  
  906. //导出-Batch
  907. var li = document.createElement("li");
  908. //li.className = "thread";
  909. //var divTime = document.createElement("div");
  910. //divTime.className = "time date";
  911. var divName = document.createElement("div");
  912. divName.className = "name";
  913. var divText = document.createElement("div");
  914. divText.className = "text";
  915. //li.appendChild(divTime);
  916. li.appendChild(divName);
  917. li.appendChild(divText);
  918. ul.appendChild(li);
  919.  
  920. divName.innerHTML = "命令行提示符批处理";
  921. //divTime.innerHTML = "保存为bat文件运行"
  922. var ipt = document.createElement("textarea");
  923. ipt.className = "PUBD_batch";
  924. ipt.name = "PUBD_batch";
  925. ipt.wrap = "off";
  926. divText.appendChild(ipt);
  927.  
  928. //导出-Down
  929. var li = document.createElement("li");
  930. //li.className = "thread";
  931. //var divTime = document.createElement("div");
  932. //divTime.className = "time date";
  933. //var divName = document.createElement("div");
  934. //divName.className = "name";
  935. var divText = document.createElement("div");
  936. divText.className = "text";
  937. //li.appendChild(divTime);
  938. //li.appendChild(divName);
  939. li.appendChild(divText);
  940. ul.appendChild(li);
  941.  
  942. //divName.innerHTML = "下载命令";
  943. //divTime.innerHTML = "保存为bat文件运行"
  944. var btnExport = document.createElement("a");
  945. btnExport.className = "_button";
  946. btnExport.name = "PUBD_down";
  947. btnExport.target = "_blank"
  948. btnExport.download = "aria2" + ".down"
  949. btnExport.innerHTML = "导出Aria2 *.down文件";
  950. //btnExport.onclick = function () { startProgram(2); }
  951. divText.appendChild(btnExport);
  952.  
  953. //确定按钮行
  954. var confirmbar = document.createElement("div");
  955. confirmbar.className = "_notification-request-permission";
  956. confirmbar.style.display = "block";
  957. var btnClose = document.createElement("button");
  958. btnClose.className = "_button";
  959. btnClose.innerHTML = "关闭";
  960. btnClose.onclick = function () { set.parentNode.removeChild(set); }
  961.  
  962. confirmbar.appendChild(btnClose);
  963.  
  964. set.appendChild(h2);
  965. set.appendChild(ul);
  966. set.appendChild(confirmbar);
  967. return set;
  968. }
  969.  
  970. //生成直接下载链接窗口
  971. function buildDirectLink()
  972. {
  973. var set = document.createElement("div");
  974. set.id = "PixivUserBatchDownloadDirectLink";
  975. set.className = "notification-popup";
  976. set.style.display = "block";
  977. //自定义CSS
  978. var style = document.createElement("style");
  979. set.appendChild(style);
  980. style.type = "text/css";
  981. style.innerHTML +=
  982. [
  983. ".PUBD_dLink" + "{\r\n" + [
  984. 'width:100%',
  985. 'height:300px',
  986. 'overflow:scroll',
  987. 'border:1px solid #becad8',
  988. ].join(';\r\n') + "\r\n}",
  989. "#PixivUserBatchDownloadDirectLink a" + "{\r\n" + [
  990. 'display:inline',
  991. 'padding:0',
  992. 'background:none',
  993. 'color: #258fb8',
  994. 'white-space:nowrap',
  995. ].join(';\r\n') + "\r\n}",
  996. ].join('\r\n');
  997.  
  998. //标题行
  999. var h2 = document.createElement("h2");
  1000. h2.innerHTML = "直接下载链接";
  1001.  
  1002. //设置内容
  1003. var ul = document.createElement("ul");
  1004. ul.className = "notification-list message-thread-list";
  1005.  
  1006. //导出-Batch
  1007. var li = document.createElement("li");
  1008. //li.className = "thread";
  1009. //var divTime = document.createElement("div");
  1010. //divTime.className = "time date";
  1011. var divName = document.createElement("div");
  1012. divName.className = "name";
  1013. var divText = document.createElement("div");
  1014. divText.className = "text";
  1015. //li.appendChild(divTime);
  1016. li.appendChild(divName);
  1017. li.appendChild(divText);
  1018. ul.appendChild(li);
  1019.  
  1020. divName.innerHTML = "用<a href=\"https://addons.mozilla.org/firefox/addon/downthemall/\" target=\"_blank\">DownThemAll!</a>的批量下载,重命名掩码设置为“*title*”<br />" +
  1021. "如果发生403错误,使用<a href=\"https://addons.mozilla.org/firefox/addon/referrer-control/\" target=\"_blank\">RefControl</a>添加站点“pixiv.net”,设置“伪装-发送站点根目录”";
  1022. //divTime.innerHTML = "保存为bat文件运行"
  1023. var ipt = document.createElement("div");
  1024. ipt.className = "PUBD_dLink";
  1025. divText.appendChild(ipt);
  1026.  
  1027. //确定按钮行
  1028. var confirmbar = document.createElement("div");
  1029. confirmbar.className = "_notification-request-permission";
  1030. confirmbar.style.display = "block";
  1031. var btnClose = document.createElement("button");
  1032. btnClose.className = "_button";
  1033. btnClose.innerHTML = "关闭";
  1034. btnClose.onclick = function () { set.parentNode.removeChild(set); }
  1035.  
  1036. confirmbar.appendChild(btnClose);
  1037.  
  1038. set.appendChild(h2);
  1039. set.appendChild(ul);
  1040. set.appendChild(confirmbar);
  1041. return set;
  1042. }
  1043.  
  1044. //检测下载完成情况
  1045. function startProgramCheck(mode) {
  1046. if (getPicNum > 0 && getPicNum >= dataset.illust_file_count) {
  1047. li2.innerHTML = "获取完成:" + getPicNum + "/" + dataset.illust_file_count;
  1048. startDownload(mode);
  1049. clearInterval(downOver);
  1050. }
  1051. else
  1052. {
  1053. li2.innerHTML = "已获取图像地址:" + getPicNum + "/" + dataset.illust_file_count;
  1054. var PUBD_batch = document.getElementsByName("PUBD_batch")[0];
  1055. if (PUBD_batch) PUBD_batch.value = li2.innerHTML;
  1056. var PUBD_dLink = document.getElementsByClassName("PUBD_dLink")[0];
  1057. if (PUBD_dLink) PUBD_dLink.innerHTML = li2.innerHTML;
  1058. }
  1059. console.log("获取" + getPicNum + "/" + dataset.illust_file_count);
  1060. }
  1061. //开始构建下载
  1062. function startDownload(mode) {
  1063. switch (mode)
  1064. {
  1065. case 0: //RPC模式
  1066. var aria2 = new ARIA2(getConfig("PUBD_PRC_path"));
  1067.  
  1068. for (ii = 0; ii < dataset.illust.length; ii++) {
  1069. var ill = dataset.illust[ii];
  1070. for (pi = 0; pi < ill.original_src.length; pi++) {
  1071. aria2.addUri(ill.original_src[pi], {
  1072. "out": replacePathSafe(showMask(getConfig("PUBD_save_path"), ill, pi)),
  1073. "referer": ill.url,
  1074. "remote-time": "true",
  1075. "allow-overwrite": "false",
  1076. "auto-file-renaming": "false"
  1077. });
  1078. }
  1079. }
  1080. alert("全部发送完毕");
  1081. break;
  1082. case 1: //生成BAT下载命令模式
  1083. var txt = "";
  1084. var downtxt = "";
  1085. for (ii = 0; ii < dataset.illust.length; ii++)
  1086. {
  1087. var ill = dataset.illust[ii];
  1088. for (pi = 0; pi < ill.original_src.length; pi++)
  1089. {
  1090. txt += "aria2c --allow-overwrite=false --auto-file-renaming=false --remote-time=true --out=\"" + replacePathSafe(showMask(getConfig("PUBD_save_path"), ill, pi)) + "\" --referer=\"" + ill.url + "\" \"" + ill.original_src[pi] + "\"";
  1091. downtxt += ill.original_src[pi]
  1092. + "\r\n out=" + replacePathSafe(showMask(getConfig("PUBD_save_path"), ill, pi))
  1093. + "\r\n referer=" + ill.url
  1094. + "\r\n allow-overwrite=false"
  1095. + "\r\n auto-file-renaming=false"
  1096. + "\r\n remote-time=true"
  1097. ;
  1098. txt += "\r\n";
  1099. downtxt += "\r\n\r\n";
  1100. }
  1101. }
  1102. var txta = document.getElementsByName("PUBD_batch")[0];
  1103. var btn = document.getElementsByName("PUBD_down")[0];
  1104. if (txta) txta.value = txt;
  1105. var downurl = "data:text/html;charset=utf-8," + encodeURIComponent(downtxt);
  1106. if (btn)
  1107. {
  1108. btn.href = downurl;
  1109. btn.download = dataset.user_id + "_" + dataset.user_name + ".down"
  1110. }
  1111. //console.log(txt);
  1112. break;
  1113. case 2: //生成直接下载链接模式
  1114. var linksDom = document.getElementsByClassName("PUBD_dLink")[0];
  1115. linksDom.innerHTML = "";
  1116. for (ii = 0; ii < dataset.illust.length; ii++)
  1117. {
  1118. var ill = dataset.illust[ii];
  1119. for (pi = 0; pi < ill.original_src.length; pi++)
  1120. {
  1121. var dlink = document.createElement("a");
  1122. var br = document.createElement("br");
  1123. dlink.href = ill.original_src[pi];
  1124. dlink.title = replacePathSafe(showMask(getConfig("PUBD_save_path"), ill, pi));
  1125. dlink.innerHTML = showMask("%{illust_id}_%{title}_p%{page}", ill, pi);
  1126. linksDom.appendChild(dlink);
  1127. linksDom.appendChild(br);
  1128. }
  1129. }
  1130. break;
  1131. default:
  1132. alert("未知的下载模式");
  1133. break;
  1134. }
  1135. //console.log(dataset);
  1136. };
  1137. function getConfig(key)
  1138. {
  1139. if (window.localStorage)
  1140. {
  1141. return window.localStorage.getItem(key) || "";
  1142. } else
  1143. {
  1144. console.log("浏览器不支持本地储存。");
  1145. }
  1146. };
  1147. function setConfig(key, value)
  1148. {
  1149. if (window.localStorage)
  1150. {
  1151. window.localStorage.setItem(key, value);
  1152. } else
  1153. {
  1154. console.log("浏览器不支持本地储存。");
  1155. }
  1156. };
  1157. function ResetConfig() {
  1158. setConfig("PUBD_reset", "1");
  1159. setConfig("PUBD_PRC_path", "http://localhost:6800/jsonrpc");
  1160. setConfig("PUBD_save_path", "%{user_id}_%{user_name}\\%{multiple}%{filename}.%{extention}");
  1161. setConfig("PUBD_type_name0", "");
  1162. setConfig("PUBD_type_name1", "multiple");
  1163. setConfig("PUBD_type_name2", "ugoku");
  1164. setConfig("PUBD_type_name3", "manga");
  1165. setConfig("PUBD_multiple_mask", "%{illust_id}_%{title}\\");
  1166.  
  1167. if (document.getElementsByName("PUBD_PRC_path")[0]) document.getElementsByName("PUBD_PRC_path")[0].value = getConfig("PUBD_PRC_path");
  1168. if (document.getElementsByName("PUBD_save_path")[0]) document.getElementsByName("PUBD_save_path")[0].value = getConfig("PUBD_save_path");
  1169. if (document.getElementsByName("PUBD_type_name0")[0]) document.getElementsByName("PUBD_type_name0")[0].value = getConfig("PUBD_type_name0");
  1170. if (document.getElementsByName("PUBD_type_name1")[0]) document.getElementsByName("PUBD_type_name1")[0].value = getConfig("PUBD_type_name1");
  1171. if (document.getElementsByName("PUBD_type_name2")[0]) document.getElementsByName("PUBD_type_name2")[0].value = getConfig("PUBD_type_name2");
  1172. if (document.getElementsByName("PUBD_type_name3")[0]) document.getElementsByName("PUBD_type_name3")[0].value = getConfig("PUBD_type_name3");
  1173. if (document.getElementsByName("PUBD_multiple_mask")[0]) document.getElementsByName("PUBD_multiple_mask")[0].value = getConfig("PUBD_multiple_mask");
  1174. };
  1175.  
  1176. function showMask(str,ill,index)
  1177. {
  1178. var newTxt = str;
  1179. var regMask = /%{([^}]+)}/g;
  1180. var rs = regMask.exec(str);
  1181. while (rs != null) {
  1182. if (rs[1] == "multiple")
  1183. {
  1184. var rp = "";
  1185. if (ill.type == 1)
  1186. {
  1187. 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))
  1188. console.log("掩码中存在循环自身引用");
  1189. else
  1190. var rp = showMask(getConfig("PUBD_multiple_mask"), ill, index);
  1191. }
  1192. newTxt = newTxt.replace(rs[0], rp);
  1193. }
  1194. else if (rs[1] == "type_name")
  1195. {
  1196. var rp = "";
  1197. 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))
  1198. console.log("掩码中存在循环自身引用");
  1199. else
  1200. var rp = showMask(getConfig("PUBD_type_name" + ill.type), ill, index);
  1201. newTxt = newTxt.replace(rs[0], rp);
  1202. }
  1203. else if (rs[1] == "page")
  1204. newTxt = newTxt.replace(rs[0], index);
  1205. else if (rs[1] == "filename" || rs[1] == "extention" || rs[1] == "original_src")
  1206. newTxt = newTxt.replace(rs[0], ill[rs[1]][index]);
  1207. else if (ill[rs[1]] != undefined)
  1208. newTxt = newTxt.replace(rs[0], ill[rs[1]]);
  1209. else if (dataset[rs[1]] != undefined)
  1210. newTxt = newTxt.replace(rs[0], dataset[rs[1]]);
  1211. var rs = regMask.exec(str);
  1212. }
  1213. return newTxt;
  1214. }
  1215.  
  1216. function replacePathSafe(str) //去除Windows下无法作为文件名的字符
  1217. {
  1218. return str.replace(/[\/|:|\*|\?|"|<|>|]/ig, "_");
  1219. }
  1220. })();