├── .github ├── ISSUE_TEMPLATE.md └── workflows │ └── npm-test.yml ├── Dockerfile ├── README.md ├── _build └── pack_up.js ├── archive ├── 163.js ├── 23us.2018.js ├── 23us.js ├── 2manhua.js ├── 36mh.js ├── 37yue.js ├── 50mh.js ├── 517.js ├── 57mh.js ├── 733mh.js ├── 76.js ├── 81xsw.js ├── 88bag.js ├── 999comics.js ├── AlphaPolis_2016-20170619.js ├── MAGCOMI.js ├── OVERLAP.js ├── XOY.js ├── aikanmh.js ├── biquge.js ├── buka.js ├── ck101.js ├── comico.js ├── comico_jp.js ├── comico_jp_plus.js ├── dagu.js ├── dmeden.js ├── duoduomh.js ├── emw.js ├── hhcool.js ├── iqg365.js ├── manhuatai.2018.js ├── nokiacn.js ├── ohmanhua.js ├── r2hm.js ├── remanba.js ├── renamer_nyaa.js ├── tohomh.js ├── wuyouhui.js ├── xbiquge.js ├── yinvmh.js └── youma.js ├── arrangement ├── classify_and_compress.js ├── list_kuaiZip.js ├── recover_mulitiple_downloaded_bad_file.js └── renamer.js ├── book.cmn-Hant-TW ├── ebookservice.js ├── epub_hans_to_hant.js ├── fetch_all_links.js ├── ljswio.js └── podcasts.js ├── comic.cmn-Hans-CN ├── 1kkk.js ├── 733dm.js ├── 90mh.js ├── 930mh.js ├── baozimh.org.js ├── baozimh_cn.js ├── bilibili.js ├── comic.cmn-Hans-CN.bat ├── dajiaochong.js ├── dm5.js ├── dmzj.js ├── dongman.js ├── gufengmh.js ├── hanmanwo.js ├── kanman.js ├── katui.js ├── kuaikan.js ├── manhuacat.js ├── manhuadb.js ├── manhuagui.js ├── manhuaniu.js ├── mh1234.js ├── mh160.js ├── migudm.js ├── mymhh.js ├── pufei.js ├── qiman5.js ├── qq.bat ├── qq.js ├── sfacg.js ├── taduo.js ├── toomics_sc.js ├── u17.js └── weibo.js ├── comic.cmn-Hant-TW ├── 18comic.chapter.html ├── 18comic.js ├── 18comic.work.html ├── baozimh.js ├── cartoonmad.js ├── comicbus.js ├── dogemanga.js ├── manhuagui_tw.js ├── toomics_tc.js └── webtoon.js ├── comic.en-US ├── bookcube.js ├── mrblue.js ├── toomics_en.js └── webtoon_en.js ├── comic.ja-JP ├── AlphaPolis_official_manga.js ├── AlphaPolis_user_manga.js ├── ComicWalker.js ├── cycomi.js ├── moae.js ├── nico_seiga.js ├── tmca.js └── youngaceup.js ├── document ├── README.cmn-Hans-CN.md ├── README.cmn-Hant-TW.md ├── README.en-US.md └── README.ja-JP.md ├── gui_electron ├── gui_electron.css ├── gui_electron.html ├── gui_electron.js ├── gui_electron_functions.js └── icon │ ├── rasen2.ico │ └── rasen2.png ├── novel.cmn-Hans-CN ├── 51shucheng.js ├── 630book.js ├── 69shu.js ├── 88dus.js ├── biqizw.js ├── biqugse.js ├── booktxt.js ├── cwjjj.js ├── daocaoren.js ├── ecxs.js ├── fxnzw.js ├── huaxiangju.js ├── kanshushenzhan.js ├── kanunu.js ├── luoxia.js ├── novel.cmn-Hans-CN.bat ├── piaotian.js ├── qidian.js ├── quanben.js ├── x81zw.js ├── xbiquge.cc.js ├── xbiquge.so.js ├── xbiquke.js ├── xshuyaya.js ├── zhuishubang.js └── zwdu.js ├── novel.ja-JP ├── AlphaPolis.js ├── Hameln.js ├── kakuyomu.js ├── mid.js ├── mnlt.js ├── noc.js ├── novel.ja-JP.bat └── yomou.js ├── package.json ├── start_gui_electron.bat ├── start_gui_electron.sh ├── work_crawler.default_configuration.js ├── work_crawler.updater.js └── work_crawler_loader.js /.github/ISSUE_TEMPLATE.md: -------------------------------------------------------------------------------- 1 |  23 | 24 | * **Version**: 25 | * **Interface**: 26 | * **Arguments**: 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /.github/workflows/npm-test.yml: -------------------------------------------------------------------------------- 1 | # https://github.com/actions/starter-workflows/blob/main/ci/node.js.yml 2 | # This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node 3 | # For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions 4 | 5 | name: Node.js CI test 6 | 7 | on: 8 | push: 9 | branches: [ master ] 10 | pull_request: 11 | branches: [ master ] 12 | 13 | jobs: 14 | test: 15 | 16 | runs-on: ubuntu-latest 17 | 18 | strategy: 19 | matrix: 20 | # 0.12.x will cause `Fatal error in ../deps/v8/src/lookup.cc, line 47` 21 | # https://github.com/kanasimi/CeJS/runs/2105877783?check_suite_focus=true 22 | node-version: [ 0.10.x, 14.x, 16.x ] 23 | # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ 24 | 25 | steps: 26 | - uses: actions/checkout@v2 27 | - name: Use Node.js ${{ matrix.node-version }} 28 | uses: actions/setup-node@v1 29 | with: 30 | node-version: ${{ matrix.node-version }} 31 | #- run: npm ci 32 | #- run: npm run build --if-present 33 | - run: npm run test 34 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | # https://hub.docker.com/r/kanasimi/work_crawler 2 | 3 | # https://www.jinnsblog.com/2018/12/docker-dockerfile-guide.html 4 | # https://nodejs.org/zh-cn/docs/guides/nodejs-docker-webapp/ 5 | # https://ithelp.ithome.com.tw/articles/10192519 6 | # https://www.electron.build/multi-platform-build#docker 7 | 8 | # https://github.com/nodejs/docker-node 9 | # https://hub.docker.com/_/node/ 10 | # https://derickbailey.com/2017/03/09/selecting-a-node-js-image-for-docker/ 11 | FROM node:12 12 | # FROM electronuserland/builder 13 | 14 | # Create app directory 15 | WORKDIR /app 16 | # copy files 17 | COPY work_crawler.updater.js /app 18 | RUN ["node", "work_crawler.updater.js"] 19 | 20 | # application's default port 21 | EXPOSE 80 22 | 23 | CMD ["sh", "-c", "cd work_crawler-master && sh start_gui_electron.sh"] 24 | 25 | # docker build . 26 | # docker image ls 27 | # docker tag {DOCKER_IMAGE_ID} kanasimi/work_crawler:2.1.0 28 | # docker push kanasimi/work_crawler 29 | 30 | # docker pull kanasimi/work_crawler 31 | # docker run -it --rm --name kanasimi/work_crawler 32 | # Enter the container 33 | # docker exec -it kanasimi/work_crawler /bin/bash 34 | 35 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![GitHub release](https://img.shields.io/github/release/kanasimi/work_crawler.svg)](https://github.com/kanasimi/work_crawler/releases/latest/) 2 | ![GitHub Release Date](https://img.shields.io/github/release-date/kanasimi/work_crawler.svg) 3 | ![Github commits (since latest release)](https://img.shields.io/github/commits-since/kanasimi/work_crawler/latest.svg) 4 | ![GitHub commit activity the past week, 4 weeks, year](https://img.shields.io/github/commit-activity/y/kanasimi/work_crawler.svg) 5 | [![Github All Releases Downloads](https://img.shields.io/github/downloads/kanasimi/work_crawler/total.svg)](https://github.com/kanasimi/work_crawler/releases) 6 | [![Known Vulnerabilities](https://snyk.io/test/github/kanasimi/work_crawler/badge.svg?targetFile=package.json)](https://snyk.io/test/github/kanasimi/work_crawler?targetFile=package.json) 7 | [![codebeat badge](https://codebeat.co/badges/3a891138-ee8a-411a-90dd-20513f4f6a2b)](https://codebeat.co/projects/github-com-kanasimi-work_crawler-master) 8 | 12 | 13 | # CeJS online novels / comics downloader 14 | - [en] Tools to download novels (→ epub) and comics.
15 | → **[English document](document/README.en-US.md)** 16 | - [TW] 批量下載小說 (→ epub)、漫畫網站作品的工具。
17 | → **[繁體中文說明](document/README.cmn-Hant-TW.md)** 18 | - [CN] 批量下载小说 (→ epub)、漫画网站作品的网络爬虫。
19 | → **[简体中文说明](document/README.cmn-Hans-CN.md)** 20 | - [ja] ウェブ小説 (→ epub)、ウェブ漫画作品を一括ダウンロードツール。
21 | → **[日本語の説明](document/README.ja-JP.md)** 22 | 23 | ## Language support 多語言支援 24 | Welcome to join [the translating project](https://github.com/kanasimi/work_crawler/issues/185)! [一緒に翻訳しましょう](https://github.com/kanasimi/work_crawler/issues/185)! 25 | 26 | | Language 語言 | Support 支援狀況 | README.md | 27 | |---|:---:|---| 28 | | 繁體中文 | ✔️ | [繁體中文說明](document/README.cmn-Hant-TW.md) | 29 | | 简体中文 | ✔️ | [简体中文说明](document/README.cmn-Hans-CN.md) | 30 | | English | ✔️ | [English document](document/README.en-US.md) | 31 | | Português brasileiro | 🚧 | 32 | | 日本語 | 🚧 | [日本語の説明](document/README.ja-JP.md) | 33 | | 한국어 | 🚧 | 34 | 35 | ## OS support 作業系統支援 36 | | Platform 作業系統平臺 | Support 支援狀況 | 37 | |---|:---:| 38 | | Windows | ✔️ | 39 | | macOS | ✔️ | 40 | | UNIX, Linux | ✔️ | 41 | 42 | 43 | ## Interface 支援介面 44 | | Interface 介面/界面 インターフェース | Support 支援狀況 | 45 | |---|:---:| 46 | | [GUI](https://en.wikipedia.org/wiki/Graphical_user_interface) 視窗/图形 グラフィカル | ✔️ | 47 | | [CLI](https://en.wikipedia.org/wiki/Command-line_interface) 命令列/命令行 コマンドライン | ✔️ | 48 | | API 應用程式介面 | ✔️ | 49 | 50 | ## Features 特點 51 | GUI supports different languages: 視窗型態介面支援不同語系: 52 | ![支援不同語系](https://lh3.googleusercontent.com/-EOQgYAap6YPw7iKQRlvlA4-fr37-4SddypCw44H2uhgpgmQ6FtpjjJ-qg_gJHbwfNRn8GNvvoYqE46yIQwg3xOVzR-5mzfqX8tPhOM06iYdF2gXOuIddcN5rNlCMhmmIxYye7SX8g=w2400) 53 | 54 | Many download options: 有許多可調整的下載選項: 55 | ![有許多可調整的下載選項](https://lh3.googleusercontent.com/uEUr-iYs1JKoZukar44sOqxSL908uPTSjSG4eDco-O8bFjjIFkxSRsPy2UMkcnI3Z7Hfn-zZ2wdE9OjRr1CQZs_DfoGjvJLBCoRg9g4GH-JxG9ZpwT8fX8srn958jBzJzNbWcMvdIg=w2400) 56 | 57 | Optional dark theme: 可選用暗色系主題: 58 | ![暗色系主題](https://lh3.googleusercontent.com/qS2i8iJTQ21bY8_IbHkBDG0__svP_zJIaYXKREbXW3lNmYA4XyJVLfJ0eyvJ6mb_k0jmGXNLRmKsngfdob-lkrLrHq9HLkcP3vVgXxx4ZQLbA85o7bRAurPiN_-Py3t7AZoop5S78g=w2400) 59 | 60 | Search websites and download works with one click: 能一鍵搜尋各網站與下載作品: 61 | ![一鍵搜尋各網站與下載作品](https://lh3.googleusercontent.com/pz0zKuF5-kxFle8EgoUMfNAF7V8Kq6M_Dw9HVBvbXrF3hIW94voHHstMSsoZXmmmuVCxCk-Tfev6g0OJ2Ee7aZViYGiCB9hi5lJRlJ0r0eY9KjYkgW-BV2OOq8fPwp0Hi8RylR-YQQ=w2400) 62 | -------------------------------------------------------------------------------- /archive/163.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 批量下載网易漫画的工具。 Download 163 comics. 3 | */ 4 | 5 | 'use strict'; 6 | 7 | require('../work_crawler_loader.js'); 8 | 9 | // ---------------------------------------------------------------------------- 10 | 11 | var crawler = new CeL.work_crawler({ 12 | // recheck:從頭檢測所有作品之所有章節。 13 | // recheck : true, 14 | // one_by_one : true, 15 | 16 | // 2017/4: https://manhua.163.com/ 17 | // 2019/5: 網易漫畫網址更動 → https://163.bilibili.com/ 18 | base_URL : 'https://163.bilibili.com/', 19 | 20 | // allow .jpg without EOI mark. 21 | // allow_EOI_error : true, 22 | // 當圖像檔案過小,或是被偵測出非圖像(如不具有EOI)時,依舊強制儲存檔案。 23 | // skip_error : true, 24 | 25 | // 解析 作品名稱 → 作品id get_work() 26 | search_URL : 'search/book/key/hints.json?key=', 27 | parse_search_result : function(html, get_label) { 28 | html = JSON.parse(html).books.data; 29 | var id_list = html.map(function(book) { 30 | book.title = get_label(book.title); 31 | return book.id = book.bookId; 32 | }); 33 | return [ id_list, html ]; 34 | }, 35 | // id_of_search_result : function(cached_data) { return cached_data; }, 36 | title_of_search_result : 'title', 37 | 38 | // 取得作品的章節資料。 get_work_data() 39 | work_URL : 'source/', 40 | parse_work_data : function(html, get_label) { 41 | var title = get_label(html.between( 42 | '

', '

')), 43 | // 44 | text = html.between('
', 45 | '
'), 46 | // 47 | matched, PATTERN = /
([^<>]+)<\/dt>[\s\n]*
([\s\S]+?)<\/dd>/g, 48 | // 49 | // work_data={id,title,author,authors,chapter_count,last_update,last_download:{date,chapter}} 50 | work_data = { 51 | // 必要屬性:須配合網站平台更改。 52 | title : title, 53 | 54 | // 選擇性屬性:須配合網站平台更改。 55 | author : get_label(html.between( 56 | '
', '<')), 57 | last_update : get_label(html.between( 58 | // 59 | '
= 2 96 | work_data.chapter_list = []; 97 | function add_section(section) { 98 | if (Array.isArray(section.sections)) { 99 | // assert: section.leaf === false 100 | var title_hierarchy = this.clone(); 101 | title_hierarchy.push(section.fullTitle); 102 | CeL.debug(title_hierarchy.join(' - '), 2); 103 | section.sections.forEach(add_section, title_hierarchy); 104 | } else { 105 | // assert: section.leaf && section.sectionId 106 | CeL.debug(section.fullTitle, 3); 107 | section.title_hierarchy = this; 108 | work_data.chapter_list.push(section); 109 | } 110 | } 111 | 112 | chapter_json.forEach(add_section, []); 113 | }, 114 | 115 | // 取得每一個章節的各個影像內容資料。 get_chapter_data() 116 | chapter_URL : function(work_data, chapter_NO) { 117 | return 'reader/' + work_data.id + '/' 118 | + work_data.chapter_list[chapter_NO - 1].sectionId; 119 | }, 120 | parse_chapter_data : function(html, work_data, get_label, chapter_NO) { 121 | var seedLength = html.between('window.DATA.seedLength = ', ';') | 0, 122 | // 123 | chapter_data = html.between('window.PG_CONFIG', ''); 124 | if (!seedLength && !chapter_data) { 125 | chapter_data = html 126 | // e.g., 太子:

因版权限制,您所在的地区无法观看,敬请海涵

127 | .between('
', '
'); 128 | chapter_data = get_label(chapter_data.between('

', '

') 129 | || chapter_data); 130 | this.onerror(chapter_data || 'No chapter data get', work_data); 131 | return; 132 | } 133 | 134 | chapter_data = 'chapter_data' 135 | // 136 | + chapter_data.replace(/window\.PG_CONFIG/g, 'chapter_data') 137 | // 改成 true 會下載 webp 138 | .replace(/window\.IS_SUPPORT_WEBP/g, 'false'); 139 | // console.log(chapter_data); 140 | eval(chapter_data); 141 | 142 | // 設定必要的屬性。 143 | chapter_data.title = chapter_data.section.fullTitle; 144 | chapter_data.image_list = chapter_data.images; 145 | // 2017/6/15 改版。 146 | chapter_data.images.forEach(function(image) { 147 | image.url = image.url.slice(0, -seedLength); 148 | }); 149 | 150 | chapter_data.limited = work_data.chapter_list[chapter_NO - 1].needPay; 151 | 152 | return chapter_data; 153 | } 154 | }); 155 | 156 | // ---------------------------------------------------------------------------- 157 | 158 | // CeL.set_debug(3); 159 | 160 | start_crawler(crawler, typeof module === 'object' && module); 161 | -------------------------------------------------------------------------------- /archive/23us.2018.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 批量下載2016 顶点小说(http://www.23us.cc)的工具。 Download 23us novels. 3 | */ 4 | 5 | 'use strict'; 6 | 7 | require('../work_crawler_loader.js'); 8 | 9 | // ---------------------------------------------------------------------------- 10 | 11 | CeL.run('application.net.work_crawler.sites.PTCMS'); 12 | 13 | // ---------------------------------------------------------------------------- 14 | 15 | var crawler = CeL.PTCMS({ 16 | // 23us 在連續下載2000章左右後似乎會自動404,得要等如3分鐘才會回復。 17 | // 明確指定自上次下載過的章節接續下載。 18 | // recheck : false, 19 | 20 | base_URL : 'https://www.23us.cc/', 21 | 22 | // 解析 作品名稱 → 作品id get_work() 23 | baidu_cse : '1682272515249779940', 24 | 25 | // 取得作品的章節資料。 get_work_data() 26 | work_URL : function(work_id) { 27 | return 'html/' + (work_id.slice(0, -3) || 0) + '/' + work_id + '/'; 28 | }, 29 | // 取得包含章節列表的文字範圍。 30 | get_chapter_list_contents : function(html) { 31 | return html.between('
', '
'); 32 | } 33 | }); 34 | 35 | // ---------------------------------------------------------------------------- 36 | 37 | // CeL.set_debug(3); 38 | 39 | start_crawler(crawler, typeof module === 'object' && module); 40 | -------------------------------------------------------------------------------- /archive/23us.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 批量下載 2011 顶点小说 的工具。 Download 23us novels. 3 | * 4 | * 這網站可能使用 PTCMS? 5 | */ 6 | 7 | 'use strict'; 8 | 9 | require('../work_crawler_loader.js'); 10 | 11 | // ---------------------------------------------------------------------------- 12 | 13 | CeL.run('application.storage.EPUB'); 14 | 15 | // ---------------------------------------------------------------------------- 16 | 17 | var crawler = new CeL.work_crawler({ 18 | // auto_create_ebook, automatic create ebook 19 | // MUST includes CeL.application.locale! 20 | need_create_ebook : true, 21 | // recheck:從頭檢測所有作品之所有章節與所有圖片。不會重新擷取圖片。對漫畫應該僅在偶爾需要從頭檢查時開啟此選項。default:false 22 | // recheck='changed': 若是已變更,例如有新的章節,則重新下載/檢查所有章節內容。否則只會自上次下載過的章節接續下載。 23 | recheck : 'changed', 24 | 25 | // one_by_one : true, 26 | 27 | // 2020/2/29: https://www.x23us.com/ 28 | base_URL : 'https://www.23ddw.cc/', 29 | charset : 'gbk', 30 | 31 | // 解析 作品名稱 → 作品id get_work() 32 | search_URL : 'modules/article/search.php?searchtype=keywords&searchkey=', 33 | parse_search_result : function(html, get_label) { 34 | // console.log(html); 35 | var matched = html.match(/og:url" content="[^<>"]+?\/(\d+)\/?"/); 36 | if (matched) { 37 | return [ [ +matched[1] ], 38 | // 39 | [ get_label(html.between('

', '

').replace('全文阅读', '')) ] ]; 40 | } 41 | 42 | var id_data = [], 43 | // {Array}id_list = [id,id,...] 44 | id_list = []; 45 | 46 | // 47 | // 48 | html.between('').each_between('', '', 49 | // 51 | function(text) { 52 | // console.log(text); 53 | var matched = text.match( 54 | // 55 | /]*>([\s\S]+?)<\/a>/); 56 | if (!matched) 57 | return; 58 | id_list.push(+matched[1]); 59 | id_data.push(get_label(matched[2])); 60 | }); 61 | 62 | return [ id_list, id_data ]; 63 | }, 64 | 65 | // 取得作品的章節資料。 get_work_data() 66 | work_URL : 'book/', 67 | parse_work_data : function(html, get_label, extract_work_data) { 68 | var work_data = { 69 | // 必要屬性:須配合網站平台更改。 70 | title : get_label(html.between('

', '

') 71 | // 72 | .replace('全文阅读', '')), 73 | 74 | // 選擇性屬性:須配合網站平台更改。 75 | image : html.between('全文阅读', '').between('src="', 76 | '"'), 77 | description : html.between('内容简介:

', 78 | '
元尊搜索结果
元尊
') 80 | 81 | }, get_next_between = html.between(' id="at">', '') 82 | .find_between('>', '<'), text; 83 | 84 | extract_work_data(work_data, html.between(' id="at">', ''), 85 | /([\s\S]+?)<\/th>([\s\S]+?)<\/td>/g); 86 | 87 | extract_work_data(work_data, html); 88 | 89 | html.between('

', '

') 90 | // 91 | .each_between('', '', function(text) { 92 | work_data.status.push(get_label(text)); 93 | }); 94 | 95 | Object.assign(work_data, { 96 | // 選擇性屬性:須配合網站平台更改。 97 | // e.g., 连载中, 連載中 98 | status : work_data.文章状态, 99 | category : work_data.文章类别, 100 | author : work_data.文章作者, 101 | last_update : work_data.最后更新, 102 | site_name : '顶点小说' 103 | }); 104 | 105 | work_data.site_name = work_data.site_name.between(null, ' '); 106 | 107 | if (work_data.image 108 | // 處理特殊圖片: ignore site default image 109 | // http://www.23us.com/modules/article/images/nocover.jpg 110 | && work_data.image.includes('nocover.jpg')) { 111 | delete work_data.image; 112 | } 113 | 114 | // console.log(work_data); 115 | return work_data; 116 | }, 117 | // 對於章節列表與作品資訊分列不同頁面(URL)的情況,應該另外指定.chapter_list_URL。 118 | chapter_list_URL : function(work_id) { 119 | return 'html/' + (work_id / 1000 | 0) + '/' + work_id + '/'; 120 | }, 121 | get_chapter_list : function(work_data, html, get_label) { 122 | work_data.chapter_list = []; 123 | html.between(' id="at">', '
', '
') 144 | }); 145 | } 146 | }); 147 | 148 | // ---------------------------------------------------------------------------- 149 | 150 | // CeL.set_debug(3); 151 | 152 | start_crawler(crawler, typeof module === 'object' && module); 153 | -------------------------------------------------------------------------------- /archive/2manhua.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 批量下載爱漫画的工具。 Download 2manhua comics. 3 | * 4 | * 爱漫画 by 漫画之家 http://www.manhuazj.com/ 5 | */ 6 | 7 | 'use strict'; 8 | 9 | require('../work_crawler_loader.js'); 10 | 11 | // ---------------------------------------------------------------------------- 12 | 13 | var crawler = new CeL.work_crawler({ 14 | // 所有的子檔案要修訂註解說明時,應該都要順便更改在CeL.application.net.comic中Comic_site.prototype內的母comments,並以其為主體。 15 | 16 | // 本站常常無法取得圖片,因此得多重新檢查。 17 | // recheck:從頭檢測所有作品之所有章節與所有圖片。不會重新擷取圖片。對漫畫應該僅在偶爾需要從頭檢查時開啟此選項。 18 | // recheck : true, 19 | // 當無法取得chapter資料時,直接嘗試下一章節。在手動+監視下recheck時可併用此項。 20 | // skip_chapter_data_error : true, 21 | 22 | // 當圖像檔案過小,或是被偵測出非圖像(如不具有EOI)時,依舊強制儲存檔案。 23 | skip_error : true, 24 | 25 | // one_by_one : true, 26 | base_URL : 'http://www.2manhua.com/', 27 | 28 | // 取得伺服器列表。 29 | // use_server_cache : true, 30 | server_URL : function() { 31 | // http://www.2manhua.com/templates/default/scripts/configs.js?v=1.0.3 32 | return this.base_URL + 'templates/default/scripts/configs.js'; 33 | }, 34 | parse_server_list : function(html) { 35 | return Object.values(JSON.parse( 36 | // 37 | html.replace(/^[^{]+/, '').replace(/[^}]+$/, '') 38 | // 39 | .replace(/'/g, '"')).host) 40 | // 41 | .map(function(server_data) { 42 | return server_data[0]; 43 | }); 44 | }, 45 | 46 | // 解析 作品名稱 → 作品id get_work() 47 | search_URL : 'handler/suggest?cb=_&key=', 48 | parse_search_result : function(html) { 49 | // e.g., 50 | // _([{"id":"28015","t":"民工勇者","u":"/comic/28015/","cid":"/comic/28015/0208","ct":"207话","s":"0"},{"id":"28093","t":"无敌勇者王(民工勇者)","u":"/comic/28093/","cid":"/comic/28093/02","ct":"199话","s":"0"}]) 51 | var id_data = html ? JSON.parse(html.between('(').replace(/\)[^)]*$/, 52 | '')) : []; 53 | return [ id_data, id_data ]; 54 | }, 55 | id_of_search_result : function(cached_data) { 56 | return cached_data.id | 0; 57 | }, 58 | title_of_search_result : 't', 59 | 60 | // 取得作品的章節資料。 get_work_data() 61 | work_URL : function(work_id) { 62 | // e.g., http://www.2manhua.com/comic/25652.html 63 | return 'comic/' + work_id + '.html'; 64 | }, 65 | parse_work_data : function(html, get_label, extract_work_data) { 66 | var work_data = { 67 | // 必要屬性:須配合網站平台更改。 68 | title : html.between('og:novel:title" content="', '"') 69 | || html.between('

', '

'), 70 | 71 | // 選擇性屬性:須配合網站平台更改。 72 | // 73 | status : html.between(''), 75 | description : get_label(html.between('"intro-all"', '
') 76 | .between('>')) 77 | }; 78 | // 由 meta data 取得作品資訊。 79 | extract_work_data(work_data, html); 80 | extract_work_data(work_data, html.between('book-detail', 'intro-act'), 81 | /([^<>]+?)<\/strong>(.+?)<\/span>/g); 82 | return work_data; 83 | }, 84 | get_chapter_list : function(work_data, html) { 85 | work_data.chapter_list = []; 86 | var matched, page, 87 | // 2017/7/22 88 | PATTERN_page = /
'); 31 | } 32 | }); 33 | 34 | // ---------------------------------------------------------------------------- 35 | 36 | // CeL.set_debug(3); 37 | 38 | start_crawler(crawler, typeof module === 'object' && module); 39 | -------------------------------------------------------------------------------- /archive/88bag.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 批量下載 188漫画网 的工具。 Download 88bag comics. 3 | * 4 | * @see qTcms 晴天漫画程序 晴天漫画系统 手机端 http://manhua3.qingtiancms.com/ 5 | */ 6 | 7 | 'use strict'; 8 | 9 | require('../work_crawler_loader.js'); 10 | 11 | // ---------------------------------------------------------------------------- 12 | 13 | CeL.run('application.net.work_crawler.sites.qTcms2017'); 14 | 15 | // ---------------------------------------------------------------------------- 16 | 17 | var crawler = CeL.qTcms2017({ 18 | // 圖像檔案下載失敗處理方式:忽略/跳過圖像錯誤。當404圖像不存在、檔案過小,或是被偵測出非圖像(如不具有EOI)時,依舊強制儲存檔案。default:false 19 | skip_error : true, 20 | 21 | // {Natural}最小容許圖案檔案大小 (bytes)。 22 | // MIN_LENGTH : 500, 23 | 24 | base_URL : 'http://m.88bag.net/' 25 | }); 26 | 27 | // ---------------------------------------------------------------------------- 28 | 29 | // CeL.set_debug(3); 30 | 31 | start_crawler(crawler, typeof module === 'object' && module); 32 | -------------------------------------------------------------------------------- /archive/999comics.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 批量下載 99漫畫網 的工具。 Download 999comics comics. 3 | */ 4 | 5 | 'use strict'; 6 | 7 | require('../work_crawler_loader.js'); 8 | 9 | // ---------------------------------------------------------------------------- 10 | 11 | CeL.run('application.net.work_crawler.sites.SinMH2013'); 12 | 13 | // ---------------------------------------------------------------------------- 14 | 15 | var crawler = CeL.SinMH2013({ 16 | // one_by_one : true, 17 | 18 | base_URL : 'https://www.999comics.com/', 19 | no_need_to_revert : true, 20 | 21 | // 取得伺服器列表。 22 | // use_server_cache : true, 23 | server_URL : function() { 24 | // https://www.999comics.com/static/scripts/configs.js?v=8 25 | return this.base_URL + 'static/scripts/configs.js'; 26 | }, 27 | 28 | // 解析 作品名稱 → 作品id get_work() 29 | search_URL : function(work_title) { 30 | // CeL.set_debug(9); 31 | return 'word/?cb=_&key=' + escape(work_title); 32 | 33 | // NG: 34 | return [ 'word/', { 35 | cb : 'jQuery' 36 | // @see .expando 37 | + ('1.8.3' + Math.random()).replace(/\D/g, "") + '_' + Date.now(), 38 | key : escape(work_title), 39 | _ : Date.now() 40 | } ]; 41 | }, 42 | 43 | // 取得作品的章節資料。 get_work_data() 44 | work_URL : function(work_id) { 45 | // e.g., https://www.999comics.com/comic/33485/ 46 | return 'comic/' + work_id + '/'; 47 | }, 48 | 49 | // e.g., 34444 異世界精靈的奴隸醬, 33485 會歪掉的啊 50 | trim_trailing_newline : true 51 | }); 52 | 53 | // ---------------------------------------------------------------------------- 54 | 55 | // CeL.set_debug(3); 56 | 57 | start_crawler(crawler, typeof module === 'object' && module); 58 | -------------------------------------------------------------------------------- /archive/AlphaPolis_2016-20170619.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 批量下載アルファポリス - 電網浮遊都市 - 小説的工具。 Download AlphaPolis novels. 3 | * 4 | * @see 小説投稿サイト https://matome.naver.jp/odai/2139450042041120001 5 | * http://www.akatsuki-novels.com/novels/ranking_total 6 | * http://www.mai-net.net/bbs/sst/sst.php?act=list&cate=all&page=1 7 | * https://github.com/whiteleaf7/narou 8 | * https://github.com/59naga/scrape-narou 9 | */ 10 | 11 | 'use strict'; 12 | 13 | require('./work_crawler_loader.js'); 14 | 15 | // ---------------------------------------------------------------------------- 16 | 17 | CeL.run([ 'application.storage.EPUB' 18 | // CeL.character.load() 19 | , 'data.character' 20 | // .to_file_name() 21 | , 'application.net', 22 | // CeL.detect_HTML_language() 23 | , 'application.locale' ]); 24 | 25 | var charset = 'EUC-JP'; 26 | CeL.character.load(charset); 27 | 28 | var AlphaPolis = new CeL.work_crawler({ 29 | // auto_create_ebook, automatic create ebook 30 | // MUST includes CeL.application.locale! 31 | need_create_ebook : true, 32 | // recheck:從頭檢測所有作品之所有章節。 33 | // 'changed': 若是已變更,例如有新的章節,則重新下載/檢查所有章節內容。 34 | recheck : 'changed', 35 | 36 | // one_by_one : true, 37 | base_URL : 'http://www.alphapolis.co.jp/', 38 | charset : charset, 39 | 40 | // 解析 作品名稱 → 作品id get_work() 41 | search_URL : function(work_title) { 42 | return [ this.base_URL + 'top/search/', { 43 | // 2: 小説 44 | 'data[tab]' : 2, 45 | 'data[refer]' : work_title 46 | } ]; 47 | }, 48 | parse_search_result : function(html) { 49 | var id_data = [], 50 | // {Array}id_list = [id,id,...] 51 | id_list = []; 52 | html.each_between('

', '', function(text) { 53 | id_list.push(+text.between(' href="/content/cover/', '/"')); 54 | id_data.push(text.between('>')); 55 | }); 56 | return [ id_list, id_data ]; 57 | }, 58 | 59 | // 取得作品的章節資料。 get_work_data() 60 | work_URL : function(work_id) { 61 | return 'content/cover/' + (work_id | 0); 62 | }, 63 | parse_work_data : function(html, get_label) { 64 | var work_data = { 65 | // 必要屬性:須配合網站平台更改。 66 | title : html.between('"og:title" content="', '"'), 67 | 68 | // 選擇性屬性:須配合網站平台更改。 69 | // e.g., 连载中, 連載中 70 | status : get_label( 71 | html.between('
', 72 | '
')).split(/[\s\n]+/), 73 | author : get_label(html.between('
', '')), 74 | last_update : get_label(html.between('更新日時', '')), 75 | site_name : 'アルファポリス' 76 | 77 | }, PATTERN = /', 94 | // 不能用'
': 95 | // 有些作品沒有"この作品を読んでいる人はこんな作品も読んでいます!" 96 | // e.g., ちょっと魔王になって人類救ってくる 97 | '
') 98 | // 99 | .each_between('', function(text) { 100 | work_data.chapter_list.push({ 101 | url : text.between('', '') 103 | // 104 | .to_Date({ 105 | zone : work_data.time_zone 106 | }), 107 | title : text.between('', '') 108 | }); 109 | }); 110 | }, 111 | 112 | // 檢測所取得內容的章節編號是否相符。 113 | check_chapter_NO : [ '
', '/' ], 114 | parse_chapter_data : function(html, work_data, get_label, chapter_NO) { 115 | this.add_ebook_chapter(work_data, chapter_NO, { 116 | title : html.between('
', '
'), 117 | sub_title : html.between('

', '

'), 118 | text : html.between('
', { 120 | tail : '
' 121 | }) 122 | }); 123 | } 124 | }); 125 | 126 | // ---------------------------------------------------------------------------- 127 | 128 | // CeL.set_debug(3); 129 | 130 | AlphaPolis.start(work_id); 131 | -------------------------------------------------------------------------------- /archive/MAGCOMI.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 批量下載 MAGCOMI(マグコミ) 的工具。 Download MAG Garden COMIC ONLINE. 3 | * 4 | * @see ActiBook https://ebook.digitalink.ne.jp/ 5 | */ 6 | 7 | 'use strict'; 8 | 9 | require('../work_crawler_loader.js'); 10 | 11 | // ---------------------------------------------------------------------------- 12 | 13 | var crawler = new CeL.work_crawler({ 14 | // 所有的子檔案要修訂註解說明時,應該都要順便更改在CeL.application.net.comic中Comic_site.prototype內的母comments,並以其為主體。 15 | 16 | // 日本的網路漫畫網站習慣刪掉舊章節,因此每一次都必須從頭檢查。 17 | recheck : true, 18 | 19 | // 當網站不允許太過頻繁的訪問/access時,可以設定下載之前的等待時間(ms)。 20 | // 2019/6/16: 0-4s 常常下載到十幾二十個作品後中斷連線出現錯誤。 21 | // 2019/6/30: 6s 依然會出現 ECONNRESET: socket hang up 22 | // 2019/7/10: 15s 依然錯誤。換個useragent可以重設限制。限制應該是在圖片伺服器上? 23 | chapter_time_interval : '20s', 24 | 25 | // one_by_one : true, 26 | base_URL : 'https://comic.mag-garden.co.jp/', 27 | 28 | // 規範 work id 的正規模式;提取出引數中的作品id 以回傳。 29 | extract_work_id : function(work_information) { 30 | if (/^[a-z_\-\d]+$/.test(work_information)) 31 | return work_information; 32 | }, 33 | 34 | // 解析 作品名稱 → 作品id get_work() 35 | search_URL : '?s=', 36 | parse_search_result : function(html, get_label) { 37 | var id_list = [], id_data = []; 38 | html.each_between('

', '

', 39 | // 40 | function(text) { 41 | var url = text.match(/ href="([^<>"]+)"/), 42 | // 43 | title = get_label(text.between('

', '

')); 44 | id_list.push(url[1].match(/\/([a-z_\-\d]+)\/$/)[1]); 45 | id_data.push(title); 46 | }); 47 | 48 | return [ id_list, id_data ]; 49 | }, 50 | 51 | // 取得作品的章節資料。 get_work_data() 52 | work_URL : function(work_id) { 53 | return work_id + '/'; 54 | }, 55 | parse_work_data : function(html, get_label, extract_work_data) { 56 | var work_data = { 57 | // 必要屬性:須配合網站平台更改。 58 | author : get_label(html.between('著者:', '

')), 59 | 60 | // 選擇性屬性:須配合網站平台更改。 61 | status : html.between('') 62 | .all_between('
  • ', '
  • ').map(get_label), 63 | last_update : get_label(html.between('

    ', 64 | '

    ').between('
    ]*>(.+?)<\/a>/g; 89 | 90 | html = html.between('
    ', ''); 91 | 92 | work_data.chapter_list = []; 93 | while (matched = PATTERN_chapter.exec(html)) { 94 | var basePath = matched[1].replace(/\/HTML5\/.+/, '/'); 95 | var chapter_data = { 96 | base_URL : basePath, 97 | url : basePath + 'iPhone/ibook.xml', 98 | title : get_label(matched[2]) 99 | }; 100 | work_data.chapter_list.push(chapter_data); 101 | } 102 | work_data.chapter_list.reverse(); 103 | 104 | // 因為中間的章節可能已經被下架,因此依章節標題來定章節編號。 105 | this.set_chapter_NO_via_title(work_data); 106 | }, 107 | 108 | parse_chapter_data : function(html, work_data, get_label, chapter_NO) { 109 | // @see loadPageData @ 110 | // https://comic.mag-garden.co.jp/assets/files/work_id/HTML5/assets/javascripts/application.js 111 | // imageSource = pieceDirectory + "/" + pageno + ".jpg"; 112 | // pieceDirectory = baseDirectory + "/" + scale 113 | // parseDefinition: baseDirectory = basePath + "/books/images" 114 | // basePath = '..' 115 | // scale = 2 116 | 117 | var chapter_data = work_data.chapter_list[chapter_NO - 1]; 118 | Object.assign(chapter_data, { 119 | // 設定必要的屬性。 120 | title : get_label(html.between('', '')), 121 | image_count : html.between('', '') | 0, 122 | image_list : [] 123 | }); 124 | 125 | for (var index = 0; index < chapter_data.image_count;) { 126 | chapter_data.image_list.push({ 127 | url : chapter_data.base_URL + 'books/images/2/' + ++index 128 | + '.jpg' 129 | }); 130 | } 131 | 132 | return chapter_data; 133 | } 134 | }); 135 | 136 | // ---------------------------------------------------------------------------- 137 | 138 | // CeL.set_debug(3); 139 | 140 | start_crawler(crawler, typeof module === 'object' && module); 141 | -------------------------------------------------------------------------------- /archive/OVERLAP.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 批量下載 OVERLAP - オーバーラップ コミックガルド 的工具。 Download OVERLAP GARDO comics. 3 | * 4 | * @see ActiBook https://ebook.digitalink.ne.jp/ 5 | */ 6 | 7 | 'use strict'; 8 | 9 | require('../work_crawler_loader.js'); 10 | 11 | // ---------------------------------------------------------------------------- 12 | 13 | var crawler = new CeL.work_crawler({ 14 | // 所有的子檔案要修訂註解說明時,應該都要順便更改在CeL.application.net.comic中Comic_site.prototype內的母comments,並以其為主體。 15 | 16 | // 日本的網路漫畫網站習慣刪掉舊章節,因此每一次都必須從頭檢查。 17 | recheck : true, 18 | 19 | // one_by_one : true, 20 | base_URL : 'https://over-lap.co.jp/', 21 | 22 | // 取得作品的章節資料。 get_work_data() 23 | work_URL : function(work_id) { 24 | return 'Form/Product/ProductDetail.aspx?cat=CGS&pid=' + 'ZG' 25 | + work_id.pad(4); 26 | }, 27 | parse_work_data : function(html, get_label, extract_work_data) { 28 | var work_data = { 29 | // 必要屬性:須配合網站平台更改。 30 | author : html.between('
    ', '
    ').split( 31 | '').map(get_label).filter(function(name) { 32 | return !!name; 33 | }).map(function(name) { 34 | matched = name.match(/(?:著|原作)/(.+)/); 35 | return matched ? matched[1].trim() : name; 36 | }), 37 | 38 | // 選擇性屬性:須配合網站平台更改。 39 | last_update : get_label(html.between('
    ', 40 | '
    ')) 41 | || (new Date).toISOString() 42 | }, matched = work_data.last_update 43 | .match(/[^\d](\d{4}[.\-\/]\d{1,2}[.\-\/]\d{1,2})[^\d]/); 44 | 45 | if (matched) { 46 | work_data.last_update = matched[1]; 47 | } 48 | 49 | extract_work_data(work_data, html); 50 | 51 | // 放在這裡以預防被extract_work_data()覆蓋。 52 | Object.assign(work_data, { 53 | description : get_label(html.between('
    ', 54 | '
    ').between('

    ', '

    ')) 55 | }); 56 | 57 | // console.log(work_data); 58 | return work_data; 59 | }, 60 | get_chapter_list : function(work_data, html, get_label) { 61 | var matched, PATTERN_chapter = /
    /g; 62 | 63 | work_data.chapter_list = []; 64 | while (matched = PATTERN_chapter.exec(html)) { 65 | var base_URL = matched[1].match( 66 | // 67 | / href="([^<>"]*\/gardo\/series\/([^<>"\/]+)\/)/)[1]; 68 | // @see iPhonePath 69 | // https://over-lap.co.jp/gardo/series/????/HTML5/assets/javascripts/application.js 70 | var chapter_data = { 71 | base_URL : base_URL, 72 | url : base_URL + 'iPhone/ibook.xml', 73 | title : get_label(matched[1].between('

    ', '

    ')) 74 | }; 75 | work_data.chapter_list.push(chapter_data); 76 | } 77 | work_data.chapter_list.reverse(); 78 | 79 | // 因為中間的章節可能已經被下架,因此依章節標題來定章節編號。 80 | this.set_chapter_NO_via_title(work_data); 81 | }, 82 | 83 | parse_chapter_data : function(html, work_data, get_label, chapter_NO) { 84 | var chapter_data = work_data.chapter_list[chapter_NO - 1]; 85 | Object.assign(chapter_data, { 86 | // 設定必要的屬性。 87 | title : get_label(html.between('', '')), 88 | image_count : html.between('', '') | 0, 89 | image_list : [] 90 | }); 91 | 92 | for (var index = 0; index < chapter_data.image_count;) { 93 | chapter_data.image_list.push(chapter_data.base_URL 94 | + 'books/images/2/' + ++index + '.jpg'); 95 | } 96 | 97 | return chapter_data; 98 | } 99 | }); 100 | 101 | // ---------------------------------------------------------------------------- 102 | 103 | // CeL.set_debug(3); 104 | 105 | start_crawler(crawler, typeof module === 'object' && module); 106 | -------------------------------------------------------------------------------- /archive/XOY.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 批量下載 XOY(ジョイ) 漫畫 的工具。 Download XOY comics. (comic.ja-JP) 3 | */ 4 | 5 | 'use strict'; 6 | 7 | require('../work_crawler_loader.js'); 8 | 9 | // ---------------------------------------------------------------------------- 10 | 11 | CeL.run('application.net.work_crawler.sites.webtoon'); 12 | 13 | // ---------------------------------------------------------------------------- 14 | 15 | var crawler = CeL.webtoon({ 16 | base_URL : 'https://xoy.webtoons.com/', 17 | language_code : 'ja' 18 | }); 19 | 20 | // ---------------------------------------------------------------------------- 21 | 22 | // CeL.set_debug(3); 23 | 24 | start_crawler(crawler, typeof module === 'object' && module); 25 | -------------------------------------------------------------------------------- /archive/aikanmh.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 批量下載 爱看漫画 的工具。 Download aikanmh comics. 3 | */ 4 | 5 | 'use strict'; 6 | 7 | require('../work_crawler_loader.js'); 8 | 9 | // ---------------------------------------------------------------------------- 10 | 11 | CeL.run('application.net.work_crawler.sites.qTcms2017'); 12 | 13 | // ---------------------------------------------------------------------------- 14 | 15 | var crawler = CeL.qTcms2017({ 16 | // {Natural}最小容許圖案檔案大小 (bytes)。 17 | // MIN_LENGTH : 500, 18 | 19 | skip_error : true, 20 | 21 | base_URL : 'http://www.aikanmh.cn/' 22 | }); 23 | 24 | // ---------------------------------------------------------------------------- 25 | 26 | // CeL.set_debug(3); 27 | 28 | start_crawler(crawler, typeof module === 'object' && module); 29 | -------------------------------------------------------------------------------- /archive/biquge.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 批量下載 笔趣阁 小说 的工具。 Download biquge novels. 3 | */ 4 | 5 | 'use strict'; 6 | 7 | require('../work_crawler_loader.js'); 8 | 9 | // ---------------------------------------------------------------------------- 10 | 11 | CeL.run('application.net.work_crawler.sites.PTCMS'); 12 | 13 | // ---------------------------------------------------------------------------- 14 | 15 | var crawler = CeL.PTCMS({ 16 | base_URL : 'https://www.xs.la/', 17 | 18 | // 解析 作品名稱 → 作品id get_work() 19 | search_URL : 'https://sou.xanbhx.com/search?siteid=xsla&q=', 20 | parse_search_result : 'biquge', 21 | 22 | // 取得作品的章節資料。 get_work_data() 23 | work_URL : function(work_id) { 24 | return (work_id / 1000 | 0) + '_' + work_id + '/'; 25 | }, 26 | // 取得包含章節列表的文字範圍。 27 | get_chapter_list_contents : function(html) { 28 | return html.between('
    ', '
    '); 29 | } 30 | }); 31 | 32 | // ---------------------------------------------------------------------------- 33 | 34 | // CeL.set_debug(3); 35 | 36 | start_crawler(crawler, typeof module === 'object' && module); 37 | -------------------------------------------------------------------------------- /archive/comico.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 批量下載 comico - 全彩長條漫畫 (韓國 NHN Taiwan Corp.) 的工具。 Download comico comics. 3 | */ 4 | 5 | 'use strict'; 6 | 7 | require('../work_crawler_loader.js'); 8 | 9 | // ---------------------------------------------------------------------------- 10 | 11 | CeL.run('application.net.work_crawler.sites.comico'); 12 | 13 | // ---------------------------------------------------------------------------- 14 | 15 | // CeL.set_debug(3); 16 | 17 | // crawler(configuration, callback, initializer) 18 | CeL.comico({ 19 | base_URL : 'https://www.comico.com.tw/', 20 | 21 | // 2020/8/18-21? 需要coin閱讀的會給一張圖,卻又403。 22 | // skip_error : true, 23 | 24 | // search_head_token : '
  • ', 25 | // PATTERN_search : / 23 | // '), /]*>([^:]+):(.+?)<\/li>/g); 99 | return work_data; 100 | }, 101 | get_chapter_list : function(work_data, html) { 102 | work_data.chapter_list = []; 103 | var matched, 104 | /** 105 | * e.g., 106 |
  • 01话.融化的尸体
  • 107 | 108 | */ 109 | PATTERN_chapter = 110 | // [all,href,title] 111 | /
  • ]*)>([^<>]+)<\/a>/g; 112 | html = html.between('scrollcontain', 'box_tt_tab'); 113 | while (matched = PATTERN_chapter.exec(html)) { 114 | work_data.chapter_list.push({ 115 | url : matched[1], 116 | title : matched[2].trim() 117 | }); 118 | } 119 | work_data.chapter_count = work_data.chapter_list.length; 120 | if (work_data.chapter_count > 1) { 121 | // 轉成由舊至新之順序。 122 | work_data.chapter_list = work_data.chapter_list.reverse(); 123 | } 124 | }, 125 | 126 | // 取得每一個章節的各個影像內容資料。 get_chapter_data() 127 | parse_chapter_data : function(html, work_data, get_label) { 128 | // decode chapter data 129 | function decode(code) { 130 | code = eval(code).replace(/^[^=]+/, 'code'); 131 | return eval(code); 132 | } 133 | 134 | var chapter_data = html.between(''); 136 | if (!chapter_data || !(chapter_data = decode(chapter_data))) { 137 | return; 138 | } 139 | 140 | // 設定必要的屬性。 141 | chapter_data.title = chapter_data.cname; 142 | chapter_data.image_count = chapter_data.len; 143 | chapter_data.image_list = chapter_data.files.map(function(url) { 144 | return { 145 | url : url 146 | } 147 | }); 148 | 149 | return chapter_data; 150 | } 151 | }); 152 | 153 | // ---------------------------------------------------------------------------- 154 | 155 | // CeL.set_debug(3); 156 | 157 | remanba.start(work_id); 158 | -------------------------------------------------------------------------------- /archive/tohomh.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 批量下載 土豪漫画 的工具。 Download tohomh comics. 3 | */ 4 | 5 | 'use strict'; 6 | 7 | require('../work_crawler_loader.js'); 8 | 9 | // ---------------------------------------------------------------------------- 10 | 11 | CeL.run('application.net.work_crawler.sites.dm5'); 12 | 13 | // ---------------------------------------------------------------------------- 14 | 15 | var crawler = CeL.dm5({ 16 | // 本網站常有圖片不存在的現象。 17 | skip_error : true, 18 | 19 | chapter_time_interval : '4s', 20 | 21 | // 2019/1/21 土豪漫畫網址更動 ← https://www.tohomh.com/ 22 | base_URL : 'https://www.tohomh123.com/', 23 | 24 | // 解析 作品名稱 → 作品id get_work() 25 | // 搜索 27 | search_URL : 'action/Search?keyword=', 28 | 29 | image_API : 'action/play/read?did=' 30 | }); 31 | 32 | // ---------------------------------------------------------------------------- 33 | 34 | // CeL.set_debug(3); 35 | 36 | start_crawler(crawler, typeof module === 'object' && module); 37 | -------------------------------------------------------------------------------- /archive/wuyouhui.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 批量下載 友绘漫画网 的工具。 Download wuyouhui comics. 3 | * 4 | * @see qTcms 晴天漫画程序 晴天漫画系统 手机端 http://manhua3.qingtiancms.com/ 5 | */ 6 | 7 | 'use strict'; 8 | 9 | require('../work_crawler_loader.js'); 10 | 11 | // ---------------------------------------------------------------------------- 12 | 13 | CeL.run('application.net.work_crawler.sites.qTcms2017'); 14 | 15 | // ---------------------------------------------------------------------------- 16 | 17 | var crawler = CeL.qTcms2017({ 18 | // {Natural}最小容許圖案檔案大小 (bytes)。 19 | // MIN_LENGTH : 500, 20 | 21 | skip_error : true, 22 | 23 | base_URL : 'http://m.wuyouhui.net/' 24 | }); 25 | 26 | // ---------------------------------------------------------------------------- 27 | 28 | // CeL.set_debug(3); 29 | 30 | start_crawler(crawler, typeof module === 'object' && module); 31 | -------------------------------------------------------------------------------- /archive/xbiquge.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 批量下載 新笔趣阁 小说 的工具。 Download xbiquge novels. 3 | * 4 | * @see x81zw 5 | */ 6 | 7 | 'use strict'; 8 | 9 | require('../work_crawler_loader.js'); 10 | 11 | // ---------------------------------------------------------------------------- 12 | 13 | CeL.run('application.net.work_crawler.sites.PTCMS'); 14 | 15 | // ---------------------------------------------------------------------------- 16 | 17 | var crawler = CeL.PTCMS({ 18 | base_URL : 'https://www.xbiquge6.com/', 19 | 20 | // 解析 作品名稱 → 作品id get_work() 21 | search_URL : 'search.php?keyword=', 22 | parse_search_result : function(html, get_label) { 23 | // console.log(html); 24 | 25 | var id_list = [], id_data = []; 26 | html.each_between('
    ', 27 | // 28 | '
    ', function(text) { 29 | var matched = text.match( 30 | /** 31 | * 32 | 33 | 34 | 35 | 36 | */ 37 | /]*?href="[^<>"]+?\/(?:\d+_)?(\d+)\/"[^<>]*>([\s\S]+?)<\/a>/ 38 | // 39 | ); 40 | // console.log([ text, matched ]); 41 | if (matched) { 42 | id_list.push(+matched[1]); 43 | id_data.push(get_label(matched[2])); 44 | } 45 | }); 46 | return [ id_list, id_data ]; 47 | }, 48 | 49 | // 取得作品的章節資料。 get_work_data() 50 | work_URL : function(work_id) { 51 | return (work_id / 1000 | 0) + '_' + work_id + '/'; 52 | }, 53 | // 取得包含章節列表的文字範圍。 54 | get_chapter_list_contents : function(html) { 55 | return html.between('
    ', '
    '); 56 | } 57 | }); 58 | 59 | // ---------------------------------------------------------------------------- 60 | 61 | // CeL.set_debug(3); 62 | 63 | start_crawler(crawler, typeof module === 'object' && module); 64 | -------------------------------------------------------------------------------- /archive/yinvmh.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 批量下載 乙女漫画 的工具。 Download yinvmh.com comics. 3 | * 4 | * 整體採 qTcms 晴天漫画程序 晴天漫画系统 http://manhua3.qingtiancms.com/ 5 | * 6 | * 僅顯示作品頁面採用 dm5 7 | */ 8 | 9 | 'use strict'; 10 | 11 | require('../work_crawler_loader.js'); 12 | 13 | // ---------------------------------------------------------------------------- 14 | 15 | CeL.run([ 'application.net.work_crawler.sites.qTcms2017', 16 | 'application.net.work_crawler.sites.dm5' ]); 17 | 18 | // ---------------------------------------------------------------------------- 19 | 20 | var crawler = CeL.dm5({ 21 | base_URL : 'https://www.yinvmh.com/' 22 | }); 23 | 24 | crawler = CeL.qTcms2017({ 25 | base_URL : crawler.base_URL, 26 | parse_work_data : crawler.parse_work_data, 27 | get_chapter_list : crawler.get_chapter_list, 28 | 29 | // 圖像檔案下載失敗處理方式:忽略/跳過圖像錯誤。當404圖像不存在、檔案過小,或是被偵測出非圖像(如不具有EOI)時,依舊強制儲存檔案。default:false 30 | skip_error : true 31 | }); 32 | 33 | // ---------------------------------------------------------------------------- 34 | 35 | // CeL.set_debug(3); 36 | 37 | start_crawler(crawler, typeof module === 'object' && module); 38 | -------------------------------------------------------------------------------- /archive/youma.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 批量下載 有码漫画 的工具。 Download youma comics. 3 | */ 4 | 5 | 'use strict'; 6 | 7 | require('../work_crawler_loader.js'); 8 | 9 | // ---------------------------------------------------------------------------- 10 | 11 | CeL.run('application.net.work_crawler.sites.dm5'); 12 | 13 | // ---------------------------------------------------------------------------- 14 | 15 | var crawler = CeL.dm5({ 16 | // 本網站偶爾有圖片不存在的現象。 17 | skip_error : true, 18 | // MIN_LENGTH : 400, 19 | 20 | base_URL : 'https://www.youma.org/', 21 | 22 | // 解析 作品名稱 → 作品id get_work() 23 | //
    搜索 24 | search_URL : 'search?keyword=', 25 | 26 | work_URL : 'book/', 27 | 28 | inverted_order : false, 29 | 30 | pre_parse_chapter_data : null 31 | }); 32 | 33 | // ---------------------------------------------------------------------------- 34 | 35 | // CeL.set_debug(3); 36 | 37 | start_crawler(crawler, typeof module === 'object' && module); 38 | -------------------------------------------------------------------------------- /arrangement/list_kuaiZip.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @fileoverview 檢測目標目錄中所有壓縮檔案,並且篩選列出可能是 快压(kuaiZip) 檔案。 3 | * 4 | * @example 5 | 6 | node list_kuaiZip.js target_directory 7 | 8 | 9 | * 10 | * @since 2018/11/4 13:49:0 11 | */ 12 | 13 | 'use strict'; 14 | 15 | global.need_work_id = false; 16 | 17 | require('../work_crawler_loader.js'); 18 | 19 | var log_file = CeL.env.script_name + '.log.txt'; 20 | 21 | // ---------------------------------------------------------------------------- 22 | // Load module. 23 | 24 | CeL.run( 25 | // for 26 | ); 27 | 28 | // ---------------------------------------------------------------------------- 29 | 30 | // 要處理的目錄。 31 | var target_directory = process.argv[2]/* || '.' */; 32 | 33 | if (!target_directory) { 34 | var main_script = require.main 35 | && require.main.filename.match(/[^\\\/]+$/)[0]; 36 | CeL.log('Usage:\n node ' + main_script + ' "target directory"'); 37 | process.exit(); 38 | } 39 | 40 | // ----------------------------------------------------------------- 41 | 42 | // 遍歷檔案系統,對每個 FSO 執行指定的動作。 43 | CeL.storage.traverse_file_system(target_directory, function(file_path) { 44 | // console.log(file_path); 45 | var matched = file_path.match(/^(.+[ .])bad\.(zip|rar)$/i); 46 | if (matched) { 47 | // recover 48 | // console.log([file_path, matched[1] + matched[2]]); 49 | // CeL.move_file(file_path, matched[1] + matched[2]); 50 | 51 | // 跳過已經明確標示為有問題的檔案。 52 | return; 53 | } 54 | 55 | var archive_file = new CeL.archive(file_path, { 56 | program_type : '7z' 57 | }); 58 | // console.log(archive_file); 59 | archive_file.info(); 60 | // console.log(archive_file); 61 | // throw 123123 62 | 63 | // for 7z only! 64 | if (!archive_file.information) { 65 | console.log('檔頭有問題的檔案: ' + file_path); 66 | // 移動/標註此檔案為壞掉的壓縮檔。 67 | CeL.move_file(file_path, file_path 68 | .replace(/(\.(?:zip|rar))$/, '.bad$1')) 69 | // archive_file.verify(); 70 | return; 71 | } 72 | if (!archive_file.information.Offset 73 | && !archive_file.information['Tail Size']) { 74 | // archive_file.verify(); 75 | return; 76 | } 77 | // 篩選出有問題的檔案 78 | 79 | var read_file = archive_file.fso_status_list[0]; 80 | if (archive_file.fso_status_list.length !== 1 81 | // "说明.txt". e.g., '佽隴.txt'@Big5 82 | || !/^.{2,4}\.txt$/.test(read_file.path) 83 | || read_file.size !== read_file['packed size']) { 84 | // 警告: 有效負載盡頭外還有其他資料 85 | console.log('有問題的檔案: ' + archive_file.fso_status_list); 86 | // 移動/標註此檔案為壞掉的壓縮檔。 87 | CeL.move_file(file_path, file_path 88 | .replace(/(\.(?:zip|rar))$/, '.bad$1')) 89 | return; 90 | } 91 | // 篩選出可能是 快压(KuaiZip) 檔案 92 | 93 | console.log('可能是 快压(KuaiZip) 檔案: ' + file_path); 94 | 95 | }, /\.(zip|rar)$/i); 96 | -------------------------------------------------------------------------------- /comic.cmn-Hans-CN/1kkk.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 批量下載 极速漫画 漫画人 的工具。 Download 1kkk comics. 3 | */ 4 | 5 | 'use strict'; 6 | 7 | require('../work_crawler_loader.js'); 8 | 9 | // ---------------------------------------------------------------------------- 10 | 11 | CeL.run('application.net.work_crawler.sites.dm5'); 12 | 13 | // ---------------------------------------------------------------------------- 14 | 15 | var crawler = CeL.dm5({ 16 | base_URL : 'http://www.1kkk.com/' 17 | }); 18 | 19 | // ---------------------------------------------------------------------------- 20 | 21 | // CeL.set_debug(3); 22 | 23 | start_crawler(crawler, typeof module === 'object' && module); 24 | -------------------------------------------------------------------------------- /comic.cmn-Hans-CN/733dm.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 批量下載733动漫网的工具。 Download 733dm comics. 3 | * 4 | * @see qTcms 晴天漫画程序 晴天漫画系统 http://manhua3.qingtiancms.com/ 5 | */ 6 | 7 | 'use strict'; 8 | 9 | require('../work_crawler_loader.js'); 10 | 11 | // ---------------------------------------------------------------------------- 12 | 13 | CeL.run('application.net.work_crawler.sites.qTcms2017'); 14 | 15 | // ---------------------------------------------------------------------------- 16 | 17 | var crawler = CeL.qTcms2017({ 18 | // 本站常常無法取得圖片,因此得多重新檢查。 19 | // recheck:從頭檢測所有作品之所有章節與所有圖片。不會重新擷取圖片。對漫畫應該僅在偶爾需要從頭檢查時開啟此選項。 20 | // recheck : true, 21 | // 當無法取得chapter資料時,直接嘗試下一章節。在手動+監視下recheck時可併用此項。 22 | // skip_chapter_data_error : true, 23 | 24 | // allow .jpg without EOI mark. 25 | // allow_EOI_error : true, 26 | // 當圖像檔案過小,或是被偵測出非圖像(如不具有EOI)時,依舊強制儲存檔案。 27 | skip_error : true, 28 | 29 | // 當網站不允許太過頻繁的訪問/access時,可以設定下載之前的等待時間(ms)。 30 | // chapter_time_interval : '2s', 31 | 32 | // 2018/3: https://www.733dm.net/ 33 | base_URL : 'https://www.733.so/', 34 | 35 | // 733动漫网 2018/11/9 之後 (11/16之後?) 改版成 晴天漫画系统 36 | // fs.readdirSync('.').forEach(function(d){if(/^\d+\s/.test(d))fs.renameSync(d,'manhua-'+d);}) 37 | // fs.readdirSync('.').forEach(function(d){if(/^manhua-/.test(d))fs.renameSync(d,d.replace(/^manhua-/,''));}) 38 | // 所有作品都使用這種作品類別前綴。 39 | common_catalog : 'mh', 40 | 41 | // 取得作品的章節資料。 get_work_data() 42 | parse_chapter_data_201811 : function(html, work_data) { 43 | var chapter_data = html.between('qTcms_S_m_murl_e="', '"'); 44 | if (chapter_data) { 45 | // 對於非utf-8編碼之中文,不能使用 atob()??? 46 | chapter_data = atob(chapter_data).split("$qingtiandy$"); 47 | } 48 | if (!chapter_data) { 49 | CeL.log('無法解析資料!'); 50 | return; 51 | } 52 | // console.log(JSON.stringify(chapter_data)); 53 | // console.log(chapter_data.length); 54 | // CeL.set_debug(6); 55 | 56 | // 設定必要的屬性。 57 | chapter_data = { 58 | image_list : chapter_data.map(function(url) { 59 | url = encodeURI(url); 60 | 61 | // f_qTcms_Pic_curUrl() → f_qTcms_Pic_curUrl_realpic(v) @ 62 | // https://www.733.so/template/skin2/css/d7s/js/show.20170501.js?20190105114149 63 | var timestamp = Date.now(); 64 | var File_Server = "http://img_733.234us.com/newfile.php?data="; 65 | 66 | url = url.replace("http://www.baidu1.com/", ""); 67 | // using File_Server 图片服务器: 此 URL 會再轉址至圖片真實網址。 68 | url = File_Server + btoa(url + "|" + timestamp + "|" 69 | // 733dm.js: 2019/2/16 改版 70 | + html.between('qTcms_S_m_id="', '"') + "|" 71 | // 72 | + html.between('qTcms_S_p_id="', '"') + "|pc"); 73 | 74 | return { 75 | url : url 76 | }; 77 | }, this) 78 | }; 79 | // console.log(JSON.stringify(chapter_data)); 80 | 81 | return chapter_data; 82 | }, 83 | 84 | // function f_qTcms_Pic_curUrl_realpic(v) @ 85 | // https://www.733.so/template/skin2/css/d7s/js/show.20190608.js?20190902222912 86 | for_each_image : function(url, parameters, base64_encode) { 87 | var File_Server = "https://api.733.so/newfile.php?data="; 88 | return File_Server 89 | + base64_encode(url + "|" + Date.now() + "|" 90 | + parameters.qTcms_S_m_id + "|" 91 | + parameters.qTcms_S_p_id + "|pc"); 92 | } 93 | }); 94 | 95 | // ---------------------------------------------------------------------------- 96 | 97 | // CeL.set_debug(3); 98 | 99 | start_crawler(crawler, typeof module === 'object' && module); 100 | -------------------------------------------------------------------------------- /comic.cmn-Hans-CN/90mh.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 批量下載 90漫画网 的工具。 Download 90mh comics. 3 | */ 4 | 5 | 'use strict'; 6 | 7 | require('../work_crawler_loader.js'); 8 | 9 | // ---------------------------------------------------------------------------- 10 | 11 | CeL.run('application.net.work_crawler.sites.SinMH'); 12 | 13 | // ---------------------------------------------------------------------------- 14 | 15 | var crawler = CeL.SinMH({ 16 | // 本站常常無法取得圖片,因此得多重新檢查。 17 | // recheck:從頭檢測所有作品之所有章節與所有圖片。不會重新擷取圖片。對漫畫應該僅在偶爾需要從頭檢查時開啟此選項。 18 | // 有些漫畫作品分區分單行本、章節與外傳,當章節數量改變、添加新章節時就需要重新檢查。 19 | // recheck : 'changed', 20 | 21 | // 圖像檔案下載失敗處理方式:忽略/跳過圖像錯誤。當404圖像不存在、檔案過小,或是被偵測出非圖像(如不具有EOI)時,依舊強制儲存檔案。default:false 22 | skip_error : true, 23 | 24 | // one_by_one : true, 25 | 26 | // 2022/6/10: http://www.90mh.com/ 27 | base_URL : 'http://www.90mh.com/', 28 | 29 | search_URL : 'API', 30 | id_of_search_result : 'slug' 31 | }); 32 | 33 | // ---------------------------------------------------------------------------- 34 | 35 | // CeL.set_debug(3); 36 | 37 | start_crawler(crawler, typeof module === 'object' && module); 38 | -------------------------------------------------------------------------------- /comic.cmn-Hans-CN/930mh.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 批量下載 亲亲漫画网 的工具。 Download 930mh.com → duzhez.com comics. 3 | */ 4 | 5 | 'use strict'; 6 | 7 | require('../work_crawler_loader.js'); 8 | 9 | // ---------------------------------------------------------------------------- 10 | 11 | CeL.run('application.net.work_crawler.sites.SinMH'); 12 | 13 | // ---------------------------------------------------------------------------- 14 | 15 | var crawler = CeL.SinMH({ 16 | // one_by_one : true, 17 | 18 | // 2020/4/24 單一作品 1s: NG, 1200ms: OK 19 | chapter_time_interval : 6000, 20 | 21 | // 圖像檔案下載失敗處理方式:忽略/跳過圖像錯誤。當404圖像不存在、檔案過小,或是被偵測出非圖像(如不具有EOI)時,依舊強制儲存檔案。default:false 22 | skip_error : true, 23 | 24 | // old: http://www.duzhez.com/ 25 | // 2019/8 改網址: http://www.93gmh.com/ 26 | // 2019/10/17 改網址: http://www.rubobo.com/ 27 | // 2021/2/25 改網址: https://www.acgcd.com/ 28 | // 2022/11/3前: https://www.acgqd.com/ 29 | base_URL : 'https://www.acgqd.com/', 30 | 31 | extract_work_id : function(work_information) { 32 | return CeL.is_digits(work_information) && work_information; 33 | }, 34 | 35 | // for 年轻人脱离黑魔法虽然刻不容缓、但试着就业之后待遇却很好、社长和使魔也非常可爱真是棒极了! 36 | acceptable_types : 'images', 37 | 38 | search_URL : 'API', 39 | api_base_URL : 'https://api.acg.gd/', 40 | 41 | /** 42 | * @see function cops201921() @ http://www.duzhez.com/js/cops201921.js
    → 43 | * 2019/5/1 亲亲漫画改版: function kda20190501() @ http://www.duzhez.com/js/kda20190501.js 44 | */ 45 | crypto_duzhez : { 46 | key : "9Xc4PMs2cvQinnbd", 47 | iv : "ioXA45KJnv98ccSB" 48 | }, 49 | /** 50 | * 2019/8 改網址: function pt20190804() @ http://www.93gmh.com/js/pt20190804.js 51 | */ 52 | crypto : { 53 | key : "u1S2Bvvwp1XZ37B9", 54 | iv : "2VNNjmjywpbnsYmW" 55 | }, 56 | /** 57 | * 2019/10/17 改網址: function jmzz20191018() @ http://www.rubobo.com/js/jmzz20191018.js 58 | */ 59 | crypto : { 60 | iv : "opb4x7z21vg1f3gI", 61 | key : "cxNB23W8xzKJV26O", 62 | }, 63 | 64 | /** 65 | * 處理特殊圖片: 有些會下載成盜鏈圖片 http://mhimg.acg.gd:44236/images/logo/dl.jpg 66 | */ 67 | is_limited_image_url : function(image_url) { 68 | return image_url.endsWith('logo/dl.jpg'); 69 | } 70 | }); 71 | 72 | // ---------------------------------------------------------------------------- 73 | 74 | // CeL.set_debug(3); 75 | 76 | start_crawler(crawler, typeof module === 'object' && module); 77 | -------------------------------------------------------------------------------- /comic.cmn-Hans-CN/baozimh.org.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 批量下載包子漫畫的工具。 Download baozimh comics. 3 | */ 4 | 5 | 'use strict'; 6 | 7 | require('../work_crawler_loader.js'); 8 | 9 | // ---------------------------------------------------------------------------- 10 | 11 | var crawler = new CeL.work_crawler({ 12 | // 2023/6/16: https://baozimh.org/ 13 | // 2023/9/1 前網站改版為手機友好外觀 14 | base_URL : 'https://baozimh.org/', 15 | 16 | // 最小容許圖案檔案大小 (bytes)。 17 | // 對於極少出現錯誤的網站,可以設定一個比較小的數值,並且設定.allow_EOI_error=false。因為這類型的網站要不是無法取得檔案,要不就是能夠取得完整的檔案;要取得破損檔案,並且已通過EOI測試的機會比較少。 18 | // 對於有些圖片只有一條細橫桿的情況。 19 | MIN_LENGTH : 50, 20 | // e.g., wonengkandaochenggonglu-namu 我能看到成功率/0199 第199话 21 | // 霁月之下/wonengkandaochenggonglu-namu-199-135.jpg 22 | 23 | // 2023/6/27 20:3:3 時間間距太短會出現 異常 HTTP 狀態碼 502 24 | one_by_one : '1s', 25 | chapter_time_interval : '1s', 26 | 27 | // 當圖像檔案過小,或是被偵測出非圖像(如不具有EOI)時,依舊強制儲存檔案。 28 | skip_error : true, 29 | 30 | // e.g., 原来我是修仙大佬 0092 九十二话 .webp 31 | acceptable_types : 'webp', 32 | 33 | search_URL : '?s=', 34 | parse_search_result : function(html, get_label) { 35 | // console.log(html); 36 | var id_list = [], id_data = []; 37 | html.each_between('', function(text) { 38 | text = text.between('', '<'))); 41 | }); 42 | // console.log([ id_list, id_data ]); 43 | return [ id_list, id_data ]; 44 | }, 45 | 46 | work_URL : function(work_id) { 47 | return 'manga/' + work_id + '/'; 48 | }, 49 | parse_work_data : function(html, get_label, extract_work_data) { 50 | // console.log(html); 51 | var work_data = { 52 | // 必要屬性:須配合網站平台更改。 53 | title : get_label(html.between( 54 | //

    武炼巅峰 ').between('>') 56 | // 57 | .replace(/作者:噼咔噼, 61 | '作者:', '

  • ')), 62 | 63 | // 選擇性屬性:須配合網站平台更改。 64 | tags : html.between('類型:', '
    ') 65 | // 66 | .split('').map(function(tag) { 67 | return get_label(tag).replace(/,$/, '').replace(/^#/, ''); 68 | }), 69 | description : get_label(html 70 | .between('

    ', 71 | '

    ')) 72 | /** 73 | * cover image 74 |
    武炼巅峰 76 | */ 77 | // cover_image : 78 | }; 79 | // console.log(work_data); 80 | 81 | // 由 meta data 取得作品資訊。 82 | extract_work_data(work_data, html); 83 | 84 | // console.log(work_data); 85 | return work_data; 86 | }, 87 | chapter_list_URL : function(work_id, work_data) { 88 | return 'chapterlist/' + work_id + '/'; 89 | }, 90 | get_chapter_list : function(work_data, html, get_label) { 91 | // console.log(html); 92 | var _this = this; 93 | // reset chapter list 94 | work_data.chapter_list = []; 95 | html = html.between('
      ', '
    '); 96 | // 213 无尽轮回迷宫 12分钟 ago 100 | html.each_between('', '')), 105 | url : text.between(' href="', '"') 106 | }; 107 | _this.add_chapter(work_data, chapter_data); 108 | }); 109 | work_data.inverted_order = true; 110 | // console.log(work_data.chapter_list); 111 | }, 112 | 113 | parse_chapter_data : function(html, work_data, get_label, chapter_NO) { 114 | var chapter_data = work_data.chapter_list[chapter_NO - 1]; 115 | 116 | var image_list = chapter_data.image_list = []; 117 | 118 | html = html.between('
    ', 119 | 'class="site-footer') 120 | || html; 121 | html = html.replace(/