diff --git a/.gitignore b/.gitignore index 41e6c6cd..28c6287f 100644 --- a/.gitignore +++ b/.gitignore @@ -160,3 +160,4 @@ dist /scripts/test/rsa-test.json /apps/salary/ /jx/_30wmv.js +.DS_Store diff --git "a/jx/JSON\345\220\210\351\233\206.js" "b/jx/JSON\345\220\210\351\233\206.js" index b0f4703d..1965a65e 100644 --- "a/jx/JSON\345\220\210\351\233\206.js" +++ "b/jx/JSON\345\220\210\351\233\206.js" @@ -64,7 +64,7 @@ async function lazy(input, params) { * 包含多个备用解析接口,提高解析成功率 */ let parse_list = [ - "https://zy.qiaoji8.com/gouzi.php?url=", // 主要解析接口 + "https://kalbim.xatut.top/kalbim2025/781718/play/video_player.php?url=", // 主要解析接口 "http://1.94.221.189:88/algorithm.php?url=" // 备用解析接口 ] diff --git a/jx/json1.js b/jx/json1.js index a588aa42..7a0886d5 100644 --- a/jx/json1.js +++ b/jx/json1.js @@ -82,7 +82,7 @@ async function lazy(input, params) { let timeout = 8000; // 设置请求超时时间为8秒 // 调用第三方解析API获取视频直链 - let obj = await requestJson('https://cdnsrc.cdnapi.top/json/?url=' + input, {headers, timeout}); + let obj = await requestJson('https://kalbim.xatut.top/kalbim2025/781718/play/video_player.php?url=' + input, {headers, timeout}); return obj.url // 返回解析后的视频播放链接 } diff --git a/jx/web1.js b/jx/web1.js index e190d820..6c870d83 100644 --- a/jx/web1.js +++ b/jx/web1.js @@ -63,7 +63,7 @@ const jx = { * 添加url属性直接暴露api,不走系统。建议web解析才写这个属性,json解析隐藏起来 * @type {string} */ - url: 'https://bfq.cfwlgzs.cn/player?url=', + url: 'https://www.ckplayer.vip/jiexi/?url=', }; /** diff --git a/public/sub/order_common.example.html b/public/sub/order_common.example.html index a82a7930..99d5a641 100644 --- a/public/sub/order_common.example.html +++ b/public/sub/order_common.example.html @@ -1,7 +1,9 @@ +豆瓣 设置中心 番茄小说 腾云驾雾 央视大全 +短剧聚合 IPTV [优] [盘] diff --git "a/spider/js/\344\270\203\347\214\253\347\237\255\345\211\247.js" "b/spider/js/\344\270\203\347\214\253\347\237\255\345\211\247[\347\237\255].js" similarity index 100% rename from "spider/js/\344\270\203\347\214\253\347\237\255\345\211\247.js" rename to "spider/js/\344\270\203\347\214\253\347\237\255\345\211\247[\347\237\255].js" diff --git "a/spider/js/\345\216\273\350\257\273\344\271\246[\344\271\246].js" "b/spider/js/\345\216\273\350\257\273\344\271\246[\344\271\246].js" index 86b8b485..7a0c87f6 100644 --- "a/spider/js/\345\216\273\350\257\273\344\271\246[\344\271\246].js" +++ "b/spider/js/\345\216\273\350\257\273\344\271\246[\344\271\246].js" @@ -26,41 +26,24 @@ var rule = { filterable: 0, timeout: 10000, play_parse: true, - headers: { - 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36' - }, - request: async function (url, obj) { - obj = obj || {}; - try { - const response = await _fetch(url, { - method: obj.method || 'GET', - headers: obj.headers || this.headers - }); - return response.text(); - } catch (err) { - return ''; - } - }, - + headers: { 'User-Agent': 'MOBILE_UA' }, + 一级: async function () { let {input, pdfa, pdfh, pd} = this; - let url = input.startsWith('http') ? input : this.host + '/book/' + input + '/0/1.html'; - let html = await this.request(url); + let url = input.startsWith('http') ? input : `${this.host}/book/${input}/0/1.html`; + let html = await request(url); let d = []; let items = pdfa(html, '.blockcontent .c_row') || pdfa(html, '.c_row') || []; for (let item of items) { let title = pdfh(item, '.c_subject a:eq(1)&&Text'); - let itemUrl = pd(item, '.c_subject a:eq(1)&&href'); - if (!title || !itemUrl) continue; - let remarks = pdfh(item, '.c_tag span:eq(1)&&Text') || ''; - let pic = pd(item, 'img&&src') || ''; - let content = pdfh(item, '.c_description&&Text') || ''; + let url = pd(item, '.c_subject a:eq(1)&&href'); + if (!title || !url) continue; d.push({ - title: title, - url: itemUrl, - desc: remarks, - pic_url: pic, - content: content, + title, + url, + desc: pdfh(item, '.c_tag span:eq(1)&&Text') || '', + pic_url: pd(item, 'img&&src') || '', + content: pdfh(item, '.c_description&&Text') || '', }); } return setResult(d); @@ -68,58 +51,47 @@ var rule = { 二级: async function () { let {input, pdfa, pdfh, pd} = this; - let html = await this.request(input); - let VOD = {}; - VOD.vod_name = pdfh(html, '[property="og:novel:book_name"]&&content') || ''; - VOD.type_name = ''; - VOD.vod_pic = pd(html, '.divbox.cf img&&src') || ''; - VOD.vod_content = pdfh(html, '.tabcontent .tabvalue:eq(0)&&Text') || ''; - VOD.vod_remarks = pdfh(html, 'h3 a&&Text') || ''; - VOD.vod_year = ''; - VOD.vod_area = ''; - VOD.vod_actor = pdfh(html, '[property="og:novel:author"]&&content') || ''; - VOD.vod_director = VOD.vod_actor; - VOD.vod_play_from = '去读书网'; - let toc_url = pd(html, 'a:contains(点击阅读)&&href') || ''; - if (toc_url && !toc_url.startsWith('http')) { - toc_url = this.host + toc_url; - } - let toc_html = toc_url ? await this.request(toc_url) : ''; + let html = await request(input); + let VOD = { + vod_name: pdfh(html, '[property="og:novel:book_name"]&&content') || '', + vod_pic: pd(html, '.divbox.cf img&&src') || '', + vod_content: pdfh(html, '.tabcontent .tabvalue:eq(0)&&Text') || '', + vod_remarks: pdfh(html, 'h3 a&&Text') || '', + vod_actor: pdfh(html, '[property="og:novel:author"]&&content') || '', + vod_play_from: '去读书网' + }; + VOD.vod_director = VOD.vod_actor; // 复用作者信息 + let tocUrl = pd(html, 'a:contains(点击阅读)&&href') || ''; + tocUrl = tocUrl && !tocUrl.startsWith('http') ? `${this.host}${tocUrl}` : tocUrl; + let tocHtml = tocUrl ? await request(tocUrl) : ''; let chapters = []; - let chapterItems = pdfa(toc_html, '.index li') || []; - for (let chapter of chapterItems) { - let title = pdfh(chapter, 'a&&Text'); - let chapter_url = pd(chapter, 'a&&href'); - if (!title || !chapter_url) continue; - if (!chapter_url.startsWith('http')) { - chapter_url = this.host + chapter_url; - } - chapters.push(title + '$' + chapter_url); + let chs = pdfa(tocHtml, '.index li') || []; + for (let ch of chs) { + let title = pdfh(ch, 'a&&Text'); + let chUrl = pd(ch, 'a&&href'); + if (!title || !chUrl) continue; + chUrl = chUrl.startsWith('http') ? chUrl : `${this.host}${chUrl}`; + chapters.push(`${title}$${chUrl}`); } VOD.vod_play_url = chapters.join('#'); return VOD; }, 搜索: async function () { - let {KEY, pdfa, pdfh, pd} = this; - let url = this.host + this.searchUrl.replace('**', encodeURIComponent(KEY)); - let html = await this.request(url); - if (!html) { - url = this.host + '/modules/article/search.php?q=' + encodeURIComponent(KEY); - html = await this.request(url); - } + let {input, pdfa, pdfh, pd} = this; + let html = await request(input); let d = []; let items = pdfa(html, '#jieqi_page_contents .c_row') || []; for (let item of items) { let title = pdfh(item, '.c_subject a&&Text'); - let itemUrl = pd(item, '.c_subject a&&href'); - if (!title || !itemUrl) continue; - itemUrl = itemUrl.startsWith('http') ? itemUrl : this.host + itemUrl; + let url = pd(item, '.c_subject a&&href'); + if (!title || !url) continue; + url = url.startsWith('http') ? url : `${this.host}${url}`; let pic = pd(item, 'img&&src') || ''; - pic = pic.startsWith('http') ? pic : this.host + pic; + pic = pic.startsWith('http') ? pic : `${this.host}${pic}`; d.push({ - title: title, - url: itemUrl, + title, + url, desc: pdfh(item, '.c_tag span:eq(1)&&Text') || '', pic_url: pic, content: '', @@ -130,26 +102,28 @@ var rule = { lazy: async function () { let {input, pdfh} = this; - let html = await this.request(input); + let html = await request(input); let title = pdfh(html, 'h1&&Text') || ''; let content = pdfh(html, '#acontent&&Html') || ''; if (content) { - content = content.replace(/]*?>.*?<\/script>/gs, '') - .replace(/<\/p>/g, '\n\n') - .replace(/]*?>/g, '\n') - .replace(/<[^>]*?>/g, '') - .replace(/去读书推荐各位书友阅读:.*|去读书 www\.qudushu\.la|如果您中途有事离开,请按.*以便以后接着观看!/g, '') - .replace(/[()]/g, '') - .replace(/ /g, ' ') - .replace(/[ \t]+/g, ' ') - .replace(/\n[ \t]+|[ \t]+\n/g, '\n') - .replace(/\n+/g, '\n\n') - .trim(); + const replaceRules = [ + [/]*?>[\s\S]*?<\/script>/gi, ''], + [/<\/p>|/g, '\n'], + [/<[^>]*?>/g, ''], + [/去读书推荐各位书友阅读:.*|去读书 www\.qudushu\.la|如果您中途有事离开,请按.*以便以后接着观看!/g, ''], + [/ |[ \t]+/g, ' '], + [/\n[ \t]*\n+/g, '\n'] + ]; + replaceRules.forEach(([reg, val]) => content = content.replace(reg, val)); + content = content.trim(); + if (content.startsWith(title)) { + content = content.replace(title, '').trim(); + } } return { parse: 0, - url: 'novel://' + JSON.stringify({title, content}), + url: `novel://${JSON.stringify({title, content})}`, js: '' }; } -}; +}; \ No newline at end of file diff --git "a/spider/js/\345\217\257\345\217\257\345\275\261\350\247\206.js" "b/spider/js/\345\217\257\345\217\257\345\275\261\350\247\206.js" deleted file mode 100644 index f1d6224c..00000000 --- "a/spider/js/\345\217\257\345\217\257\345\275\261\350\247\206.js" +++ /dev/null @@ -1,60 +0,0 @@ -/* -@header({ - searchable: 0, - filterable: 0, - quickSearch: 0, - title: '可可影视', - '类型': '影视', - lang: 'ds' -}) -*/ - -var rule = { - 类型: '影视', - title: '可可影视', - host: 'https://www.keke1.app/', - url: '/show/fyclass-----2-fypage.html', - filter_url: '', - searchUrl: '/search?k=**穹&page=fypage', - searchable: 0, - quickSearch: 0, - filterable: 0, - filter: '', - headers: { - 'User-Agent': MOBILE_UA, - }, - timeout: 5000, - class_name: '电影&连续剧&动漫&综艺&短剧', - class_url: '1&2&3&4&6', - play_parse: true, - class_parse: async () => { - }, - 预处理: async () => { - }, - 图片替换: async function (input) { - let {HOST} = this; - // console.log('HOST:', HOST); - return input.replace(HOST, "https://vres.cfaqcgj.com"); - }, - 推荐: '.section-box:eq(2)&&.module-box-inner&&.module-item;*;*;*;*', - double: false, - 一级: '.module-box-inner&&.module-item;.v-item-title:eq(1)&&Text;img:last-of-type&&data-original;.v-item-bottom&&span&&Text;a&&href', - 二级: { - title: '.detail-pic&&img&&alt;.detail-tags&&a&&Text', - img: '.detail-pic&&img&&data-original', - desc: '.detail-info-row-main:eq(-2)&&Text;.detail-tags&&a&&Text;.detail-tags&&a:eq(1)&&Text;.detail-info-row-main:eq(1)&&Text;.detail-info-row-main&&Text', - content: '.detail-desc&&Text', - tabs: '.source-item-label', - //tabs: 'body&&.source-item-label[id]', - lists: '.episode-list:eq(#id) a', - }, - 搜索: '.search-result-list&&a;.title:eq(1)&&Text;*;.search-result-item-header&&Text;a&&href;.desc&&Text', - lazy: $js.toString(async () => { - log('input:', input); - return { - parse: 1, - url: input, - js: 'document.querySelector("#my-video video").click()', - } - }), -}; \ No newline at end of file diff --git "a/spider/js/\345\217\257\350\247\206\345\275\261\351\231\242.js" "b/spider/js/\345\217\257\350\247\206\345\275\261\351\231\242.js" deleted file mode 100644 index 5847df78..00000000 --- "a/spider/js/\345\217\257\350\247\206\345\275\261\351\231\242.js" +++ /dev/null @@ -1,121 +0,0 @@ -/* -@header({ - searchable: 2, - filterable: 1, - quickSearch: 1, - title: '可视影视', - '类型': '影视', - lang: 'ds' -}) -*/ - -var rule = { - 类型:'影视', - title:'可视影视', - desc:'251207_DS', - host:'https://www.ketv.cc', - url: '/s/fyfilter.html', - searchUrl:'/search/**----------fypage---.html', - searchable:2,quickSearch:1,timeout:5000,play_parse:true,filterable:1, - headers: {'User-Agent': 'MOBILE_UA'}, - class_name: '电影&电视剧&综艺&动漫&短剧&动画片', - class_url: 'movie&series&variety&anime&skit&animation', - filter_url: '{{fl.cateId or "fyclass"}}-{{fl.area}}-{{fl.by}}-{{fl.class}}-{{fl.lang}}-{{fl.letter}}---fypage---{{fl.year}}', - - 预处理: async () => { - return [] - }, - - 推荐: async function (tid, pg, filter, extend) { - return this.一级(tid, pg, filter, extend); - }, - - 一级: async function (tid, pg, filter, extend) { - let {input, pdfa, pdfh, pd} = this; - let html = await request(input); - let d = []; - let data = pdfa(html, '.lazyload'); - data.forEach((it) => { - d.push({ - title: pdfh(it, 'a&&title'), - pic_url: pd(it, '.lazyload&&data-original'), - desc: pdfh(it, '.text_right&&Text'), - url: pd(it, 'a&&href'), - }) - }); - return setResult(d) - }, - - 二级: async function (ids) { - let {input, pdfa, pdfh, pd} = this; - let html = await request(input); - let VOD = {}; - VOD.vod_id = input; - VOD.vod_name = pdfh(html, 'h2.title&&Text'); - VOD.type_name = pdfh(html, '.data:contains(类型)&&Text').replace('类型:', ''); - VOD.vod_pic = pd(html, '#detail_rating img&&src', input); - VOD.vod_remarks = pdfh(html, '.data_style&&Text'); - VOD.vod_content = pdfh(html, '.content_desc span&&Text'); - VOD.vod_year = pdfh(html, '.data:contains(年份) a&&Text'); - VOD.vod_area = pdfh(html, '.data:contains(地区) a&&Text'); - VOD.vod_director = pdfh(html, '.data:contains(导演)&&Text').replace('导演:', '').trim(); - VOD.vod_actor = pdfh(html, '.data:contains(主演)&&Text').replace('主演:', '').trim(); - let r_ktabs = pdfa(html,'#NumTab a'); - let ktabs = r_ktabs.map(it => { - let altText = pd(it, 'a&&alt'); - return altText || pdfh(it, 'Text').replace(/^\s*[\uE000-\uF8FF]+\s*/, '').trim(); - }).filter(name => name && !name.includes('Playlist')); - VOD.vod_play_from = ktabs.join('$$$'); - let klists = []; - let r_plists = pdfa(html, '.play_list_box .content_playlist.clearfix'); - r_plists.forEach((rp, index) => { - if (index < ktabs.length) { - let klist = pdfa(rp, 'a').map((it) => { - return pdfh(it, 'a&&Text') + '$' + pd(it, 'a&&href', input); - }).filter(item => { - return !item.includes('APP播放'); - }); - klist = klist.join('#'); - klists.push(klist); - } - }); - VOD.vod_play_url = klists.join('$$$'); - return VOD; - }, - - 搜索: async function (wd, quick, pg) { - return this.一级(wd, quick, pg); - }, - - lazy: async function lazyFunc() { - let html = await request(input); - let kcode = JSON.parse(html.split('aaaa=')[1].split('<')[0]); - let kurl = kcode.url; - if (/\.(m3u8|mp4)/.test(kurl)) { - input = { - jx: 0, - parse: 0, - url: kurl, - header: { - 'User-Agent': MOBILE_UA, - 'Referer': getHome(kurl) - } - }; - } else { - input = { - jx: 0, - parse: 1, - url: input - }; - } -}, -filter_def:{movie:{cateId:'movie'},series:{cateId:'series'},variety:{cateId:'variety'},anime:{cateId:'anime'},skit:{cateId:'skit'},animation:{cateId:'animation'}}, -filter:{ -"movie":[{"key":"cateId","name":"分类","value":[{"n":"全部","v":"all"},{"n":"动作片","v":"Action"},{"n":"喜剧片","v":"Funny"},{"n":"爱情片","v":"Lovestory"},{"n":"科幻片","v":"Science"},{"n":"恐怖片","v":"terrorist"},{"n":"剧情片","v":"plot"},{"n":"战争片","v":"war"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"大陆","v":"大陆"},{"n":"香港","v":"香港"},{"n":"台湾","v":"台湾"},{"n":"美国","v":"美国"},{"n":"法国","v":"法国"},{"n":"英国","v":"英国"},{"n":"日本","v":"日本"},{"n":"韩国","v":"韩国"},{"n":"德国","v":"德国"},{"n":"泰国","v":"泰国"},{"n":"印度","v":"印度"},{"n":"意大利","v":"意大利"},{"n":"西班牙","v":"西班牙"},{"n":"加拿大","v":"加拿大"},{"n":"其他","v":"其他"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2024","v":"2024"},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"}]},{"key":"letter","name":"字母","value":[{"n":"全部","v":""},{"n":"A","v":"A"},{"n":"B","v":"B"},{"n":"C","v":"C"},{"n":"D","v":"D"},{"n":"E","v":"E"},{"n":"F","v":"F"},{"n":"G","v":"G"},{"n":"H","v":"H"},{"n":"I","v":"I"},{"n":"J","v":"J"},{"n":"K","v":"K"},{"n":"L","v":"L"},{"n":"M","v":"M"},{"n":"N","v":"N"},{"n":"O","v":"O"},{"n":"P","v":"P"},{"n":"Q","v":"Q"},{"n":"R","v":"R"},{"n":"S","v":"S"},{"n":"T","v":"T"},{"n":"U","v":"U"},{"n":"V","v":"V"},{"n":"W","v":"W"},{"n":"X","v":"X"},{"n":"Y","v":"Y"},{"n":"Z","v":"Z"},{"n":"0-9","v":"0-9"}]},{"key":"by","name":"排序","value":[{"n":"按最新","v":"time"},{"n":"按最热","v":"hits"},{"n":"按评分","v":"score"}]}], -"series":[{"key":"cateId","name":"分类","value":[{"n":"全部","v":"all"},{"n":"国产剧","v":"china"},{"n":"香港剧","v":"hongkong"},{"n":"韩国剧","v":"korea"},{"n":"欧美剧","v":"eus"},{"n":"日本剧","v":"japan"},{"n":"台湾剧","v":"taiwan"},{"n":"海外剧","v":"overseas"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"大陆","v":"大陆"},{"n":"香港","v":"香港"},{"n":"台湾","v":"台湾"},{"n":"美国","v":"美国"},{"n":"法国","v":"法国"},{"n":"英国","v":"英国"},{"n":"日本","v":"日本"},{"n":"韩国","v":"韩国"},{"n":"德国","v":"德国"},{"n":"泰国","v":"泰国"},{"n":"印度","v":"印度"},{"n":"意大利","v":"意大利"},{"n":"西班牙","v":"西班牙"},{"n":"加拿大","v":"加拿大"},{"n":"其他","v":"其他"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2024","v":"2024"},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"}]},{"key":"letter","name":"字母","value":[{"n":"全部","v":""},{"n":"A","v":"A"},{"n":"B","v":"B"},{"n":"C","v":"C"},{"n":"D","v":"D"},{"n":"E","v":"E"},{"n":"F","v":"F"},{"n":"G","v":"G"},{"n":"H","v":"H"},{"n":"I","v":"I"},{"n":"J","v":"J"},{"n":"K","v":"K"},{"n":"L","v":"L"},{"n":"M","v":"M"},{"n":"N","v":"N"},{"n":"O","v":"O"},{"n":"P","v":"P"},{"n":"Q","v":"Q"},{"n":"R","v":"R"},{"n":"S","v":"S"},{"n":"T","v":"T"},{"n":"U","v":"U"},{"n":"V","v":"V"},{"n":"W","v":"W"},{"n":"X","v":"X"},{"n":"Y","v":"Y"},{"n":"Z","v":"Z"},{"n":"0-9","v":"0-9"}]},{"key":"by","name":"排序","value":[{"n":"按最新","v":"time"},{"n":"按最热","v":"hits"},{"n":"按评分","v":"score"}]}], -"variety":[{"key":"cateId","name":"分类","value":[{"n":"全部","v":"all"},{"n":"大陆","v":"cn"},{"n":"日韩","v":"JapanKorea"},{"n":"港台","v":"HongKongTaiwan"},{"n":"欧美","v":"Eusa"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"大陆","v":"大陆"},{"n":"香港","v":"香港"},{"n":"台湾","v":"台湾"},{"n":"美国","v":"美国"},{"n":"法国","v":"法国"},{"n":"英国","v":"英国"},{"n":"日本","v":"日本"},{"n":"韩国","v":"韩国"},{"n":"德国","v":"德国"},{"n":"泰国","v":"泰国"},{"n":"印度","v":"印度"},{"n":"意大利","v":"意大利"},{"n":"西班牙","v":"西班牙"},{"n":"加拿大","v":"加拿大"},{"n":"其他","v":"其他"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2024","v":"2024"},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"}]},{"key":"letter","name":"字母","value":[{"n":"全部","v":""},{"n":"A","v":"A"},{"n":"B","v":"B"},{"n":"C","v":"C"},{"n":"D","v":"D"},{"n":"E","v":"E"},{"n":"F","v":"F"},{"n":"G","v":"G"},{"n":"H","v":"H"},{"n":"I","v":"I"},{"n":"J","v":"J"},{"n":"K","v":"K"},{"n":"L","v":"L"},{"n":"M","v":"M"},{"n":"N","v":"N"},{"n":"O","v":"O"},{"n":"P","v":"P"},{"n":"Q","v":"Q"},{"n":"R","v":"R"},{"n":"S","v":"S"},{"n":"T","v":"T"},{"n":"U","v":"U"},{"n":"V","v":"V"},{"n":"W","v":"W"},{"n":"X","v":"X"},{"n":"Y","v":"Y"},{"n":"Z","v":"Z"},{"n":"0-9","v":"0-9"}]},{"key":"by","name":"排序","value":[{"n":"按最新","v":"time"},{"n":"按最热","v":"hits"},{"n":"按评分","v":"score"}]}], -"anime":[{"key":"cateId","name":"分类","value":[{"n":"全部","v":"all"},{"n":"国产","v":"chn"},{"n":"日本","v":"jp"},{"n":"欧美","v":"usa"},{"n":"海外","v":"others"}]},{"key":"area","name":"地区","value":[{"n":"全部","v":""},{"n":"大陆","v":"大陆"},{"n":"香港","v":"香港"},{"n":"台湾","v":"台湾"},{"n":"美国","v":"美国"},{"n":"法国","v":"法国"},{"n":"英国","v":"英国"},{"n":"日本","v":"日本"},{"n":"韩国","v":"韩国"},{"n":"德国","v":"德国"},{"n":"泰国","v":"泰国"},{"n":"印度","v":"印度"},{"n":"意大利","v":"意大利"},{"n":"西班牙","v":"西班牙"},{"n":"加拿大","v":"加拿大"},{"n":"其他","v":"其他"}]},{"key":"year","name":"年份","value":[{"n":"全部","v":""},{"n":"2024","v":"2024"},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2015","v":"2015"},{"n":"2014","v":"2014"},{"n":"2013","v":"2013"},{"n":"2012","v":"2012"},{"n":"2011","v":"2011"},{"n":"2010","v":"2010"},{"n":"2009","v":"2009"},{"n":"2008","v":"2008"}]},{"key":"letter","name":"字母","value":[{"n":"全部","v":""},{"n":"A","v":"A"},{"n":"B","v":"B"},{"n":"C","v":"C"},{"n":"D","v":"D"},{"n":"E","v":"E"},{"n":"F","v":"F"},{"n":"G","v":"G"},{"n":"H","v":"H"},{"n":"I","v":"I"},{"n":"J","v":"J"},{"n":"K","v":"K"},{"n":"L","v":"L"},{"n":"M","v":"M"},{"n":"N","v":"N"},{"n":"O","v":"O"},{"n":"P","v":"P"},{"n":"Q","v":"Q"},{"n":"R","v":"R"},{"n":"S","v":"S"},{"n":"T","v":"T"},{"n":"U","v":"U"},{"n":"V","v":"V"},{"n":"W","v":"W"},{"n":"X","v":"X"},{"n":"Y","v":"Y"},{"n":"Z","v":"Z"},{"n":"0-9","v":"0-9"}]},{"key":"by","name":"排序","value":[{"n":"按最新","v":"time"},{"n":"按最热","v":"hits"},{"n":"按评分","v":"score"}]}], -"skit":[{"key":"by","name":"排序","value":[{"n":"按最新","v":"time"},{"n":"按最热","v":"hits"},{"n":"按评分","v":"score"}]}], -"animation":[{"key":"area","name":"地区","value":[{"n":"全部","v":"all"},{"n":"大陆动画片","v":"大陆"},{"n":"日本动画片","v":"日本"},{"n":"美国动画片","v":"美国"},{"n":"韩国动画片","v":"韩国"},{"n":"香港动画片","v":"香港"}]},{"key":"by","name":"排序","value":[{"n":"按最新","v":"time"},{"n":"按最热","v":"hits"},{"n":"按评分","v":"score"}]}] -} -} \ No newline at end of file diff --git "a/spider/js/\345\245\207\347\217\215\345\274\202\345\205\275[\345\256\230].js" "b/spider/js/\345\245\207\347\217\215\345\274\202\345\205\275[\345\256\230].js" index e82ac317..1ac29a6a 100644 --- "a/spider/js/\345\245\207\347\217\215\345\274\202\345\205\275[\345\256\230].js" +++ "b/spider/js/\345\245\207\347\217\215\345\274\202\345\205\275[\345\256\230].js" @@ -195,4 +195,8 @@ var rule = { }); return setResult(d); }, + lazy: async function () { + let {input} = this; + return {jx: 1, url: input} + } } diff --git "a/spider/js/\346\230\237\350\212\275\347\237\255\345\211\247.js" "b/spider/js/\346\230\237\350\212\275\347\237\255\345\211\247[\347\237\255].js" similarity index 100% rename from "spider/js/\346\230\237\350\212\275\347\237\255\345\211\247.js" rename to "spider/js/\346\230\237\350\212\275\347\237\255\345\211\247[\347\237\255].js" diff --git "a/spider/js/\345\245\275\344\271\220\345\275\261\350\247\206.js" "b/spider/js/\346\230\237\350\276\260\345\275\261\351\231\242.js" similarity index 87% rename from "spider/js/\345\245\275\344\271\220\345\275\261\350\247\206.js" rename to "spider/js/\346\230\237\350\276\260\345\275\261\351\231\242.js" index 243cc497..a95204f1 100644 --- "a/spider/js/\345\245\275\344\271\220\345\275\261\350\247\206.js" +++ "b/spider/js/\346\230\237\350\276\260\345\275\261\351\231\242.js" @@ -3,17 +3,18 @@ searchable: 1, filterable: 1, quickSearch: 0, - title: '好乐影视', + title: '星辰影院', + '类型': '影视', lang: 'ds' }) */ var rule = { 类型: '影视', - title: '好乐影视', - host: 'https://www.haolev.com', - url: '/haoshow/fyfilter', - searchUrl: '/lesearch/**----------fypage---.html', + title: '星辰影院', + host: 'https://www.xcyycn.com', + url: '/vs/fyfilter', + searchUrl: '/s.html?wd=**&submit=', headers: {'User-Agent': 'MOBILE_UA'}, searchable: 1, quickSearch: 0, filterable: 1, play_parse: true, double: false, limit: 6, filter_url: '{{fl.cateId}}-{{fl.area}}-{{fl.by}}-{{fl.class}}-----fypage---{{fl.year}}.html', @@ -24,22 +25,15 @@ var rule = { class_url: '1&2&4&3', filter: 'H4sIAAAAAAAAA+2Zy04bSRSG9/MYXrOohtwmrzLKwhNZSpRMRoJMJBQhQcDEBgcbROw4OEDENYRLcxkwDbZfxlVtv8WUXVXnnJ4hx42HRRbe+T+nbn91ddXX5bcJL/H4t7eJF6nxxOPE05fJsbHEUOJV8o+UljK7o6bTWr9Jvvwr1S33qhNO77andzthLRITQzY6t9usVWzUCsgVK7otlzPC5cKdRXl5ZXNWuJyaKqjJos1ZAfUyx3ZwKKA/GDgKaDPzqRlkXZtGuFzr0Je1jzZnBfEXLl+hv46ANqfn1LvPrk0jYJxzR2Ftz43TCKj3bj8sLrp6RkB/s0vt8jfXnxGQ23qPc2YF5A7PZXDgckZAbmFW5k9czgiXa16va8c2ZwXUy2+2NmA+jXC59tpp87Jgc1ZAvUJOTcJzNwLmulHQs+jm2giYl4PtZn3dzYsRMJ9rB2H2vZtPI7BerpVZhXpdAf1tNXDVWgHjnGmE37fcOI2A/qbq7c91158RuJbyauUE1lJXQL3KWjMIwp1JVxU0zNyXJfXJ9WrFxJNO1ryNydFUkryMFV/mgrgv4+ZOuzzrDBkB3W6XVfXIdWsEPmhfXdbhQXcFGKovyJWac2METERpS1X23UQYgQvkG9azAh7K/DHmrIA2Tz9izgoYZ/0Cc1ZAvZm8diwz7t1BTZZCmNcLp4yrwWp4GRozYa2kim6aUON2sK7mG7ph2BGchhIffBlsu7QR6M2n3vyIt/S5PJx29YyAekVfdyS/fHVVQYO3/Imsz8tD9xBRQxv1UzMfzQC2LBqCcVTWWpOnegBuKKBhRSyuynTVrQgjoPbFmZ5WV9UIGOOHC5l2W40V0VmT/rWugAP8dxS85Pbk7pRzYQTkygFZBEaQw0P6yzgI1LgdzqlKCbbDroDxL5X1JujGbwR9ccdTyVHy4l6eNa9qMV/cYTF8z8a6P0l8BOMjND6M8WEa9zDu0bjAuCBx71eI658k/gjjj2j8IcYf0vgDjD+g8fsYv0/j6Nejfj3061G/Hvr1qF8P/XrUr4d+PepXoF9B/Qr0K6hfgX4F9SvQr6B+BfoV1K9Av4L6FehXUL8C/QrqV6BfQf0K9Kt/0mX5+zguSrWwJIP8fxalymVV6bxdOrNtvH6uS+PLltUnmPKXbfLZ89djNNk6mpEZd+iMPf1zNNXp/snQL4nhHzNmeHwlV+fjHmsrtWYAO64RMID9HX0oudfdiDhHHnc8ccchd+Spvy/kJnCrEbG2foZbWd5l+JpjTI5NOeZjWZ9hU46T++VW9vuBYX2OTTn+5Lic/V4J9vDbwoo47M3xLsfQLJczvNsvQ9/IyQOa/b/E15tVe5MoS9IcpfakzRiczHDg3ZFob+bnvhh6MzNLurci1t7keWumHZDngDwH5Hkzed67U/LU56u6/h7hTxsiR0fnUKDlIqEorUbL0RCUqx7pgytajoaixBktR0OE3H54i8lRJEem7G0kd4vJUCRHdSwJM2TDESZ7q8gQNEdgHEFzhMmRG3ubzNA1R8IctXLkrQqr4T7MixFxKDKcPmh9hWtRI35iUuyXBjnC7PvekyHF3hzYm9Z602YM0mKIkr23ZQh5wD0D7hlwzy24Z+SuuKe7h4ZX161sENlWbSjKKZFykVCUj6LlaCjKR9FyNASbbM9/2cxVCzncQcOmN3Ms8xvYBuo4JzJ70q1U5QZ86RkRh7ZYwmFOZJZGOBJj6K512Gj5GdemEfg006pahefYFXGoqV8S4+7s2DtJ7r6L++++vtDeWMMjvCN+YlLhaISjmH5Jhf2nkqOYGDdWDAvcwa1UjFu1u7i36u/OacA1A64ZcM0NXDPxDyQRoaiuJgAA', lazy: async function () { - let {input, pdfa, pdfh, pd} = this - const html = JSON.parse((await req(input)).content.match(/r player_.*?=(.*?) ({ - title: it.title, - url: `${this.host}/api/v4/book/detail?id=${it.id}`, - desc: it.author, - pic_url: it.image_link, - content: it.intro - })); - } - return setResult(d); - }, - - 二级: async function () { - let VOD = {}; - let bookId = this.input.match(/id=(\d+)/)[1]; - let detailParams = {id: bookId, imei_ip: '2937357107', teeny_mode: '0'}; - detailParams.sign = getSignStr(detailParams); - let detailHtml = await this.request(buildUrl(`${this.host}/api/v4/book/detail`, detailParams), {headers: this.sign_headers}); - let detailJson = JSON.parse(detailHtml); - if (detailJson?.data?.book) { - let book = detailJson.data.book; - VOD = { - vod_name: book.title, - type_name: book.book_tag_list?.map(tag => tag.title).join(',') || '', - vod_pic: book.image_link, - vod_content: book.intro, - vod_remarks: book.latest_chapter_title, - vod_year: '', vod_area: '', - vod_actor: book.author, vod_director: book.author, - vod_play_from: '阅读助手' - }; - let tocParams = {id: book.id}; - tocParams.sign = getSignStr(tocParams); - let tocHtml = await this.request(buildUrl('https://api-ks.wtzw.com/api/v1/chapter/chapter-list', tocParams), {headers: this.sign_headers}); - let tocJson = JSON.parse(tocHtml); - if (tocJson?.data?.chapter_lists) { - VOD.vod_play_url = tocJson.data.chapter_lists.map(chapter => - `${chapter.title}$${book.id}@@${chapter.id}@@${chapter.title}` - ).join('#'); - } - } - return VOD; - }, - - 搜索: async function () { - let d = []; - let params = { - gender: '3', imei_ip: '2937357107', - page: this.MY_PAGE, wd: this.KEY - }; - params.sign = getSignStr(params); - let html = await this.request(buildUrl(`${this.host}/api/v5/search/words`, params), {headers: this.sign_headers}); - let json = JSON.parse(html); - if (json?.data?.books) { - d = json.data.books.map(it => ({ - title: it.original_title, - desc: it.author, - pic_url: it.image_link, - url: `${this.host}/api/v4/book/detail?id=${it.id}`, - content: it.intro - })); - } - return setResult(d); - }, - - lazy: async function () { - let [bookId, chapterId, title] = this.input.split('@@'); - let content = '内容加载失败'; - let params = {id: bookId, chapterId}; - params.sign = getSignStr(params); - let html = await this.request(buildUrl('https://api-ks.wtzw.com/api/v1/chapter/content', params), {headers: this.sign_headers}); - let json = JSON.parse(html); - if (json?.data?.content) content = decodeContent(json.data.content); - return { - parse: 0, - url: `novel://${JSON.stringify({title, content})}`, - js: '' - }; - } -}; - -function getSignStr(params) { - const sign_key = "d3dGiJc651gSQ8w1"; - return md5(Object.keys(params).sort().reduce((pre, n) => pre + n + "=" + params[n], "") + sign_key); -} - -function decodeContent(content) { - let key = CryptoJS.enc.Utf8.parse("242ccb8230d709e1"); - let ivEncData = CryptoJS.enc.Base64.parse(content); - let iv = CryptoJS.lib.WordArray.create(ivEncData.words.slice(0, 4)); - let encrypted = CryptoJS.lib.WordArray.create(ivEncData.words.slice(4)); - let decrypted = CryptoJS.AES.decrypt({ciphertext: encrypted}, key, { - iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 - }); - return decrypted.toString(CryptoJS.enc.Utf8); -} \ No newline at end of file +dmFyIHJ1bGUgPSB7CiAgICDnsbvlnos6ICflsI/or7QnLAogICAgYXV0aG9yOiAnRXlsaW5TaXInLAogICAgdGl0bGU6ICfpmIXor7vliqnmiYtb5LmmXScsCiAgICBkZXNjOiAn6ZiF6K+75Yqp5omL5bCP6K+05rqQJywKICAgIGhvc3Q6ICdodHRwczovL2FwaS1iYy53dHp3LmNvbScsCiAgICBjaGFwdGVySG9zdDogJ2h0dHBzOi8vYXBpLWtzLnd0encuY29tJywKICAgIGhvbWVVcmw6ICdodHRwczovL2FwaS1iYy53dHp3LmNvbScsCiAgICB1cmw6ICcvYXBpL3Y0L2NhdGVnb3J5L2dldC1saXN0P2dlbmRlcj1meWNsYXNzJmNhdGVnb3J5X2lkPWZ5ZmlsdGVyJm5lZWRfZmlsdGVycz0xJnBhZ2U9ZnlwYWdlJm5lZWRfY2F0ZWdvcnk9MScsCiAgICBjbGFzc19uYW1lOiAn55S355SfJuWls+eUnyblh7rniYgnLAogICAgY2xhc3NfdXJsOiAnMSYyJjMnLAogICAgc2VhcmNoVXJsOiAnL2FwaS92NS9zZWFyY2gvd29yZHM/Z2VuZGVyPTMmaW1laV9pcD0yOTM3MzU3MTA3JnBhZ2U9ZnlwYWdlJndkPSoqJywKICAgIHNlYXJjaGFibGU6IDIsCiAgICBxdWlja1NlYXJjaDogMCwKICAgIGZpbHRlcmFibGU6IDEsCiAgICBmaWx0ZXI6IHsKICAgICAgICAiMSI6IFt7a2V5OiAidHlwZSIsIG5hbWU6ICLnsbvlnosiLCB2YWx1ZTogW3sibiI6IueOhOW5u+Wlh+W5uyIsInYiOiIyMDIifSx7Im4iOiLpg73luILkurrnlJ8iLCJ2IjoiMjAzIn0seyJuIjoi5q2m5L6g5LuZ5L6gIiwidiI6IjIwNSJ9LHsibiI6IuWOhuWPsuWGm+S6iyIsInYiOiI1NiJ9LHsibiI6IuenkeW5u+acq+S4liIsInYiOiI2NCJ9LHsibiI6Iua4uOaIj+ernuaKgCIsInYiOiI3NSJ9LHsibiI6IuS9k+iCsui1m+S6iyIsInYiOiIyMDYifSx7Im4iOiLlpYfpl7vlvILkuosiLCJ2IjoiMjA0In1dfV0sCiAgICAgICAgIjIiOiBbe2tleTogInR5cGUiLCBuYW1lOiAi57G75Z6LIiwgdmFsdWU6IFt7Im4iOiLnjrDku6PoqIDmg4UiLCJ2IjoiMSJ9LHsibiI6IuWPpOS7o+iogOaDhSIsInYiOiIyIn0seyJuIjoi5bm75oOz6KiA5oOFIiwidiI6IjQifSx7Im4iOiLnp43nlLDnu4/llYYiLCJ2IjoiMTYifV19XSwKICAgICAgICAiMyI6IFt7a2V5OiAidHlwZSIsIG5hbWU6ICLnsbvlnosiLCB2YWx1ZTogW3sibiI6IuaWh+WtpuiJuuacryIsInYiOiIyNDAifSx7Im4iOiLkurrmlofnp5HnpL4iLCJ2IjoiMjQxIn0seyJuIjoi57uP566h5Yqx5b+XIiwidiI6IjI0MiJ9LHsibiI6Iue7j+WFuOaWh+WtpiIsInYiOiIyNDMifSx7Im4iOiLkurrniankvKDorrAiLCJ2IjoiMjQ3In0seyJuIjoi5bCR5YS/5pWZ6IKyIiwidiI6IjI1OCJ9LHsibiI6IuWPpOS7o+iogOaDhSIsInYiOiIyNTkifSx7Im4iOiLnjrDku6PoqIDmg4UiLCJ2IjoiMjYwIn0seyJuIjoi5oKs55aR5o6o55CGIiwidiI6IjI2MiJ9LHsibiI6IuWOhuWPsuS8oOiusCIsInYiOiIyNjQifSx7Im4iOiLpnZLmmKXmloflraYiLCJ2IjoiMjY1In0seyJuIjoi546w5a6e5bCP6K+0IiwidiI6IjI2NiJ9LHsibiI6IuS7meS+oOWlh+e8mCIsInYiOiIyNzYifSx7Im4iOiLku5nkvqDlpYflubsiLCJ2IjoiMjg4In0seyJuIjoi5q2m5L6g5bCP6K+0IiwidiI6IjI4OSJ9LHsibiI6IueOsOS7o+WGm+aXhSIsInYiOiIyOTAifV19XQogICAgfSwKICAgIGZpbHRlcl91cmw6ICJ7e2ZsLnR5cGV9fSIsCiAgICBmaWx0ZXJfZGVmOiB7fSwKICAgIGhlYWRlcnM6IHsnVXNlci1BZ2VudCc6ICdNb3ppbGxhLzUuMCAoV2luZG93cyBOVCAxMC4wOyBXaW42NDsgeDY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvMTM5LjAuMC4wIFNhZmFyaS81MzcuMzYnfSwKICAgIHNpZ25faGVhZGVyczogewogICAgICAgICJhcHAtdmVyc2lvbiI6ICI1MTExMCIsICJwbGF0Zm9ybSI6ICJhbmRyb2lkIiwgInJlZyI6ICIwIiwgIkFVVEhPUklaQVRJT04iOiAiIiwKICAgICAgICAiYXBwbGljYXRpb24taWQiOiAiY29tLioqKioucmVhZGVyIiwgIm5ldC1lbnYiOiAiMSIsICJjaGFubmVsIjogInVua25vd24iLCAicW0tcGFyYW1zIjogIiIKICAgIH0sCiAgICB0aW1lb3V0OiAxMDAwMCwKICAgIHBsYXlfcGFyc2U6IHRydWUsCgogICAgYXBpUmVxdWVzdDogYXN5bmMgZnVuY3Rpb24gKGVuZHBvaW50LCBwYXJhbXMgPSB7fSwgb3B0aW9ucyA9IHt9KSB7CiAgICAgICAgY29uc3QgaG9zdCA9IG9wdGlvbnMuaG9zdCB8fCB0aGlzLmhvc3Q7CiAgICAgICAgcGFyYW1zLmltZWlfaXAgPSBwYXJhbXMuaW1laV9pcCB8fCAnMjkzNzM1NzEwNyc7CiAgICAgICAgcGFyYW1zLnNpZ24gPSBnZXRTaWduU3RyKHBhcmFtcyk7CiAgICAgICAgY29uc3QgdXJsID0gYnVpbGRVcmwoYCR7aG9zdH0ke2VuZHBvaW50fWAsIHBhcmFtcyk7CiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnJlcXVlc3QodXJsLCB7CiAgICAgICAgICAgIGhlYWRlcnM6IG9wdGlvbnMuaGVhZGVycyB8fCB0aGlzLnNpZ25faGVhZGVycywKICAgICAgICAgICAgbWV0aG9kOiBvcHRpb25zLm1ldGhvZCB8fCAnR0VUJwogICAgICAgIH0pOwogICAgICAgIHJldHVybiBKU09OLnBhcnNlKHJlc3BvbnNlKTsKICAgIH0sCiAgICAKICAgIHJlcXVlc3Q6IGFzeW5jIGZ1bmN0aW9uICh1cmwsIG9iaikgewogICAgICAgIG9iaiA9IG9iaiB8fCB7fTsKICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IF9mZXRjaCh1cmwsIHsKICAgICAgICAgICAgbWV0aG9kOiBvYmoubWV0aG9kIHx8ICdHRVQnLAogICAgICAgICAgICBoZWFkZXJzOiBvYmouaGVhZGVycyB8fCB0aGlzLmhlYWRlcnMKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gcmVzcG9uc2UudGV4dCgpOwogICAgfSwKCiAgICDpooTlpITnkIY6IGFzeW5jIGZ1bmN0aW9uICgpIHsKICAgICAgICB0aGlzLnNpZ25faGVhZGVycy5zaWduID0gZ2V0U2lnblN0cih0aGlzLnNpZ25faGVhZGVycyk7CiAgICB9LAoKICAgIOS4gOe6pzogYXN5bmMgZnVuY3Rpb24gKHRpZCwgcGcsIGZpbHRlciwgZXh0ZW5kKSB7CiAgICAgICAgbGV0IGQgPSBbXTsKICAgICAgICBjb25zdCBjYXRlTWFwID0geycxJzonMjAyJywgJzInOicxJywgJzMnOicyNDAnfTsKICAgICAgICBjb25zdCB0eXBlSWQgPSB0aWQgIT09ICctMScgPyB0aWQgOiAnMic7CiAgICAgICAgbGV0IGNhdGVnb3J5X2lkID0gY2F0ZU1hcFt0eXBlSWRdIHx8ICcxJzsKICAgICAgICBjb25zdCB2YWxpZFN1YlR5cGVzU2V0ID0gbmV3IFNldCgpOwogICAgICAgIE9iamVjdC52YWx1ZXModGhpcy5maWx0ZXIpLmZvckVhY2goZmlsdGVyR3JvdXAgPT4gewogICAgICAgICAgICBmaWx0ZXJHcm91cC5mb3JFYWNoKGl0ZW0gPT4gewogICAgICAgICAgICAgICAgaXRlbS52YWx1ZS5mb3JFYWNoKHN1YlR5cGUgPT4gewogICAgICAgICAgICAgICAgICAgIHZhbGlkU3ViVHlwZXNTZXQuYWRkKHN1YlR5cGUudik7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICAgICAgCiAgICAgICAgaWYgKGV4dGVuZD8udHlwZSAmJiB2YWxpZFN1YlR5cGVzU2V0LmhhcyhleHRlbmQudHlwZSkpIHsKICAgICAgICAgICAgY2F0ZWdvcnlfaWQgPSBleHRlbmQudHlwZTsKICAgICAgICB9IGVsc2UgaWYgKGZpbHRlciAmJiB2YWxpZFN1YlR5cGVzU2V0LmhhcyhmaWx0ZXIpKSB7CiAgICAgICAgICAgIGNhdGVnb3J5X2lkID0gZmlsdGVyOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBjb25zdCBwYXJhbXMgPSB7CiAgICAgICAgICAgIGdlbmRlcjogdHlwZUlkLAogICAgICAgICAgICBjYXRlZ29yeV9pZDogY2F0ZWdvcnlfaWQsCiAgICAgICAgICAgIG5lZWRfZmlsdGVyczogJzEnLAogICAgICAgICAgICBwYWdlOiBwZyB8fCAnMScsCiAgICAgICAgICAgIG5lZWRfY2F0ZWdvcnk6ICcxJwogICAgICAgIH07CiAgICAgICAgCiAgICAgICAgY29uc3QganNvbiA9IGF3YWl0IHRoaXMuYXBpUmVxdWVzdCgnL2FwaS92NC9jYXRlZ29yeS9nZXQtbGlzdCcsIHBhcmFtcyk7CiAgICAgICAgaWYgKGpzb24/LmRhdGE/LmJvb2tzKSB7CiAgICAgICAgICAgIGQgPSBqc29uLmRhdGEuYm9va3MubWFwKGl0ID0+ICh7CiAgICAgICAgICAgICAgICB0aXRsZTogaXQudGl0bGUsCiAgICAgICAgICAgICAgICB1cmw6IGAke3RoaXMuaG9zdH0vYXBpL3Y0L2Jvb2svZGV0YWlsP2lkPSR7aXQuaWR9YCwKICAgICAgICAgICAgICAgIGRlc2M6IGl0LmF1dGhvciwKICAgICAgICAgICAgICAgIHBpY191cmw6IGl0LmltYWdlX2xpbmssCiAgICAgICAgICAgICAgICBjb250ZW50OiBpdC5pbnRybwogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzZXRSZXN1bHQoZCk7CiAgICB9LAoKICAgIOS6jOe6pzogYXN5bmMgZnVuY3Rpb24gKCkgewogICAgICAgIGxldCBWT0QgPSB7fTsKICAgICAgICBsZXQgYm9va0lkID0gdGhpcy5pbnB1dC5tYXRjaCgvaWQ9KFxkKykvKVsxXTsKICAgICAgICBjb25zdCBkZXRhaWxKc29uID0gYXdhaXQgdGhpcy5hcGlSZXF1ZXN0KCcvYXBpL3Y0L2Jvb2svZGV0YWlsJywgewogICAgICAgICAgICBpZDogYm9va0lkLAogICAgICAgICAgICB0ZWVueV9tb2RlOiAnMCcKICAgICAgICB9KTsKICAgICAgICBpZiAoZGV0YWlsSnNvbj8uZGF0YT8uYm9vaykgewogICAgICAgICAgICBsZXQgYm9vayA9IGRldGFpbEpzb24uZGF0YS5ib29rOwogICAgICAgICAgICBWT0QgPSB7CiAgICAgICAgICAgICAgICB2b2RfbmFtZTogYm9vay50aXRsZSwKICAgICAgICAgICAgICAgIHR5cGVfbmFtZTogYm9vay5ib29rX3RhZ19saXN0Py5tYXAodGFnID0+IHRhZy50aXRsZSkuam9pbignLCcpIHx8ICcnLAogICAgICAgICAgICAgICAgdm9kX3BpYzogYm9vay5pbWFnZV9saW5rLAogICAgICAgICAgICAgICAgdm9kX2NvbnRlbnQ6IGJvb2suaW50cm8sCiAgICAgICAgICAgICAgICB2b2RfcmVtYXJrczogYm9vay5sYXRlc3RfY2hhcHRlcl90aXRsZSwKICAgICAgICAgICAgICAgIHZvZF95ZWFyOiAnJywgdm9kX2FyZWE6ICcnLAogICAgICAgICAgICAgICAgdm9kX2FjdG9yOiBib29rLmF1dGhvciwgdm9kX2RpcmVjdG9yOiBib29rLmF1dGhvciwKICAgICAgICAgICAgICAgIHZvZF9wbGF5X2Zyb206ICfpmIXor7vliqnmiYsnCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGNvbnN0IHRvY0pzb24gPSBhd2FpdCB0aGlzLmFwaVJlcXVlc3QoJy9hcGkvdjEvY2hhcHRlci9jaGFwdGVyLWxpc3QnLCB7CiAgICAgICAgICAgICAgICBpZDogYm9vay5pZAogICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICBob3N0OiB0aGlzLmNoYXB0ZXJIb3N0CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBpZiAodG9jSnNvbj8uZGF0YT8uY2hhcHRlcl9saXN0cykgewogICAgICAgICAgICAgICAgVk9ELnZvZF9wbGF5X3VybCA9IHRvY0pzb24uZGF0YS5jaGFwdGVyX2xpc3RzLm1hcChjaGFwdGVyID0+IAogICAgICAgICAgICAgICAgICAgIGAke2NoYXB0ZXIudGl0bGV9JCR7Ym9vay5pZH1AQCR7Y2hhcHRlci5pZH1AQCR7Y2hhcHRlci50aXRsZX1gCiAgICAgICAgICAgICAgICApLmpvaW4oJyMnKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gVk9EOwogICAgfSwKCiAgICDmkJzntKI6IGFzeW5jIGZ1bmN0aW9uICgpIHsKICAgICAgICBsZXQgZCA9IFtdOwogICAgICAgIGNvbnN0IGpzb24gPSBhd2FpdCB0aGlzLmFwaVJlcXVlc3QoJy9hcGkvdjUvc2VhcmNoL3dvcmRzJywgewogICAgICAgICAgICBnZW5kZXI6ICczJywKICAgICAgICAgICAgcGFnZTogdGhpcy5NWV9QQUdFLAogICAgICAgICAgICB3ZDogdGhpcy5LRVkKICAgICAgICB9KTsKICAgICAgICBpZiAoanNvbj8uZGF0YT8uYm9va3MpIHsKICAgICAgICAgICAgZCA9IGpzb24uZGF0YS5ib29rcy5tYXAoaXQgPT4gKHsKICAgICAgICAgICAgICAgIHRpdGxlOiBpdC5vcmlnaW5hbF90aXRsZSwKICAgICAgICAgICAgICAgIGRlc2M6IGl0LmF1dGhvciwKICAgICAgICAgICAgICAgIHBpY191cmw6IGl0LmltYWdlX2xpbmssCiAgICAgICAgICAgICAgICB1cmw6IGAke3RoaXMuaG9zdH0vYXBpL3Y0L2Jvb2svZGV0YWlsP2lkPSR7aXQuaWR9YCwKICAgICAgICAgICAgICAgIGNvbnRlbnQ6IGl0LmludHJvCiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHNldFJlc3VsdChkKTsKICAgIH0sCgogICAgbGF6eTogYXN5bmMgZnVuY3Rpb24gKCkgewogICAgICAgIGxldCBbYm9va0lkLCBjaGFwdGVySWQsIHRpdGxlXSA9IHRoaXMuaW5wdXQuc3BsaXQoJ0BAJyk7CiAgICAgICAgbGV0IGNvbnRlbnQgPSAn5YaF5a655Yqg6L295aSx6LSlJzsKICAgICAgICBjb25zdCBqc29uID0gYXdhaXQgdGhpcy5hcGlSZXF1ZXN0KCcvYXBpL3YxL2NoYXB0ZXIvY29udGVudCcsIHsKICAgICAgICAgICAgaWQ6IGJvb2tJZCwKICAgICAgICAgICAgY2hhcHRlcklkCiAgICAgICAgfSwgewogICAgICAgICAgICBob3N0OiB0aGlzLmNoYXB0ZXJIb3N0CiAgICAgICAgfSk7CiAgICAgICAgaWYgKGpzb24/LmRhdGE/LmNvbnRlbnQpIGNvbnRlbnQgPSBkZWNvZGVDb250ZW50KGpzb24uZGF0YS5jb250ZW50KTsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBwYXJzZTogMCwKICAgICAgICAgICAgdXJsOiBgbm92ZWw6Ly8ke0pTT04uc3RyaW5naWZ5KHt0aXRsZSwgY29udGVudH0pfWAsCiAgICAgICAgICAgIGpzOiAnJwogICAgICAgIH07CiAgICB9Cn07CgpmdW5jdGlvbiBnZXRTaWduU3RyKHBhcmFtcykgewogICAgY29uc3Qgc2lnbl9rZXkgPSAiZDNkR2lKYzY1MWdTUTh3MSI7CiAgICByZXR1cm4gbWQ1KE9iamVjdC5rZXlzKHBhcmFtcykuc29ydCgpLnJlZHVjZSgocHJlLCBuKSA9PiBwcmUgKyBuICsgIj0iICsgcGFyYW1zW25dLCAiIikgKyBzaWduX2tleSk7Cn0KCmZ1bmN0aW9uIGRlY29kZUNvbnRlbnQoY29udGVudCkgewogICAgbGV0IGtleSA9IENyeXB0b0pTLmVuYy5VdGY4LnBhcnNlKCIyNDJjY2I4MjMwZDcwOWUxIik7CiAgICBsZXQgaXZFbmNEYXRhID0gQ3J5cHRvSlMuZW5jLkJhc2U2NC5wYXJzZShjb250ZW50KTsKICAgIGxldCBpdiA9IENyeXB0b0pTLmxpYi5Xb3JkQXJyYXkuY3JlYXRlKGl2RW5jRGF0YS53b3Jkcy5zbGljZSgwLCA0KSk7CiAgICBsZXQgZW5jcnlwdGVkID0gQ3J5cHRvSlMubGliLldvcmRBcnJheS5jcmVhdGUoaXZFbmNEYXRhLndvcmRzLnNsaWNlKDQpKTsKICAgIGxldCBkZWNyeXB0ZWQgPSBDcnlwdG9KUy5BRVMuZGVjcnlwdCh7Y2lwaGVydGV4dDogZW5jcnlwdGVkfSwga2V5LCB7CiAgICAgICAgaXYsIG1vZGU6IENyeXB0b0pTLm1vZGUuQ0JDLCBwYWRkaW5nOiBDcnlwdG9KUy5wYWQuUGtjczcKICAgIH0pOwogICAgcmV0dXJuIGRlY3J5cHRlZC50b1N0cmluZyhDcnlwdG9KUy5lbmMuVXRmOCk7Cn0= diff --git "a/spider/js/\351\241\266\347\202\271\345\260\217\350\257\264[\344\271\246].js" "b/spider/js/\351\241\266\347\202\271\345\260\217\350\257\264[\344\271\246].js" index 99a113b4..824f2580 100644 --- "a/spider/js/\351\241\266\347\202\271\345\260\217\350\257\264[\344\271\246].js" +++ "b/spider/js/\351\241\266\347\202\271\345\260\217\350\257\264[\344\271\246].js" @@ -10,85 +10,80 @@ */ var rule = { - 类型: '小说',//影视|听书|漫画|小说 - title: '顶点小说[书]', - host: 'https://www.23ddw.cc/', - // 编码: 'gb18030', - 编码: 'utf-8', - url: '/class/fyclass_fypage/', - - // searchUrl: '/modules/article/search.php?searchkey=**&page=fypage', - searchUrl: '/searchss/?searchkey=**&page=fypage', - searchable: 2, - quickSearch: 0, - filterable: 1, - filter: '', - filter_url: '', - filter_def: {}, - headers: { - 'User-Agent': 'PC_UA', - }, - timeout: 5000, - hikerListCol: "text_1", - hikerClassListCol: "text_1", - class_name: '全本', - class_url: '0', - class_parse: '.nav&&ul&&li;a&&Text;a&&href;class/(.*?)_', - cate_exclude: '', - play_parse: true, - lazy: $js.toString(async () => { - log('input:', input); - let html = await request(input); - let title = pdfh(html, '.bookname&&Text'); - let content = pdfh(html, '#content&&Html').replace(/\n/g, "").split("
").filter(v => v).slice(0).join("\n").replace(/ /g, ' '); - let ret = JSON.stringify({ - title, - content - }); - input = {parse: 0, url: 'novel://' + ret, js: ''}; - return input; - }), - double: false, - 推荐: '#newscontent&&ul&&li;.s2&&Text;;.s5&&Text;a&&href', - 一级: $js.toString(async () => { - let d = []; - if (MY_CATE == '0') { - input = urljoin(rule.host, '/quanben/' + MY_PAGE); - let html = await request(input); - let lis = pdfa(html, 'table.grid&&tr:gt(0)'); - lis.forEach(it => { - d.push({ - title: pdfh(it, 'a&&Text'), - desc: pdfh(it, 'a:eq(1)&&Text'), - img: "", - url: pd(it, 'a&&href', MY_URL), - }); - }); - } else { - let html = await request(input.split('#')[0]); - let lis = pdfa(html, '#newscontent&&ul&&li'); - lis.forEach(it => { - d.push({ - title: pdfh(it, '.s2&&Text'), - desc: pdfh(it, '.s5&&Text'), - img: "", - url: pd(it, 'a&&href', MY_URL), - }); - }); - } - return setResult(d); - }), - 二级: { - title: 'h1&&Text', - img: '#fmimg&&img&&src', - desc: '#info&&p:eq(-1)&&Text', - content: '#intro&&p&&Text', - tabs: '#list&&dt', - lists: '#list&&a', - tab_text: 'dd&&Text', - list_text: 'body&&Text', - list_url: 'a&&href', - list_url_prefix: '', - }, - 搜索: '#hotcontent&&.item;a&&title;img&&data-original;.blue.visible-xs&&Text;a&&href;dd&&Text', -} \ No newline at end of file + 类型: '小说', + title: '顶点小说[书]', + host: 'https://www.23ddw.cc/', + 编码: 'utf-8', + url: '/class/fyclass_fypage/', + searchUrl: '/searchss/?searchkey=**&page=fypage', + searchable: 2, + quickSearch: 0, + filterable: 1, + filter: '', + filter_url: '', + filter_def: {}, + headers: { 'User-Agent': 'PC_UA' }, + timeout: 5000, + hikerListCol: "text_1", + hikerClassListCol: "text_1", + class_name: '全本', + class_url: '0', + class_parse: '.nav&&ul&&li;a&&Text;a&&href;class/(.*?)_', + cate_exclude: '', + play_parse: true, + lazy: $js.toString(async () => { + log('input:', input); + let html = await request(input); + let title = pdfh(html, '.bookname&&Text'); + let content = pdfh(html, '#content&&Html') || ''; + if (content) { + content = content + .replace(/]*?>.*?<\/script>/gs, '') + .replace(/<\/p>/g, '\n\n') + .replace(//gi, '\n') + .replace(/<[^>]+>/g, '') + .replace(/ /g, ' ') + .replace(/\n\s*\n/g, '\n\n') + .trim(); + } + input = { parse: 0, url: `novel://${JSON.stringify({ title, content })}`, js: '' }; + return input; + }), + double: false, + 一级: $js.toString(async () => { + let d = []; + let url = MY_CATE === '0' + ? urljoin(rule.host, `/quanben/${MY_PAGE}`) + : input.split('#')[0].replace(/_[0-9]+\.html/, '') + `_${MY_PAGE}.html`; + let html = await request(url); + let lis = pdfa(html, '#newscontent ul li') || pdfa(html, '.item'); + lis.forEach(it => { + let title = pdfh(it, 'dt&&Text') || pdfh(it, '.s2&&Text'); + let author = pdfh(it, '.btm a&&Text') || pdfh(it, '.s4&&Text'); + let lastChapter = pdfh(it, '.s3&&Text'); + let img = pdfh(it, 'img&&data-original') + ? pd(it, 'img&&data-original', rule.host) + : (pdfh(it, 'img&&src') ? pd(it, 'img&&src', rule.host) : ''); + d.push({ + title, + desc: `${author} | ${lastChapter}`, + img, + url: pd(it, 'a&&href', rule.host) + }); + }); + return setResult(d); + }), + 二级: { + title: 'h1&&Text', + img: '#fmimg&&img&&data-original;#fmimg&&img&&src', + desc: '#info&&p:eq(-1)&&Text', + content: '#intro&&p&&Text', + tabs: '#list&&dt', + lists: '#list&&a', + tab_text: 'dd&&Text', + list_text: 'body&&Text', + list_url: 'a&&href', + list_url_prefix: '', + }, + 搜索: '#hotcontent&&.item;#newscontent ul li;a&&title;img&&data-original;.btm a&&Text;.blue.visible-xs&&Text;a&&href;dd&&Text;.s2&&Text;.s4&&Text;.s3&&Text' +}; \ No newline at end of file