From 42a2eba72132c7822a8e95cd35dc3930316b23fe Mon Sep 17 00:00:00 2001 From: kanasimi Date: Thu, 28 Mar 2024 07:17:30 +0800 Subject: [PATCH] + tools --- book.cmn-Hant-TW/podcasts.js | 186 ++++++++++++++++++++++++ novel.cmn-Hans-CN/biqizw.js | 117 +++++++++++++++ novel.cmn-Hans-CN/cwjjj.js | 170 ++++++++++++++++++++++ novel.cmn-Hans-CN/ecxs.js | 271 +++++++++++++++++++++++++++++++++++ 4 files changed, 744 insertions(+) create mode 100644 book.cmn-Hant-TW/podcasts.js create mode 100644 novel.cmn-Hans-CN/biqizw.js create mode 100644 novel.cmn-Hans-CN/cwjjj.js create mode 100644 novel.cmn-Hans-CN/ecxs.js diff --git a/book.cmn-Hant-TW/podcasts.js b/book.cmn-Hant-TW/podcasts.js new file mode 100644 index 00000000..5f05a0b6 --- /dev/null +++ b/book.cmn-Hant-TW/podcasts.js @@ -0,0 +1,186 @@ +/** + * 批量下載 podcasts 小说 的工具。 Download Apple Podcast. + */ + +'use strict'; + +require('../work_crawler_loader.js'); + +// ---------------------------------------------------------------------------- + +CeL.run([ 'application.storage.EPUB' +// CeL.detect_HTML_language() +, 'application.locale' ]); + +// ---------------------------------------------------------------------------- + +var crawler = new CeL.work_crawler({ + // auto_create_ebook, automatic create ebook + // MUST includes CeL.application.locale! + need_create_ebook : true, + // recheck:從頭檢測所有作品之所有章節與所有圖片。不會重新擷取圖片。對漫畫應該僅在偶爾需要從頭檢查時開啟此選項。default:false + // recheck='changed': 若是已變更,例如有新的章節,則重新下載/檢查所有章節內容。否則只會自上次下載過的章節接續下載。 + // recheck : 'changed', + + // search_work_interval : '2s', + // chapter_time_interval : '2s', + + site_name : 'Podcast', + + base_URL : 'https://podcasts.apple.com/', + + // 解析 作品名稱 → 作品id get_work() + search_URL : function(key) { + return 'https://www.apple.com/tw/search/' + key + '?src=globalnav'; + }, + parse_search_result : function(html, get_label) { + html = html.between(' id="explore"'); + // console.log(html); + var id_data = [], + // {Array}id_list = [id,id,...] + id_list = []; + + html.each_between('
', null, + // + function(text) { + var matched = text.match(/\/podcast\/([^\/"]+)\/id(\d+)"/); + if (!matched) + return; + var title_id = decodeURIComponent(matched[1]); + id_list.push(title_id + '-' + matched[2]); + var title = get_label(text.between( + '

', '

')); + id_data.push(title); + if (false && title_id !== title) { + CeL.error('parse_search_result: Different title! ' + + JSON.stringify(title) + ', ' + + JSON.stringify(title_id)); + } + }); + // console.log([ id_list, id_data ]); + return [ id_list, id_data ]; + }, + + // 取得作品的章節資料。 get_work_data() + work_URL : function(work_id) { + var matched = work_id.match(/^(.+)-(\d+)$/); + return 'tw/podcast/' + matched[1] + '/id' + matched[2]; + }, + parse_work_data : function(html, get_label, extract_work_data) { + // console.trace(html); + var work_data = { + // 必要屬性:須配合網站平台更改。 + /** + * +

最仙遊文 / 虾写

+
+ */ + title : get_label(html.between( + '').between( + '>')) + + // 選擇性屬性:須配合網站平台更改。 + }; + + // console.trace(text); + Object.assign(work_data, JSON.parse(html.between( + // + ''))); + // e.g., + // https://podcasts.apple.com/tw/podcast/%E4%B8%8B%E4%B8%80%E6%9C%AC%E8%AE%80%E4%BB%80%E9%BA%BC/id1532820533 + work_data.title = work_data.title.replace(/[‪‬]/g, ''); + + // 由 meta data 取得作品資訊。 + // extract_work_data(work_data, html); + + // console.log(html); + // console.log(work_data); + return work_data; + }, + + get_chapter_list : function(work_data, html, get_label) { + //
+ //

目录

+ + var data = html.between(' id="shoebox-media-api-cache-amp-podcasts">', + ''); + data = JSON.parse(data); + data = data[Object.keys(data)[0]]; + data = JSON.parse(data); + data = data.d; + data = data[0]; + data = data.relationships.episodes.data; + // console.trace(data, Object.keys(data)); + + data.forEach(function(chapter_data) { + chapter_data.title = chapter_data.attributes.name; + chapter_data.url = chapter_data.attributes.url; + }); + // reset work_data.chapter_list + work_data.chapter_list = data; + // console.log(work_data.chapter_list); + }, + + pre_parse_chapter_data + // 執行在解析章節資料 process_chapter_data() 之前的作業 (async)。 + // 必須自行保證執行 callback(),不丟出異常、中斷。 + : function(XMLHttp, work_data, callback, chapter_NO) { + var chapter_data = work_data.chapter_list[chapter_NO - 1]; + // console.trace(chapter_data); + + var directory = work_data.directory + 'media' + CeL.env.path_separator, + // + title = chapter_data.title, + // + url = decodeURI(chapter_data.attributes.assetUrl), + // + extension = url.match(/(\.[^.?]+)(?:\?.*)?$/)[1], + // + file_name = directory + // + chapter_NO.pad(work_data.chapter_NO_pad_digits || 4) + ' ' + + CeL.to_file_name(title) + extension; + // console.trace({directory,title,url,extension}); + CeL.create_directory(directory); + + var matched = url.match(/https%3A%2F%2F[^?]+/); + if (matched) + url = decodeURIComponent(matched[0]); + + CeL.log_temporary('Fetching [' + file_name + '] (' + url + ')...'); + // CeL.set_debug(9); + CeL.get_URL_cache(url, function(data, error) { + callback(); + }, { + file_name : file_name, + encoding : undefined, + get_URL_options : Object.assign({ + error_retry : this.MAX_ERROR_RETRY + }, this.get_URL_options, { + // 有些檔案比較大,必須花費比較多時間。 + timeout : 5 * 60 * 1000 + }) + }); + }, + + // 取得每一個章節的各個影像內容資料。 get_chapter_data() + parse_chapter_data : function(html, work_data, get_label, chapter_NO) { + // console.log(html); + + var chapter_data = work_data.chapter_list[chapter_NO - 1]; + var text = chapter_data.attributes.description.standard; + + this.add_ebook_chapter(work_data, chapter_NO, { + title : chapter_data.title, + date : html.between('
', '
'); + }, + // 去掉前後網站廣告。 + remove_ads : function remove_ads(text) { + // 去掉前後網站廣告。 + text = text.replace( + /** + * + // https://www.biqizw.com/3_3733/3167227.html 第39章“师兄,承让了!” + 比奇中文网 www.biqizw.com,最快更新长生:开局一条命,修为全靠苟 !

+
+ */ + /[^<>]+中文网\s*[\w.]+,最快更新[^<>]+/, '') + + .replace( + /** + * + // https://www.biqizw.com/3_3733/3167227.html + + */ + /无尽的昏迷过后,时宇猛地从床上起身。想要看最新章节内容,请下载星星阅读app,[\s\S]+比奇中文/, '') + + .replace( + /** + * + // https://www.biqizw.com/3_3733/3167227.html +

    <a href="http://www.biqizw.com" target="_blank">www.biqizw.com</a> 比奇中文 +
+ */ + /<a href=[\s\S]+?(]*>|$)/, '$1') + + .replace( + /** + * + + // https://www.biqizw.com/3_3733/3167190.html 长生:开局一条命,修为全靠苟 第2章 宗门里的摸鱼日常 + 学不到。Μ.

     + + // https://www.biqizw.com/3_3733/3167191.html 长生:开局一条命,修为全靠苟 第3章 猪肉铺的姑娘 + 说了话。【1】 【6】 【6】 【小】 【说】

     + + // https://www.biqizw.com/3_3733/3167192.html 长生:开局一条命,修为全靠苟 第4章 不试一试,怎么知道不行呢? + 宗门的安危。”ωWW.

     + + // https://www.biqizw.com/3_3733/3167194.html 长生:开局一条命,修为全靠苟 第6章 人生若只如初见 + 熟悉的面容。大风小说

  + + // https://www.biqizw.com/3_3733/3167200.html 长生:开局一条命,修为全靠苟 第12章 苟着也能惹祸上身? + 撂倒了……166小说

+ + // https://www.biqizw.com/3_3733/3167531.html 长生:开局一条命,修为全靠苟 第341章 百年计划 + 166小说 无尽的昏迷过后,时宇猛地从床上起身。 +
+ */ + /(?:ωWW\.|166小说|大风小说|(?<=\W)Μ\.|【1】 【6】 【6】 【小】 【说】)(]*>|\s*$)/g + // + , '$1') + + .replace( + /** + * + + // https://www.biqizw.com/3_3733/3167227.html 长生:开局一条命,修为全靠苟 第39章“师兄,承让了!” + 以压倒性的优势取得了胜利。水印广告测试   水印广告测试

+ 时宇猛地从床上起身。想要看最新章节内容,请下载星星阅读app,无广告免费阅读最新章节内容。网站已经不更新最新章节内容,已经星星阅读小说APP更新最新章节内容。

+ 这不是他!下载星星阅读app,阅读最新章节内容无广告免费

+ +
+ */ + /(?:水印广告测试|想要看最新章节内容|下载星星阅读)[^<>]*?(]*>)/, '$1') + + ; + + // console.log(text); + return text; + } +}); + +// ---------------------------------------------------------------------------- + +// CeL.set_debug(3); + +start_crawler(crawler, typeof module === 'object' && module); diff --git a/novel.cmn-Hans-CN/cwjjj.js b/novel.cmn-Hans-CN/cwjjj.js new file mode 100644 index 00000000..3ac77382 --- /dev/null +++ b/novel.cmn-Hans-CN/cwjjj.js @@ -0,0 +1,170 @@ +/** + * 批量下載 翠微居 的工具。 Download cwjjj novels. + */ + +'use strict'; + +require('../work_crawler_loader.js'); + +// ---------------------------------------------------------------------------- + +CeL.run([ 'application.storage.EPUB' +// CeL.detect_HTML_language() +, 'application.locale' ]); + +// ---------------------------------------------------------------------------- + +var crawler = new CeL.work_crawler({ + // auto_create_ebook, automatic create ebook + // MUST includes CeL.application.locale! + need_create_ebook : true, + // recheck:從頭檢測所有作品之所有章節與所有圖片。不會重新擷取圖片。對漫畫應該僅在偶爾需要從頭檢查時開啟此選項。default:false + // recheck='changed': 若是已變更,例如有新的章節,則重新下載/檢查所有章節內容。否則只會自上次下載過的章節接續下載。 + // recheck : 'changed', + + // 搜索间隔: 30 秒 + search_work_interval : '40s', + // chapter_time_interval : '2s', + + // 2023/9/26前: https://www.cwjjj.com/ + // 2024/3/10: https://www.cwjx8.com/ + base_URL : 'https://www.cwjx8.com/', + + // 解析 作品名稱 → 作品id get_work() + search_URL : function(work_title) { + return [ 'search/', { + searchkey : work_title, + searchtype : 'all', + Submit : '' + } ]; + }, + parse_search_result : function(html, get_label) { + if (!html.includes('
  • ')) + console.log(html); + + var id_data = [], + // {Array}id_list = [id,id,...] + id_list = []; + + html.each_between('
  • ', '
  • ', function(text) { + var matched = text.match( + //

    我只想安静的做个苟道中人(精校反和谐加料版)

    + /

    ([\s\S]+?)<\/a>/); + id_list.push(matched[1]); + id_data.push(get_label(matched[2])); + }); + + // console.log([ id_list, id_data ]); + return [ id_list, id_data ]; + }, + + // 取得作品的章節資料。 get_work_data() + work_URL : function(work_id) { + return 'book/' + work_id + '/'; + }, + parse_work_data : function(html, get_label, extract_work_data) { + // console.trace(html); + if (!this.site_name) { + //