From 06e8d5ab483513df2533d9606cef0e9ac5431b7b Mon Sep 17 00:00:00 2001 From: eylinsir <283371717@qq.com> Date: Fri, 16 Jan 2026 10:25:52 +0800 Subject: [PATCH 01/12] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=A3=B0=E6=BC=AB?= =?UTF-8?q?=E7=94=B5=E5=8F=B0[=E4=B9=A6].js=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\345\212\251\346\211\213[\344\271\246].js" | 173 ++---------------- 1 file changed, 13 insertions(+), 160 deletions(-) diff --git "a/spider/js/\351\230\205\350\257\273\345\212\251\346\211\213[\344\271\246].js" "b/spider/js/\351\230\205\350\257\273\345\212\251\346\211\213[\344\271\246].js" index 40f61d11..051389c6 100644 --- "a/spider/js/\351\230\205\350\257\273\345\212\251\346\211\213[\344\271\246].js" +++ "b/spider/js/\351\230\205\350\257\273\345\212\251\346\211\213[\344\271\246].js" @@ -1,160 +1,13 @@ -var rule = { - 类型: '小说', - author: 'EylinSir', - title: '阅读助手[书]', - desc: '阅读助手小说源', - host: 'https://api-bc.wtzw.com', - homeUrl: 'https://api-bc.wtzw.com', - url: '/api/v4/category/get-list?gender=fyclass&category_id=fyfilter&need_filters=1&page=fypage&need_category=1', - class_name: '男生&女生&出版', - class_url: '1&2&3', - searchUrl: '/api/v5/search/words?gender=3&imei_ip=2937357107&page=fypage&wd=**', - searchable: 2, - quickSearch: 0, - filterable: 1, - filter: { - "1": [{key: "type", name: "类型", value: [{"n":"玄幻奇幻","v":"202"},{"n":"都市人生","v":"203"},{"n":"武侠仙侠","v":"205"},{"n":"历史军事","v":"56"},{"n":"科幻末世","v":"64"},{"n":"游戏竞技","v":"75"},{"n":"体育赛事","v":"206"},{"n":"奇闻异事","v":"204"}]}], - "2": [{key: "type", name: "类型", value: [{"n":"现代言情","v":"1"},{"n":"古代言情","v":"2"},{"n":"幻想言情","v":"4"},{"n":"宫闱宅斗","v":"209"}]}], - "3": [{key: "type", name: "类型", value: [{"n":"悬疑推理","v":"262"},{"n":"文学艺术","v":"240"},{"n":"历史传记","v":"264"}]}] - }, - filter_url: "{{fl.type}}", - filter_def: {}, - 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'}, - sign_headers: { - "app-version": "51110", "platform": "android", "reg": "0", "AUTHORIZATION": "", - "application-id": "com.****.reader", "net-env": "1", "channel": "unknown", "qm-params": "" - }, - timeout: 10000, - play_parse: true, - - request: async function (url, obj) { - obj = obj || {}; - const response = await _fetch(url, { - method: obj.method || 'GET', - headers: obj.headers || this.headers - }); - return response.text(); - }, - - 预处理: async function () { - this.sign_headers.sign = getSignStr(this.sign_headers); - }, - - 一级: async function (tid, pg, filter, extend) { - let d = []; - const cateMap = {'1':'202', '2':'1', '3':'262'}; - let gender = tid !== '-1' ? tid : '2'; - let category_id = cateMap[gender]; - const validSubTypes = ['202','203','205','56','64','75','206','204','1','2','4','209','262','240','264']; - if (extend?.type && validSubTypes.includes(extend.type)) { - category_id = extend.type; - } else if (filter && validSubTypes.includes(filter)) { - category_id = filter; - } - let params = { - gender: gender, - category_id: category_id, - need_filters: '1', - page: pg || '1', - need_category: '1', - imei_ip: '2937357107' - }; - params.sign = getSignStr(params); - let html = await this.request(buildUrl(`${this.host}/api/v4/category/get-list`, params), {headers: this.sign_headers}); - let json = JSON.parse(html); - if (json?.data?.books) { - d = json.data.books.map(it => ({ - 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 +/* +@header({ + searchable: 2, + filterable: 1, + quickSearch: 0, + title: '阅读助手[书]', + author: 'EylinSir', + '类型': '小说', + lang: 'ds' +}) +*/ + +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= \ No newline at end of file From 566e6abfd343d1a4a799bde1cab3ba45daa54db4 Mon Sep 17 00:00:00 2001 From: eylinsir <283371717@qq.com> Date: Fri, 16 Jan 2026 21:02:36 +0800 Subject: [PATCH 02/12] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=8E=BB=E8=AF=BB?= =?UTF-8?q?=E4=B9=A6[=E4=B9=A6].js=E6=96=87=E4=BB=B6=E7=9A=84=E6=AD=A3?= =?UTF-8?q?=E5=88=99=E6=9B=BF=E6=8D=A2=E8=A7=84=E5=88=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\350\257\273\344\271\246[\344\271\246].js" | 139 ++++++++---------- 1 file changed, 60 insertions(+), 79 deletions(-) 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..44b8f662 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" @@ -29,38 +29,23 @@ var rule = { 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 ''; - } - }, - + 一级: 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 +53,52 @@ 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') || '', + type_name: '', + 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_year: '', + vod_area: '', + vod_actor: pdfh(html, '[property="og:novel:author"]&&content') || '', + vod_director: '', + vod_play_from: '去读书网', + vod_play_url: '' + }; + 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: '', @@ -127,29 +106,31 @@ var rule = { } return setResult(d); }, - + // 懒加载解析(章节内容) 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 From 7689b51afe0936a6f9f193dc0359cefb233fe366 Mon Sep 17 00:00:00 2001 From: eylinsir <283371717@qq.com> Date: Fri, 16 Jan 2026 21:04:24 +0800 Subject: [PATCH 03/12] =?UTF-8?q?=E6=9B=B4=E6=96=B0jx/web1.js=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E7=9A=84URL?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jx/web1.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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=', }; /** From ba268e539b089c8a0a29210f55c92b78c5be88e6 Mon Sep 17 00:00:00 2001 From: eylinsir <283371717@qq.com> Date: Fri, 16 Jan 2026 22:48:49 +0800 Subject: [PATCH 04/12] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=8A=AA=E5=8A=AA?= =?UTF-8?q?=E4=B9=A6=E5=9D=8A[=E4=B9=A6].js?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...16\273\350\257\273\344\271\246[\344\271\246].js" | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) 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 44b8f662..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,9 +26,7 @@ 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' - }, + headers: { 'User-Agent': 'MOBILE_UA' }, 一级: async function () { let {input, pdfa, pdfh, pd} = this; @@ -56,16 +54,11 @@ var rule = { let html = await request(input); let VOD = { vod_name: pdfh(html, '[property="og:novel:book_name"]&&content') || '', - type_name: '', 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_year: '', - vod_area: '', vod_actor: pdfh(html, '[property="og:novel:author"]&&content') || '', - vod_director: '', - vod_play_from: '去读书网', - vod_play_url: '' + vod_play_from: '去读书网' }; VOD.vod_director = VOD.vod_actor; // 复用作者信息 let tocUrl = pd(html, 'a:contains(点击阅读)&&href') || ''; @@ -106,7 +99,7 @@ var rule = { } return setResult(d); }, - // 懒加载解析(章节内容) + lazy: async function () { let {input, pdfh} = this; let html = await request(input); From 435e9137c356a2200ff17966dbf714c803dfeffb Mon Sep 17 00:00:00 2001 From: eylinsir <283371717@qq.com> Date: Fri, 16 Jan 2026 23:00:43 +0800 Subject: [PATCH 05/12] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=B9=90=E4=B9=90?= =?UTF-8?q?=E4=B9=A6=E6=88=BF[=E4=B9=A6].js?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\344\271\246\345\235\212[\344\271\246].js" | 136 ++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100644 "spider/js/\345\212\252\345\212\252\344\271\246\345\235\212[\344\271\246].js" diff --git "a/spider/js/\345\212\252\345\212\252\344\271\246\345\235\212[\344\271\246].js" "b/spider/js/\345\212\252\345\212\252\344\271\246\345\235\212[\344\271\246].js" new file mode 100644 index 00000000..55c284fd --- /dev/null +++ "b/spider/js/\345\212\252\345\212\252\344\271\246\345\235\212[\344\271\246].js" @@ -0,0 +1,136 @@ +/* +@header({ + searchable: 1, + filterable: 0, + quickSearch: 1, + title: '努努书坊[书]', + author: 'EylinSir', + '类型': '小说', + logo: 'https://www.nunubook.com/favicon.ico', + lang: 'ds' +}) +*/ + +var rule = { + 类型: '小说', + author: 'EylinSir', + title: '努努书坊[书]', + host: 'https://www.nunubook.com', + url: '/fyclass/##fypage', + logo: 'https://www.nunubook.com/favicon.ico', + class_name: '玄幻小说&魔幻小说&悬疑小说&历史架空&都市小说&言情小说&武侠小说&官场小说&现代小说&战争军事&侦探推理&外国小说&纪实小说&诗歌戏曲&宗教哲学&文学理论&寓言童话&科普学习&社会心理&作品集&传记回忆&杂文随笔', + class_url: 'xuanhuan&mohuan&xuanyi&lishi&dushi&yanqing&wuxia&guanchang&xiandaixiaoshuo&zhanzhengjunshi&zhentantuili&waiguo&jishi&shigexiqu&zhexue&wenxuelilun&yuyantonghua&kepuxuexi&shehuixinli&zuopinji&zhuanjihuiyi&zawen', + searchUrl: '/e/search/index.php?tbname=bookname&show=title&tempid=1&keyboard=**', + searchable: 1, + quickSearch: 1, + filterable: 0, + timeout: 10000, + play_parse: true, + headers: { 'User-Agent': 'MOBILE_UA' }, + + 一级: async function () { + let [cateUrl, pg] = this.input.split('##'); + let list = []; + let cateKey = cateUrl.split('/').filter(Boolean).pop() || ''; + let cl = this.class_url.split('&').findIndex(k => k === cateKey) + 1 || undefined; + if (pg === '1') { + let html = await request(cateUrl); + let selectors = ['.listBig-li', 'li.listBig-li', '.book-item', '.list-item']; + let items = selectors.map(sel => this.pdfa(html, sel)).find(Boolean); + items?.forEach(item => { + let urlSelectors = ['a:eq(0)&&href', 'a&&href']; + let url = urlSelectors.map(sel => this.pd(item, sel)).find(Boolean) || this.pdfh(item, 'a&&href'); + if (url) { + url = url.startsWith('http') ? url : `${this.host}${url}`; + let title = this.pdfh(item, 'h3&&Text') || this.pdfh(item, 'h2&&Text') || '未知标题'; + let desc = this.pdfh(item, 'p:eq(0)&&Text') || '无简介'; + list.push({ + title, + url, + desc, + pic_url: this.pd(item, 'img&&src') || '', + content: this.pdfh(item, '.text&&Text') || desc + }); + } + }); + } else if (cl) { + let apiUrl = `${this.host}/e/extend/more/lsmore.php?page=${pg}&line=10&cl=${cl}`; + let json = JSON.parse(await request(apiUrl)); + list.push(...json.map(item => ({ + title: item.title, + url: item.url, + pic_url: item.pic, + desc: item.smalltext, + content: `${item.smalltext}\n作者:${item.writer}` + }))); + } + return setResult(list); + }, + + 二级: async function () { + let html = await request(this.input); + let VOD = { + vod_name: this.pdfh(html, 'h1&&Text'), + vod_pic: this.pdfh(html, '[property$=image]&&content'), + vod_content: this.pdfh(html, '[property$=description]&&content'), + vod_actor: this.pdfh(html, '[property$=author]&&content') + }; + let id = this.input.match(/\/(\d+)(\/|\.html)/)?.[1]; + if (id) { + let baseUrl = `${this.host}/e/extend/bookpage/pages.php?id=${id}&dz=asc&pageNum=`; + let firstPage = JSON.parse(await request(baseUrl + '0')); + let chapters = firstPage.list || []; + if (firstPage.totalPage > 0) { + let reqs = []; + for (let i = 1; i <= firstPage.totalPage; i++) reqs.push(request(baseUrl + i)); + let res = await Promise.all(reqs); + res.forEach(r => { chapters = chapters.concat(JSON.parse(r).list || []) }); + } + VOD.vod_play_from = '努努书坊'; + VOD.vod_play_url = chapters.map(c => { + let url = c.pic || c.url; + return c.title + '$' + (url.startsWith('http') ? url : `${this.host}${url}`); + }).join('#'); + } + return VOD; + }, + + 搜索: async function () { + let [url, params] = this.input.split('?'); + let html = await post(url, { body: params }); + let list = []; + if (!html.includes('没有搜索到')) { + (this.pdfa(html, '.search-wrap-first') || []).forEach(item => { + let url = this.pd(item, 'a&&href'); + if (url) list.push({ + title: this.pdfh(item, 'h3&&Text').replace('小说', ''), + url: url.startsWith('http') ? url : `${this.host}${url}`, + pic_url: this.pd(item, 'img&&src'), + content: this.pdfh(item, 'p&&Text') + }); + }); + } + return setResult(list); + }, + + lazy: async function () { + let { input, pdfh } = this; + let html = await request(input); + let content = pdfh(html, '#text&&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(); + } + return { + parse: 0, + url: `novel://${JSON.stringify({ title: pdfh(html, 'h1&&Text') || '', content })}`, + js: '' + }; + } +}; \ No newline at end of file From ba9255e28306b965d71cf81caa7cbf5b37f14d24 Mon Sep 17 00:00:00 2001 From: eylinsir <283371717@qq.com> Date: Sat, 17 Jan 2026 10:05:17 +0800 Subject: [PATCH 06/12] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=A4=9A=E4=B8=AA?= =?UTF-8?q?=E6=96=87=E4=BB=B6=EF=BC=9A=E4=BF=AE=E6=94=B9JSON=E8=A7=A3?= =?UTF-8?q?=E6=9E=90=E7=9B=B8=E5=85=B3=E6=96=87=E4=BB=B6=EF=BC=8C=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E8=85=BE=E8=AE=AF=E8=A7=86=E9=A2=91=EF=BC=8C=E9=87=8D?= =?UTF-8?q?=E5=91=BD=E5=90=8D=E8=85=BE=E8=AE=AF=E5=8A=A8=E6=BC=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "jx/JSON\345\220\210\351\233\206.js" | 2 +- jx/json1.js | 2 +- ...\347\225\205\345\220\254[\345\220\254].js" | 101 ++++++++++++++++++ ...\347\237\255\345\211\247[\347\237\255].js" | 0 4 files changed, 103 insertions(+), 2 deletions(-) create mode 100644 "spider/js/\347\225\252\350\214\204\347\225\205\345\220\254[\345\220\254].js" rename "spider/js/\347\225\252\350\214\204\347\237\255\345\211\247.js" => "spider/js/\347\225\252\350\214\204\347\237\255\345\211\247[\347\237\255].js" (100%) 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/spider/js/\347\225\252\350\214\204\347\225\205\345\220\254[\345\220\254].js" "b/spider/js/\347\225\252\350\214\204\347\225\205\345\220\254[\345\220\254].js" new file mode 100644 index 00000000..b52c650c --- /dev/null +++ "b/spider/js/\347\225\252\350\214\204\347\225\205\345\220\254[\345\220\254].js" @@ -0,0 +1,101 @@ +/* +@header({ + searchable: 1, + filterable: 0, + quickSearch: 0, + title: '番茄听书', + author: 'EylinSir', + '类型': '听书', + lang: 'ds' +}) +*/ + +var rule = { + 类型: '听书', + author: 'EylinSir', + title: '番茄听书', + host: 'https://qkfqapi.vv9v.cn', + url: '', + searchUrl: '/api/search?key=**&tab_type=2&offset=((fypage-1)*10)', + detailUrl: '/api/detail?book_id=fyid', + headers: {'User-Agent': 'UC_UA'}, + searchable: 1, + quickSearch: 0, + filterable: 0, + double: true, + play_parse: true, + limit: 12, + + action: async function (action, value) { + if (action === 'only_search') { + return '此源为纯搜索源,你直接全局搜索这个源或者使用此页面的源内搜索就好了'; + } + }, + + 推荐: async function () { + return [{ + vod_id: 'only_search', + vod_name: '纯搜索源哦!', + vod_tag: 'action', + vod_pic: this.publicUrl + '/images/icon_cookie/搜索.jpg' + }]; + }, + + 一级: async function () { + return []; + }, + + 二级: async function () { + let detailApi = `${this.host}/api/detail?book_id=${this.orId}`; + let detailJson = await request(detailApi); + let detailData = JSON.parse(detailJson); + let data = detailData.data.data; + let chaptersApi = `${this.host}/api/book?book_id=${this.orId}`; + let chaptersJson = await request(chaptersApi); + let chaptersData = JSON.parse(chaptersJson); + let bookData = chaptersData.data.data; + let list = bookData.chapterListWithVolume?.flat() || bookData.chapterList || []; + let urls = list.map(it => it.title + '$' + it.itemId + '@' + it.title).join('#'); + return { + vod_id: this.orId, + vod_name: data.book_name, + type_name: data.category, + vod_pic: data.thumb_url || data.expand_thumb_url, + vod_content: data.abstract || data.book_abstract_v2, + vod_remarks: data.sub_info, + vod_director: data.author, + vod_play_from: '番茄听书', + vod_play_url: urls + }; + }, + + 搜索: async function () { + let {input, MY_PAGE} = this; + let html = await request(input); + let json = JSON.parse(html); + let data = json.data.search_tabs[4].data; + let d = []; + for (let it of data.filter(i => i.book_data)) { + let book = it.book_data[0]; + d.push({ + title: book.book_name, + url: book.book_id, + desc: book.author, + content: book.book_abstract || book.abstract, + pic_url: book.thumb_url + }); + } + return setResult(d); + }, + + lazy: async function () { + let {input} = this; + let parts = input.split('@'); + let itemId = parts[0]; + let toneId = '1'; + let content_url = `${this.host}/api/content?item_id=${itemId}&tab=听书&tone_id=${toneId}`; + let jsonStr = await request(content_url); + let data = JSON.parse(jsonStr); + return {parse: 0, url: data.data.content}; + } +} \ No newline at end of file diff --git "a/spider/js/\347\225\252\350\214\204\347\237\255\345\211\247.js" "b/spider/js/\347\225\252\350\214\204\347\237\255\345\211\247[\347\237\255].js" similarity index 100% rename from "spider/js/\347\225\252\350\214\204\347\237\255\345\211\247.js" rename to "spider/js/\347\225\252\350\214\204\347\237\255\345\211\247[\347\237\255].js" From df5ecacacfdb7f344c1e9fcb659852f4002b294e Mon Sep 17 00:00:00 2001 From: eylinsir <283371717@qq.com> Date: Sat, 17 Jan 2026 10:21:43 +0800 Subject: [PATCH 07/12] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E8=85=BE=E8=AE=AF?= =?UTF-8?q?=E8=A7=86=E9=A2=91[=E8=A7=86].js?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...52\350\214\204\347\225\205\345\220\254[\345\220\254].js" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/spider/js/\347\225\252\350\214\204\347\225\205\345\220\254[\345\220\254].js" "b/spider/js/\347\225\252\350\214\204\347\225\205\345\220\254[\345\220\254].js" index b52c650c..a1f2929f 100644 --- "a/spider/js/\347\225\252\350\214\204\347\225\205\345\220\254[\345\220\254].js" +++ "b/spider/js/\347\225\252\350\214\204\347\225\205\345\220\254[\345\220\254].js" @@ -3,7 +3,7 @@ searchable: 1, filterable: 0, quickSearch: 0, - title: '番茄听书', + title: '番茄畅听', author: 'EylinSir', '类型': '听书', lang: 'ds' @@ -13,7 +13,7 @@ var rule = { 类型: '听书', author: 'EylinSir', - title: '番茄听书', + title: '番茄畅听', host: 'https://qkfqapi.vv9v.cn', url: '', searchUrl: '/api/search?key=**&tab_type=2&offset=((fypage-1)*10)', @@ -64,7 +64,7 @@ var rule = { vod_content: data.abstract || data.book_abstract_v2, vod_remarks: data.sub_info, vod_director: data.author, - vod_play_from: '番茄听书', + vod_play_from: '番茄畅听', vod_play_url: urls }; }, From 5ad29727719972c9f81d8385901ddad3e85f2b11 Mon Sep 17 00:00:00 2001 From: eylinsir <283371717@qq.com> Date: Sat, 17 Jan 2026 10:26:09 +0800 Subject: [PATCH 08/12] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=B9=A6=E6=BA=90?= =?UTF-8?q?=E9=85=8D=E7=BD=AE[=E7=AE=A1].js?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\207\347\217\215\345\274\202\345\205\275[\345\256\230].js" | 4 ++++ 1 file changed, 4 insertions(+) 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} + } } From 9beef11c886726ac6a556357b7db09363bb46fa3 Mon Sep 17 00:00:00 2001 From: eylinsir <283371717@qq.com> Date: Sat, 17 Jan 2026 18:56:48 +0800 Subject: [PATCH 09/12] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + ...37\350\212\275\347\237\255\345\211\247.js" | 155 ------------ ...33\347\211\233\347\237\255\345\211\247.js" | 229 ------------------ ...\347\225\205\345\220\254[\345\220\254].js" | 92 +------ ...77\351\245\255\347\237\255\345\211\247.js" | 152 ------------ ...\345\260\217\350\257\264[\344\271\246].js" | 159 ++++++------ 6 files changed, 80 insertions(+), 708 deletions(-) delete mode 100644 "spider/js/\346\230\237\350\212\275\347\237\255\345\211\247.js" delete mode 100644 "spider/js/\347\211\233\347\211\233\347\237\255\345\211\247.js" delete mode 100644 "spider/js/\350\245\277\351\245\255\347\237\255\345\211\247.js" 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/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.js" deleted file mode 100644 index f5aed999..00000000 --- "a/spider/js/\346\230\237\350\212\275\347\237\255\345\211\247.js" +++ /dev/null @@ -1,155 +0,0 @@ -/* -@header({ - searchable: 2, - filterable: 1, - quickSearch: 1, - title: '星芽短剧', - lang: 'ds' -}) -*/ - -// http://localhost:5757/api/星芽短剧?ac=list&t=1&pg=1 -// http://localhost:5757/api/星芽短剧?ac=detail&ids=https://app.whjzjx.cn/v2/theater_parent/detail?theater_parent_id=3523 -// http://localhost:5757/api/星芽短剧?wd=龙王&pg=1 -// http://localhost:5757/api/星芽短剧?play=http://qcapp.xingya.com.cn/h265/wz_mp40905dingtianhou01.mp4?sign=4db245c4e9cd5bd3d3026e2e0f6147a6&t=674ee966&flag=星芽短剧 -var rule = { - 类型: '影视', - title: '星芽短剧', - desc: '星芽短剧纯js版本', - host: 'https://app.whjzjx.cn', - url: '/cloud/v2/theaterfyfilter', - filter_url: '/home_page?theater_class_id=fyclass&type=1&{{fl.type or "class2_ids=0"}}&page_num=fypage&page_size=24', - searchUrl: '/v3/search', - searchable: 2, - quickSearch: 1, - filterable: 1, - filter: 'H4sIAAAAAAAAA6vmUgACJUMlK4VoMBMEquEssGR2aiVQWqmksiBVSQdVKi8xNxUk93zj7qfzutFlyxJzSlNRTMZuA8I4kFlPW1e8bF6BZhbCTJCS5JzE4mKj+MyUYlsDJQx1tZha8dn3snnv0x1NxNpnQrF9T/uXvFjcSqx9phTb97xvw5Pdi1+saHjWTLSthpRb+6xjxvOl84i10IjycH3Z0PZi0VpiLTSnPFxX7n+xrYvoEKXcwqd9bU/7NxGdUCnPGS+2zni6cj/RUWhGeZAunfe0ZzfRFlKeSF+29z6fMp9YC6ngwSlznq5bQKx9xsbUKGxIzvzGVMgbfS1PdxIdkcaUR+SLCT1P180l1kJLyu1rmfhsC9Glm7ERxRY+2bWJhCg0MaTchzMnPGtEr9JxWmiBxT4UkVguVPFYrloA8HqNcnwIAAA=', - headers: { - 'User-Agent': 'okhttp/4.10.0', - 'Accept-Encoding': 'gzip', - 'x-app-id': '7', - 'platform': '1', - 'manufacturer': 'realme', - 'version_name': '3.3.1', - 'user_agent': 'Mozilla/5.0 (Linux; Android 9; RMX1931 Build/PQ3A.190605.05081124; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/91.0.4472.114 Mobile Safari/537.36', - 'dev_token': 'BFdbZBGOEgG7QDt01ldOQNNfhO2F-rv4QcugZoFZm5_3DlPJEo_bSBeJ6dW2X3eKzxxKKWz3xJCM_u5PppGMqRuYPxcsVg9a-jriWiIoPZvHMSLbcbxTFuasqgTivTY3GabW1yP57LQSsJNQfKoX1BKYGHducrhb0bTwvigfn3gE*', - 'app_version': '3.1.0.1', - 'device_platform': 'android', - 'personalized_recommend_status': '1', - 'device_type': 'RMX1931', - 'device_brand': 'realme', - 'os_version': '9', - 'channel': 'default', - 'raw_channel': 'default', - 'oaid': '', - 'msa_oaid': '', - 'uuid': 'randomUUID_8a0324bf-03c8-4789-8ef8-12d3bcff28f5', - 'device_id': '24250683a3bdb3f118dff25ba4b1cba1a', - 'ab_id': '', - 'support_h265': '1' - }, - timeout: 5000, - class_name: '剧场&热播剧&会员专享&星选好剧&新剧&阳光剧场', - class_url: '1&2&8&7&3&5', - play_parse: true, - class_parse: async () => { - }, - 预处理: async () => { - let html = await post('https://u.shytkjgs.com/user/v1/account/login', { - headers: { - 'User-Agent': 'okhttp/4.10.0', - 'Accept-Encoding': 'gzip', - 'Content-Type': 'application/x-www-form-urlencoded', - 'x-app-id': '7', - 'platform': '1', - 'manufacturer': 'realme', - 'version_name': '3.3.1', - 'user_agent': 'Mozilla/5.0 (Linux; Android 9; RMX1931 Build/PQ3A.190605.05081124; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/91.0.4472.114 Mobile Safari/537.36', - 'app_version': '3.3.1', - 'device_platform': 'android', - 'personalized_recommend_status': '1', - 'device_type': 'RMX1931', - 'device_brand': 'realme', - 'os_version': '9', - 'channel': 'default', - 'raw_channel': 'default', - 'oaid': '', - 'msa_oaid': '', - 'uuid': 'randomUUID_914e7a9b-deac-4f80-9247-db56669187df', - 'device_id': '24250683a3bdb3f118dff25ba4b1cba1a', - 'ab_id': '', - 'support_h265': '1' - }, - body: "device=24250683a3bdb3f118dff25ba4b1cba1a&install_first_open=false&first_install_time=1723214205125&last_update_time=1723214205125&report_link_url=" - }); - // log('html:', html); - html = JSON.parse(html); - try { - rule.headers['authorization'] = html.data.token - } catch (e) { - rule.headers['authorization'] = html.data.data.token - } - log('authorization:', rule.headers['authorization']); - }, - 推荐: async () => { - return [] - }, - 一级: async function (tid, pg, filter, extend) { - let {input} = this; - let d = []; - let html = await request(input, {headers: rule.headers}); - let data = JSON.parse(html).data.list; - data.forEach(it => { - let id = 'https://app.whjzjx.cn/v2/theater_parent/detail?theater_parent_id=' + it.theater.id; - d.push({ - url: id, - title: it.theater.title, - img: it.theater.cover_url, - desc: it.theater.theme, - }) - }) - return setResult(d); - }, - 二级: async function (ids) { - let {input} = this; - let urls = []; - let html = await request(input, {headers: rule.headers}); - let data = JSON.parse(html).data; - let vod = { - vod_id: input, - vod_name: data.theaters.son_title, - vod_pic: data.cover_url, - } - let playFroms = []; - let playUrls = []; - data.theaters.forEach(it => { - urls.push(it.num + '$' + encodeURIComponent(it.son_video_url)); - }) - playFroms.push('不知道倾情打造'); - vod.vod_play_from = playFroms.join('$$$'); - playUrls.push(urls.join('#')); - vod.vod_play_url = playUrls.join('$$$'); - return vod - }, - 搜索: async function (wd, quick, pg) { - let {input, KEY} = this - let d = []; - let html = await post(input, {headers: rule.headers, body: {"text": KEY}}) - let list = JSON.parse(html).data.theater.search_data; - list.forEach(it => { - let id = 'https://app.whjzjx.cn/v2/theater_parent/detail?theater_parent_id=' + it.id; - d.push({ - url: id, - title: it.title, - desc: it.total, - img: it.cover_url, - content: it.introduction, - }) - }) - return setResult(d); - }, - lazy: async function (flag, id, flags) { - let {input} = this; - return {parse: 0, url: input, js: ''} - }, -}; diff --git "a/spider/js/\347\211\233\347\211\233\347\237\255\345\211\247.js" "b/spider/js/\347\211\233\347\211\233\347\237\255\345\211\247.js" deleted file mode 100644 index 204129dc..00000000 --- "a/spider/js/\347\211\233\347\211\233\347\237\255\345\211\247.js" +++ /dev/null @@ -1,229 +0,0 @@ -/* -@header({ - searchable: 2, - filterable: 1, - quickSearch: 0, - title: '牛牛短句[短]', - '类型': '影视', - lang: 'ds' -}) -*/ - -var rule = { - title: '牛牛短句[短]', - host: 'https://new.tianjinzhitongdaohe.com', - homeUrl: '/api/v1/app/screen/screenType', - searchUrl: '/api/v1/app/search/searchMovie', - url: '/api/v1/app/screen/screenMovie?classify=fyclass&page=fypage', - headers: { - "Cache-Control": "no-cache", - "Content-Type": "application/json;charset=UTF-8", - "User-Agent": "okhttp/4.12.0" - }, - timeout: 5000, - filterable: 1, - limit: 40, - multi: 1, - searchable: 2, - play_parse: true, - search_match: true, - - class_parse: async function () { - const url = `${rule.host}/api/v1/app/screen/screenType`; - try { - const response = await request(url, { - method: 'POST', - headers: rule.headers - }); - const data = JSON.parse(response); - const classes = []; - - if (data.data && data.data[0]?.children?.[0]?.children) { - data.data[0].children[0].children.forEach(vod => { - classes.push({ - type_name: `${vod.name}`, - type_id: vod.name - }); - }); - } - - return { - class: classes, - filters: {} - }; - } catch (e) { - console.error("分类解析错误:", e); - return {class: []}; - } - }, - - 一级: async function () { - const {input, MY_PAGE} = this; - const cid = input.split('classify=')[1].split('&')[0]; - const page = MY_PAGE || 1; - const payload = JSON.stringify({ - condition: { - classify: cid, - typeId: "S1" - }, - pageNum: String(page), - pageSize: rule.limit - }); - - try { - const url = `${rule.host}/api/v1/app/screen/screenMovie`; - const response = await request(url, { - method: 'POST', - headers: rule.headers, - body: payload - }); - const data = JSON.parse(response); - const videos = []; - if (data.data?.records) { - data.data.records.forEach(vod => { - videos.push({ - title: vod.name, - img: vod.cover, - desc: `${vod.totalEpisode}集`, - url: vod.id - }); - }); - } - - return setResult(videos); - } catch (e) { - console.error("一级列表错误:", e); - return []; - } - }, - - 二级: async function () { - const { orId } = this; - let did = orId; - let bofang = ''; - let xianlu = ''; - let content = ''; - - try { - // 获取剧集列表 - const detailPayload = JSON.stringify({ - id: did, - source: 0, - typeId: "S1", - userId: "223664" - }); - - const detailUrl = `${rule.host}/api/v1/app/play/movieDetails`; - const detailResponse = await request(detailUrl, { - method: 'POST', - headers: rule.headers, - body: detailPayload - }); - - const detailData = JSON.parse(detailResponse).data || {}; - if (detailData.episodeList && detailData.episodeList.length > 0) { - const episodes = detailData.episodeList.map(ep => { - return `${ep.episode}$${did}@${ep.id}`; - }); - bofang = episodes.join('#'); - xianlu = '牛牛短句'; - content = detailData.introduce || '暂无剧情介绍'; - } - - return { - vod_name: detailData.name || '未知名称', - vod_pic: detailData.cover || '', - vod_content: content, - vod_play_from: xianlu || '暂无资源', - vod_play_url: bofang || '暂无播放地址$0' - }; - } catch (e) { - console.error("详情解析错误:", e); - return { - vod_name: '加载失败', - vod_pic: '', - vod_content: '详情加载失败,请稍后重试', - vod_play_from: '暂无资源', - vod_play_url: '暂无播放地址$0' - }; - } - }, - - 搜索: async function () { - const {KEY, MY_PAGE} = this; - const page = MY_PAGE || 1; - const payload = JSON.stringify({ - condition: { - typeId: "S1", - value: KEY - }, - pageNum: String(page), - pageSize: rule.limit - }); - - try { - const url = `${rule.host}/api/v1/app/search/searchMovie`; - const response = await request(url, { - method: 'POST', - headers: rule.headers, - body: payload - }); - const data = JSON.parse(response); - const videos = []; - - if (data.data?.records) { - data.data.records.forEach(vod => { - if (rule.search_match && !vod.name.includes(KEY)) return; - - videos.push({ - title: vod.name, - img: vod.cover, - desc: `更新时间${vod.year || '未知'}`, - url: vod.id - }); - }); - } - return setResult(videos); - } catch (e) { - console.error("搜索错误:", e); - return []; - } - }, - - lazy: async function () { - const {input} = this; - const [videoId, episodeId] = input.split('@'); - const payload = JSON.stringify({ - episodeId, - id: videoId, - source: 0, - typeId: "S1", - userId: "223664" - }); - - try { - const url = `${rule.host}/api/v1/app/play/movieDetails`; - const response = await request(url, { - method: 'POST', - headers: rule.headers, - body: payload - }); - const data = JSON.parse(response); - - return { - parse: 0, - url: data.data?.url || '', - header: { - 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.87 Safari/537.36' - } - }; - } catch (e) { - console.error("播放地址获取错误:", e); - return { - parse: 0, - url: '', - header: {} - }; - } - } -}; diff --git "a/spider/js/\347\225\252\350\214\204\347\225\205\345\220\254[\345\220\254].js" "b/spider/js/\347\225\252\350\214\204\347\225\205\345\220\254[\345\220\254].js" index a1f2929f..d55334d0 100644 --- "a/spider/js/\347\225\252\350\214\204\347\225\205\345\220\254[\345\220\254].js" +++ "b/spider/js/\347\225\252\350\214\204\347\225\205\345\220\254[\345\220\254].js" @@ -1,7 +1,7 @@ /* @header({ searchable: 1, - filterable: 0, + filterable: 1, quickSearch: 0, title: '番茄畅听', author: 'EylinSir', @@ -10,92 +10,4 @@ }) */ -var rule = { - 类型: '听书', - author: 'EylinSir', - title: '番茄畅听', - host: 'https://qkfqapi.vv9v.cn', - url: '', - searchUrl: '/api/search?key=**&tab_type=2&offset=((fypage-1)*10)', - detailUrl: '/api/detail?book_id=fyid', - headers: {'User-Agent': 'UC_UA'}, - searchable: 1, - quickSearch: 0, - filterable: 0, - double: true, - play_parse: true, - limit: 12, - - action: async function (action, value) { - if (action === 'only_search') { - return '此源为纯搜索源,你直接全局搜索这个源或者使用此页面的源内搜索就好了'; - } - }, - - 推荐: async function () { - return [{ - vod_id: 'only_search', - vod_name: '纯搜索源哦!', - vod_tag: 'action', - vod_pic: this.publicUrl + '/images/icon_cookie/搜索.jpg' - }]; - }, - - 一级: async function () { - return []; - }, - - 二级: async function () { - let detailApi = `${this.host}/api/detail?book_id=${this.orId}`; - let detailJson = await request(detailApi); - let detailData = JSON.parse(detailJson); - let data = detailData.data.data; - let chaptersApi = `${this.host}/api/book?book_id=${this.orId}`; - let chaptersJson = await request(chaptersApi); - let chaptersData = JSON.parse(chaptersJson); - let bookData = chaptersData.data.data; - let list = bookData.chapterListWithVolume?.flat() || bookData.chapterList || []; - let urls = list.map(it => it.title + '$' + it.itemId + '@' + it.title).join('#'); - return { - vod_id: this.orId, - vod_name: data.book_name, - type_name: data.category, - vod_pic: data.thumb_url || data.expand_thumb_url, - vod_content: data.abstract || data.book_abstract_v2, - vod_remarks: data.sub_info, - vod_director: data.author, - vod_play_from: '番茄畅听', - vod_play_url: urls - }; - }, - - 搜索: async function () { - let {input, MY_PAGE} = this; - let html = await request(input); - let json = JSON.parse(html); - let data = json.data.search_tabs[4].data; - let d = []; - for (let it of data.filter(i => i.book_data)) { - let book = it.book_data[0]; - d.push({ - title: book.book_name, - url: book.book_id, - desc: book.author, - content: book.book_abstract || book.abstract, - pic_url: book.thumb_url - }); - } - return setResult(d); - }, - - lazy: async function () { - let {input} = this; - let parts = input.split('@'); - let itemId = parts[0]; - let toneId = '1'; - let content_url = `${this.host}/api/content?item_id=${itemId}&tab=听书&tone_id=${toneId}`; - let jsonStr = await request(content_url); - let data = JSON.parse(jsonStr); - return {parse: 0, url: data.data.content}; - } -} \ No newline at end of file +dmFyIHJ1bGUgPSB7CiAgICDnsbvlnos6ICflkKzkuaYnLAogICAgYXV0aG9yOiAnRXlsaW5TaXInLAogICAgdGl0bGU6ICfnlarojITnlYXlkKwnLAogICAgaG9zdDogJ2h0dHBzOi8vcWtmcWFwaS52djl2LmNuJywKICAgIHVybDogJy9hcGkvZGlzY292ZXI/dGFiPeWQrOS5piZ0eXBlPWZ5Y2xhc3MmZ2VuZGVyPTImZ2VucmVfdHlwZT0xJnBhZ2U9e3twYWdlfX0nLAogICAgc2VhcmNoVXJsOiAnL2FwaS9zZWFyY2g/a2V5PSoqJnRhYl90eXBlPTImb2Zmc2V0PSgoZnlwYWdlLTEpKjEwKScsCiAgICBkZXRhaWxVcmw6ICcvYXBpL2RldGFpbD9ib29rX2lkPWZ5aWQnLAogICAgaGVhZGVyczogeydVc2VyLUFnZW50JzogJ1VDX1VBJ30sCiAgICBzZWFyY2hhYmxlOiAxLAogICAgcXVpY2tTZWFyY2g6IDAsCiAgICBmaWx0ZXJhYmxlOiAxLAogICAgZG91YmxlOiB0cnVlLAogICAgcGxheV9wYXJzZTogdHJ1ZSwKICAgIGxpbWl0OiAxMiwKICAgIGNsYXNzX25hbWU6ICfnsr7lk4HlsI/or7Qm55u45aOw6K+E5LmmJuS4lueVjOWOhuWPsiblkI3okZfop6Por7sm5a2m5Lmg5oiQ6ZW/JuaIj+absuiJuuacrybnlJ/mtLvnmb7np5Em5a625bqt5pWZ6IKyJuS6uuaWh+enkeWtpiblhbbku5YnLAogICAgY2xhc3NfdXJsOiAnODk5JjQ0NSYxMiYxMzImNDQ5JjExMyY5NjAmNDUwJjQ0NyYzOScsCiAgICBmaWx0ZXI6IHsKICAgICAgICAiODk5IjogW3trZXk6ICJ0eXBlIiwgbmFtZTogIuexu+WeiyIsIHZhbHVlOiBbeyJuIjoi5YWo6YOoIiwidiI6Ijg5OSJ9LHsibiI6IumDveW4giIsInYiOiIxIn0seyJuIjoi56m/6LaKIiwidiI6IjM3In0seyJuIjoi546w5Luj6KiA5oOFIiwidiI6IjMifSx7Im4iOiLlj6Tku6PoqIDmg4UiLCJ2IjoiNSJ9LHsibiI6IuaAu+ijgSIsInYiOiIyOSJ9LHsibiI6IueOhOW5uyIsInYiOiI3In0seyJuIjoi6YeN55SfIiwidiI6IjM2In0seyJuIjoi5oKs55aRIiwidiI6IjEwIn0seyJuIjoi54G15byCIiwidiI6IjEwMCJ9LHsibiI6Iuezu+e7nyIsInYiOiIxOSJ9LHsibiI6IuenjeeUsCIsInYiOiIyMyJ9LHsibiI6IueUnOWuoCIsInYiOiI5NiJ9LHsibiI6IuWuoOWmuyIsInYiOiIzMCJ9LHsibiI6IumDveW4gueUn+a0uyIsInYiOiIyIn0seyJuIjoi6LWY5am/IiwidiI6IjI1In0seyJuIjoi5YWI5ama5ZCO54ixIiwidiI6IjI2NSJ9LHsibiI6IuWuq+aWl+WuheaWlyIsInYiOiIyNDYifSx7Im4iOiLpg73luILml6XluLgiLCJ2IjoiMjYxIn0seyJuIjoi5oiY56We6LWY5am/IiwidiI6IjI3In0seyJuIjoi56We5Yy7IiwidiI6IjI2In0seyJuIjoi5b2x6KeG5bCP6K+0IiwidiI6IjQ1In0seyJuIjoi5Zu95YaF5b2x6KeGIiwidiI6Ijk5MSJ9LHsibiI6IuWbveWkluW9seinhiIsInYiOiI5OTIifSx7Im4iOiLnsr7lk4HlsI/or7QiLCJ2IjoiOTcwIn0seyJuIjoi5oKs55aR5o6o55CGIiwidiI6IjE2NSJ9LHsibiI6IuenkeW5u+Wwj+ivtCIsInYiOiIxNjYifSx7Im4iOiLmrabkvqDlsI/or7QiLCJ2IjoiOTkzIn0seyJuIjoi546E5bm75bCP6K+0IiwidiI6Ijk3MSJ9LHsibiI6IueOsOWunuWwj+ivtCIsInYiOiI0MDAifSx7Im4iOiLmg4XmhJ/lsI/or7QiLCJ2IjoiOTcyIn0seyJuIjoi5Lyg57uf546E5bm7IiwidiI6IjI1OCJ9LHsibiI6IueOi+WmgyIsInYiOiI4NSJ9LHsibiI6IuWlh+W5u+S7meS+oCIsInYiOiIyNTkifSx7Im4iOiLokIzlrp0iLCJ2IjoiMjgifSx7Im4iOiLpg73luILohJHmtJ4iLCJ2IjoiMjYyIn0seyJuIjoi6IGM5Zy6IiwidiI6IjEyNyJ9LHsibiI6IuWroeWlsyIsInYiOiI4OCJ9LHsibiI6IumDveW4guS/ruecnyIsInYiOiIxMjQifSx7Im4iOiLlubvmg7PoqIDmg4UiLCJ2IjoiMzIifSx7Im4iOiLnpZ7osaoiLCJ2IjoiMjAifSx7Im4iOiLnqbrpl7QiLCJ2IjoiNDQifSx7Im4iOiLlhbbku5YiLCJ2IjoiMzEifSx7Im4iOiLnjoTlubvoqIDmg4UiLCJ2IjoiMjQ4In0seyJuIjoi546E5bm76ISR5rSeIiwidiI6IjI1NyJ9LHsibiI6IuWOhuWPsuWPpOS7oyIsInYiOiIyNzMifSx7Im4iOiLnp5HlubvmnKvkuJYiLCJ2IjoiOCJ9LHsibiI6IuW5tOS7oyIsInYiOiI3OSJ9LHsibiI6IuWkqeaJjSIsInYiOiI5MCJ9LHsibiI6IuWls+W8uiIsInYiOiI4NiJ9LHsibiI6IuaOqOeQhiIsInYiOiI2MSJ9LHsibiI6IuiFuem7kSIsInYiOiI5MiJ9LHsibiI6IuivuOWkqeS4h+eVjCIsInYiOiI3MSJ9LHsibiI6IuWMu+acryIsInYiOiIyNDcifSx7Im4iOiLmmJ/pmYUiLCJ2IjoiNzcifSx7Im4iOiLpibTlrp0iLCJ2IjoiMTcifSx7Im4iOiLlm6LlrqAiLCJ2IjoiOTQifSx7Im4iOiLmia7njKrlkIPomY4iLCJ2IjoiOTMifSx7Im4iOiLmrabkvqAiLCJ2IjoiMTYifSx7Im4iOiLnjrDoqIDohJHmtJ4iLCJ2IjoiMjY3In0seyJuIjoi6YO95biC56eN55SwIiwidiI6IjI2MyJ9LHsibiI6IuaXoOaVjCIsInYiOiIzODQifSx7Im4iOiLnm5flopMiLCJ2IjoiODEifSx7Im4iOiLpqaznlLIiLCJ2IjoiMjY2In0seyJuIjoi55qH5ZCOIiwidiI6Ijg0In0seyJuIjoi54m556eN5YW1IiwidiI6IjM3NSJ9LHsibiI6IuWkp+WUkCIsInYiOiI3MyJ9LHsibiI6IuWFrOS4uyIsInYiOiI4MyJ9LHsibiI6IuWoseS5kOWciCIsInYiOiI0MyJ9LHsibiI6IumdkuaiheeruemprCIsInYiOiIzODcifSx7Im4iOiLlj6ToqIDohJHmtJ4iLCJ2IjoiMjUzIn0seyJuIjoi5Y6G5Y+y6ISR5rSeIiwidiI6IjI3MiJ9LHsibiI6Iuacq+S4liIsInYiOiI2OCJ9LHsibiI6IuWJkemBkyIsInYiOiI4MCJ9LHsibiI6IueOsOiogOeUnOWuoCIsInYiOiIzOTUifSx7Im4iOiLmuLjmiI/liqjmvKsiLCJ2IjoiNTcifSx7Im4iOiLmtKrojZIiLCJ2IjoiNjYifSx7Im4iOiLlv6vnqb8iLCJ2IjoiMjQifSx7Im4iOiLmmI7mnJ0iLCJ2IjoiMTI2In0seyJuIjoi5aSW5Y2WIiwidiI6Ijc1In0seyJuIjoi5qCh6IqxIiwidiI6IjM4NSJ9LHsibiI6IuWltueIuCIsInYiOiI0MiJ9LHsibiI6IuagoeWbrSIsInYiOiI0In0seyJuIjoi5LiJ5Zu9IiwidiI6IjY3In0seyJuIjoi55u05pKtIiwidiI6IjY5In0seyJuIjoi56m/5LmmIiwidiI6IjM4MiJ9LHsibiI6Iua1t+WymyIsInYiOiI0MCJ9LHsibiI6Iue+jumjnyIsInYiOiI3OCJ9LHsibiI6IuWPjea0viIsInYiOiIzNjkifSx7Im4iOiLnjrDoqIDlpI3ku4ciLCJ2IjoiMjY4In0seyJuIjoi6KW/5ri46KGN55SfIiwidiI6IjM3MyJ9LHsibiI6IuaxgueUnyIsInYiOiIzNzkifSx7Im4iOiLmsJHlm70iLCJ2IjoiMzkwIn0seyJuIjoi5a625bqtIiwidiI6IjEyNSJ9LHsibiI6IuWtpumcuCIsInYiOiI4MiJ9LHsibiI6Iueah+WPlCIsInYiOiI4NyJ9LHsibiI6IuWuoOeJqSIsInYiOiI3NCJ9LHsibiI6IuaXoENQIiwidiI6IjM5MiJ9LHsibiI6IuWls+aJrueUt+ijhSIsInYiOiIzODgifSx7Im4iOiLnvZHmuLgiLCJ2IjoiMzcyIn0seyJuIjoi55eF5aiHIiwidiI6IjM4MCJ9LHsibiI6IueyvueBtSIsInYiOiI4OSJ9LHsibiI6IuiZkOaWhyIsInYiOiI5NSJ9LHsibiI6IumDveW4gumdkuaYpSIsInYiOiIzOTYifSx7Im4iOiLmuIXnqb8iLCJ2IjoiNzYifV19XSwKICAgICAgICAiNDQ1IjogW3trZXk6ICJ0eXBlIiwgbmFtZTogIuexu+WeiyIsIHZhbHVlOiBbeyJuIjoi5YWo6YOoIiwidiI6IjQ0NSJ9LHsibiI6IumDreW+t+e6siIsInYiOiIxMjgifSx7Im4iOiLnlLDov57lhYMiLCJ2IjoiMjAzIn0seyJuIjoi5YiY5YWw6IqzIiwidiI6IjIwMiJ9LHsibiI6IuWwj+WTgSIsInYiOiIxMTQifSx7Im4iOiLoooHpmJTmiJAiLCJ2IjoiMjA0In0seyJuIjoi5Y2V55Sw6IqzIiwidiI6IjIwMSJ9LHsibiI6IuivhOS5piIsInYiOiIxMTAifSx7Im4iOiLnm7jlo7AiLCJ2IjoiMTExIn1dfV0sCiAgICAgICAgIjEyIjogW3trZXk6ICJ0eXBlIiwgbmFtZTogIuexu+WeiyIsIHZhbHVlOiBbeyJuIjoi5YWo6YOoIiwidiI6IjEyIn0seyJuIjoi6a2P5pmL5Y2X5YyX5pydIiwidiI6IjIwOSJ9LHsibiI6IuenpuaxiSIsInYiOiIyMDgifSx7Im4iOiLkuJbnlYzlj7IiLCJ2IjoiMjE0In0seyJuIjoi5ZSQ5a6LIiwidiI6IjIxMCJ9LHsibiI6IuaYjua4hSIsInYiOiIyMTEifSx7Im4iOiLov5HnjrDku6MiLCJ2IjoiMjEzIn0seyJuIjoi5Lit5Zu95Y+yIiwidiI6IjIxMiJ9LHsibiI6IuaImOS6ieWPsiIsInYiOiIyMDYifSx7Im4iOiLlkI3kurrkvKAiLCJ2IjoiMjA3In0seyJuIjoi5Lit5Zu95Y6G5Y+yIiwidiI6IjQwMiJ9LHsibiI6IuS4lueVjOWOhuWPsiIsInYiOiI0MDMifSx7Im4iOiLljoblj7LlsI/or7QiLCJ2IjoiOTg4In0seyJuIjoi5Y6G5Y+y5paH5YyWIiwidiI6IjI0MSJ9XX1dLAogICAgICAgICIxMzIiOiBbe2tleTogInR5cGUiLCBuYW1lOiAi57G75Z6LIiwgdmFsdWU6IFt7Im4iOiLlhajpg6giLCJ2IjoiMTMyIn0seyJuIjoi5oiY5LqJIiwidiI6Ijk3In0seyJuIjoi5Lit5Zu95ZCN6JGXIiwidiI6Ijk4In0seyJuIjoi5aSW5Zu95ZCN6JGXIiwidiI6Ijk5In0seyJuIjoi57uP566h5Yqx5b+XIiwidiI6IjI0MiJ9LHsibiI6IuS6uueJqeS8oOiusCIsInYiOiI0MDkifSx7Im4iOiLnu4/lhbjmloflraYiLCJ2IjoiMjQzIn0seyJuIjoi6Z2S5pil5paH5a2mIiwidiI6IjE2OCJ9LHsibiI6IuaImOS6ieWGm+aXhSIsInYiOiI5NzMifV19XSwKICAgICAgICAiNDQ5IjogW3trZXk6ICJ0eXBlIiwgbmFtZTogIuexu+WeiyIsIHZhbHVlOiBbeyJuIjoi5YWo6YOoIiwidiI6IjQ0OSJ9LHsibiI6IuazleW+iyIsInYiOiIxNDIifSx7Im4iOiLlv4PnkIYiLCJ2IjoiMTQ2In0seyJuIjoi5b+D55CG5a2mIiwidiI6IjQwNyJ9LHsibiI6IuWwkeWEv+W/g+eQhiIsInYiOiI5ODYifSx7Im4iOiLlv4PnkIbnlpfmhIgiLCJ2IjoiOTk0In0seyJuIjoi5oqV6LWE55CG6LSiIiwidiI6IjE0MyJ9LHsibiI6IuiBjOS4muiBjOWcuiIsInYiOiIxNDUifSx7Im4iOiLnu4/nrqHllYbkuJoiLCJ2IjoiMjM4In0seyJuIjoi5rKf6YCa6KGo6L6+IiwidiI6IjE0NCJ9LHsibiI6IuWKseW/l+aIkOWKnyIsInYiOiIyMzkifV19XSwKICAgICAgICAiMTEzIjogW3trZXk6ICJ0eXBlIiwgbmFtZTogIuexu+WeiyIsIHZhbHVlOiBbeyJuIjoi5YWo6YOoIiwidiI6IjExMyJ9LHsibiI6IuS6rOWJpyIsInYiOiIxNzEifSx7Im4iOiLotorliaciLCJ2IjoiMTcyIn0seyJuIjoi6buE5qKF5oiPIiwidiI6IjE3MyJ9LHsibiI6IuivhOWJpyIsInYiOiIxNzQifSx7Im4iOiLosavliaciLCJ2IjoiMTc1In0seyJuIjoi5piG5puyIiwidiI6IjE3NiJ9LHsibiI6IuiJuuacryIsInYiOiIxMzQifSx7Im4iOiLoibrmnK/mlofljJYiLCJ2IjoiOTQ1In0seyJuIjoi6Z+z5LmQ6Iie6LmIIiwidiI6Ijk0NiJ9LHsibiI6Iue7mOeUuyIsInYiOiI5NTkifSx7Im4iOiLmkYTlvbEiLCJ2IjoiOTYxIn0seyJuIjoi6Ym06LWP55CG6K66IiwidiI6Ijk2MiJ9XX1dLAogICAgICAgICI5NjAiOiBbe2tleTogInR5cGUiLCBuYW1lOiAi57G75Z6LIiwgdmFsdWU6IFt7Im4iOiLlhajpg6giLCJ2IjoiOTYwIn0seyJuIjoi576O6aOf54O56aWqIiwidiI6IjI0MCJ9LHsibiI6IuaXhea4uCIsInYiOiIxNTgifSx7Im4iOiLlgaXlurflhbvnlJ8iLCJ2IjoiMTU5In0seyJuIjoi6L+Q5Yqo5YGl6LqrIiwidiI6IjQxNyJ9LHsibiI6IuaXtuWwmue+juWmhiIsInYiOiI0MTgifSx7Im4iOiLnvo7po5/kvJHpl7IiLCJ2IjoiNDE5In0seyJuIjoi5a625bGF5peF5ri4IiwidiI6IjQyMCJ9LHsibiI6IumjjuawtOWNoOWNnCIsInYiOiI0MjEifSx7Im4iOiLnmb7np5HluLjor4YiLCJ2IjoiOTYzIn0seyJuIjoi55Sf5rS75oOF5oSfIiwidiI6Ijk2NCJ9XX1dLAogICAgICAgICI0NTAiOiBbe2tleTogInR5cGUiLCBuYW1lOiAi57G75Z6LIiwgdmFsdWU6IFt7Im4iOiLlhajpg6giLCJ2IjoiNDUwIn0seyJuIjoi5Lqy5a2QIiwidiI6IjQ0NyJ9LHsibiI6IuWpmuWnuyIsInYiOiIyMzQifSx7Im4iOiLnvo7mlociLCJ2IjoiMjMwIn0seyJuIjoi5aSc6K+dIiwidiI6IjIzMiJ9LHsibiI6IuWls+aApyIsInYiOiIyMzEifSx7Im4iOiLlv4PnkIblgaXlurciLCJ2IjoiMjMzIn0seyJuIjoi5oOF5oSf5pWF5LqLIiwidiI6IjIyOSJ9LHsibiI6IuS6p+WQjuaKpOeQhiIsInYiOiIyMjYifSx7Im4iOiLlhL/nq6Xoi7Hor60iLCJ2IjoiMjIyIn0seyJuIjoi5a2V5pyf5L+d5YGlIiwidiI6IjIyNyJ9LHsibiI6IuS6suWtkOWBpeW6tyIsInYiOiIyMjgifSx7Im4iOiLnp5Hmma4iLCJ2IjoiMjIzIn0seyJuIjoi5Zu95a2m5Y6G5Y+yIiwidiI6IjIyNCJ9LHsibiI6IuiDjuaVmeaXqeaVmSIsInYiOiIyMjUifSx7Im4iOiLlhL/nq6XmloflraYiLCJ2IjoiMjIwIn1dfV0sCiAgICAgICAgIjQ0NyI6IFt7a2V5OiAidHlwZSIsIG5hbWU6ICLnsbvlnosiLCB2YWx1ZTogW3sibiI6IuWFqOmDqCIsInYiOiI0NDcifSx7Im4iOiLnp5HlrabmioDmnK8iLCJ2IjoiMTAwMCJ9LHsibiI6IuiHqueEtuenkeWtpiIsInYiOiIxMzYifSx7Im4iOiLkvZvlraYiLCJ2IjoiMTE1In0seyJuIjoi56S+56eRIiwidiI6IjIzNyJ9LHsibiI6IuWbveWtpiIsInYiOiIxMTYifSx7Im4iOiLmlaPmlofmiI/liaciLCJ2IjoiMjM2In0seyJuIjoi5paH5YyWIiwidiI6IjExOCJ9LHsibiI6IuaKgOacryIsInYiOiI5NjkifSx7Im4iOiLnp5HlraYiLCJ2IjoiOTc5In0seyJuIjoi5bel5LiaIiwidiI6Ijk4MCJ9LHsibiI6IuWGnOael+eJp+a4lCIsInYiOiI5ODEifSx7Im4iOiLorqHnrpfmnLoiLCJ2IjoiOTgyIn0seyJuIjoi5bu6562R5Zut5p6XIiwidiI6Ijk4MyJ9XX1dLAogICAgICAgICIzOSI6IFt7a2V5OiAidHlwZSIsIG5hbWU6ICLnsbvlnosiLCB2YWx1ZTogW3sibiI6IuS6jOasoeWFgyIsInYiOiIzOSJ9LHsibiI6IuWoseS5kCIsInYiOiIxMjEifSx7Im4iOiLnuqrlvZUiLCJ2IjoiMTMzIn0seyJuIjoi5paw6Ze7IiwidiI6IjQ0NiJ9XX1dCiAgICB9LAoKICAgIOS4gOe6pzogYXN5bmMgZnVuY3Rpb24gKHRpZCwgcGcsIGZpbHRlciwgZXh0ZW5kKSB7CiAgICAgICAgbGV0IHBhZ2UgPSBwZyB8fCAxOwogICAgICAgIGxldCB0eXBlSWQgPSAoZXh0ZW5kICYmIGV4dGVuZC50eXBlKSA/IGV4dGVuZC50eXBlIDogdGlkOwogICAgICAgIGxldCBmaW5hbFVybCA9IGAke3RoaXMuaG9zdH0vYXBpL2Rpc2NvdmVyP3RhYj3lkKzkuaYmdHlwZT0ke3R5cGVJZH0mZ2VuZGVyPTImZ2VucmVfdHlwZT0xJnBhZ2U9JHtwYWdlfWA7CiAgICAgICAgbGV0IGpzb24gPSBhd2FpdCByZXF1ZXN0KGZpbmFsVXJsKTsKICAgICAgICBsZXQgZGF0YSA9IEpTT04ucGFyc2UoanNvbik7CiAgICAgICAgbGV0IGJvb2tfbGlzdCA9IGRhdGEuY29kZSA9PT0gMjAwID8gZGF0YS5kYXRhIDogW107CiAgICAgICAgbGV0IGQgPSBbXTsKICAgICAgICBib29rX2xpc3QuZm9yRWFjaCgoaXQpID0+IHsKICAgICAgICAgICAgZC5wdXNoKHsKICAgICAgICAgICAgICAgIHRpdGxlOiBpdC5ib29rX25hbWUgfHwgaXQuQm9va05hbWUsCiAgICAgICAgICAgICAgICB1cmw6IGl0LmJvb2tfaWQgfHwgaXQuQm9va0lkLAogICAgICAgICAgICAgICAgZGVzYzogaXQuYXV0aG9yIHx8IGl0LkF1dGhvciwKICAgICAgICAgICAgICAgIGNvbnRlbnQ6IGl0LmFic3RyYWN0IHx8IGl0LkFic3RyYWN0IHx8IGl0LmJvb2tfYWJzdHJhY3RfdjIsCiAgICAgICAgICAgICAgICBwaWNfdXJsOiBpdC50aHVtYl91cmwgfHwgaXQuVGh1bWJVUkwgfHwgaXQuYXVkaW9fdGh1bWJfdXJpCiAgICAgICAgICAgIH0pOwogICAgICAgIH0pOwoKICAgICAgICByZXR1cm4gc2V0UmVzdWx0KGQpOwogICAgfSwKCiAgICDkuoznuqc6IGFzeW5jIGZ1bmN0aW9uICgpIHsKICAgICAgICBsZXQgZGV0YWlsQXBpID0gYCR7dGhpcy5ob3N0fS9hcGkvZGV0YWlsP2Jvb2tfaWQ9JHt0aGlzLm9ySWR9YDsKICAgICAgICBsZXQgZGV0YWlsSnNvbiA9IGF3YWl0IHJlcXVlc3QoZGV0YWlsQXBpKTsKICAgICAgICBsZXQgZGV0YWlsRGF0YSA9IEpTT04ucGFyc2UoZGV0YWlsSnNvbik7CiAgICAgICAgbGV0IGRhdGEgPSBkZXRhaWxEYXRhLmRhdGEuZGF0YTsKICAgICAgICBsZXQgY2hhcHRlcnNBcGkgPSBgJHt0aGlzLmhvc3R9L2FwaS9ib29rP2Jvb2tfaWQ9JHt0aGlzLm9ySWR9YDsKICAgICAgICBsZXQgY2hhcHRlcnNKc29uID0gYXdhaXQgcmVxdWVzdChjaGFwdGVyc0FwaSk7CiAgICAgICAgbGV0IGNoYXB0ZXJzRGF0YSA9IEpTT04ucGFyc2UoY2hhcHRlcnNKc29uKTsKICAgICAgICBsZXQgYm9va0RhdGEgPSBjaGFwdGVyc0RhdGEuZGF0YS5kYXRhOwogICAgICAgIGxldCBsaXN0ID0gYm9va0RhdGEuY2hhcHRlckxpc3RXaXRoVm9sdW1lPy5mbGF0KCkgfHwgYm9va0RhdGEuY2hhcHRlckxpc3QgfHwgW107CiAgICAgICAgbGV0IHVybHMgPSBsaXN0Lm1hcChpdCA9PiBpdC50aXRsZSArICckJyArIGl0Lml0ZW1JZCArICdAJyArIGl0LnRpdGxlKS5qb2luKCcjJyk7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgdm9kX2lkOiB0aGlzLm9ySWQsCiAgICAgICAgICAgIHZvZF9uYW1lOiBkYXRhLmJvb2tfbmFtZSwKICAgICAgICAgICAgdHlwZV9uYW1lOiBkYXRhLmNhdGVnb3J5LAogICAgICAgICAgICB2b2RfcGljOiBkYXRhLnRodW1iX3VybCB8fCBkYXRhLmV4cGFuZF90aHVtYl91cmwsCiAgICAgICAgICAgIHZvZF9jb250ZW50OiBkYXRhLmFic3RyYWN0IHx8IGRhdGEuYm9va19hYnN0cmFjdF92MiwKICAgICAgICAgICAgdm9kX3JlbWFya3M6IGRhdGEuc3ViX2luZm8sCiAgICAgICAgICAgIHZvZF9kaXJlY3RvcjogZGF0YS5hdXRob3IsCiAgICAgICAgICAgIHZvZF9wbGF5X2Zyb206ICfnlarojITnlYXlkKwnLAogICAgICAgICAgICB2b2RfcGxheV91cmw6IHVybHMKICAgICAgICB9OwogICAgfSwKCiAgICDmkJzntKI6IGFzeW5jIGZ1bmN0aW9uICgpIHsKICAgICAgICBsZXQge2lucHV0fSA9IHRoaXM7CiAgICAgICAgbGV0IGh0bWwgPSBhd2FpdCByZXF1ZXN0KGlucHV0KTsKICAgICAgICBsZXQganNvbiA9IEpTT04ucGFyc2UoaHRtbCk7CiAgICAgICAgbGV0IGRhdGEgPSBqc29uLmRhdGEuc2VhcmNoX3RhYnNbNF0uZGF0YTsKICAgICAgICBsZXQgZCA9IFtdOwogICAgICAgIGZvciAobGV0IGl0IG9mIGRhdGEuZmlsdGVyKGkgPT4gaS5ib29rX2RhdGEpKSB7CiAgICAgICAgICAgIGxldCBib29rID0gaXQuYm9va19kYXRhWzBdOwogICAgICAgICAgICBkLnB1c2goewogICAgICAgICAgICAgICAgdGl0bGU6IGJvb2suYm9va19uYW1lLAogICAgICAgICAgICAgICAgdXJsOiBib29rLmJvb2tfaWQsCiAgICAgICAgICAgICAgICBkZXNjOiBib29rLmF1dGhvciwKICAgICAgICAgICAgICAgIGNvbnRlbnQ6IGJvb2suYm9va19hYnN0cmFjdCB8fCBib29rLmFic3RyYWN0LAogICAgICAgICAgICAgICAgcGljX3VybDogYm9vay50aHVtYl91cmwKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzZXRSZXN1bHQoZCk7CiAgICB9LAoKICAgIGxhenk6IGFzeW5jIGZ1bmN0aW9uICgpIHsKICAgICAgICBsZXQge2lucHV0fSA9IHRoaXM7CiAgICAgICAgbGV0IHBhcnRzID0gaW5wdXQuc3BsaXQoJ0AnKTsKICAgICAgICBsZXQgaXRlbUlkID0gcGFydHNbMF07CiAgICAgICAgbGV0IHRvbmVJZCA9ICcxJzsKICAgICAgICBsZXQgY29udGVudF91cmwgPSBgJHt0aGlzLmhvc3R9L2FwaS9jb250ZW50P2l0ZW1faWQ9JHtpdGVtSWR9JnRhYj3lkKzkuaYmdG9uZV9pZD0ke3RvbmVJZH1gOwogICAgICAgIGxldCBqc29uU3RyID0gYXdhaXQgcmVxdWVzdChjb250ZW50X3VybCk7CiAgICAgICAgbGV0IGRhdGEgPSBKU09OLnBhcnNlKGpzb25TdHIpOwogICAgICAgIHJldHVybiB7cGFyc2U6IDAsIHVybDogZGF0YS5kYXRhLmNvbnRlbnR9OwogICAgfQp9Ow== \ No newline at end of file diff --git "a/spider/js/\350\245\277\351\245\255\347\237\255\345\211\247.js" "b/spider/js/\350\245\277\351\245\255\347\237\255\345\211\247.js" deleted file mode 100644 index 3a1c8a7b..00000000 --- "a/spider/js/\350\245\277\351\245\255\347\237\255\345\211\247.js" +++ /dev/null @@ -1,152 +0,0 @@ -/* -@header({ - searchable: 2, - filterable: 1, - quickSearch: 0, - title: '西饭短剧[短]', - '类型': '影视', - lang: 'ds' -}) -*/ - -var rule = { - title: '西饭短剧[短]', - host: 'https://xifan-api-cn.youlishipin.com', - homeUrl: '/xifan/drama/portalPage?reqType=duanjuCategory&version=2001001&androidVersionCode=28', - searchUrl: '**', - url: '/xifan/drama/portalPage?reqType=aggregationPage&offset=fypage&categoryId=fyclass', - headers: { - 'User-Agent': 'okhttp/3.12.11', - }, - timeout: 5000, - filterable: 1, - limit: 30, - multi: 1, - searchable: 2, - play_parse: true, - search_match: true, - - class_parse: async function () { - let {input} = this; - let html = await request(input); - let classes = []; - let filters = {}; - let data = JSON.parse(html).result.elements[0].contents; - data.forEach((it) => { - const categoryItemVo = it.categoryItemVo || {}; - const typeName = categoryItemVo.oppoCategory; - const typeId = categoryItemVo.categoryId; - const subCategories = categoryItemVo.subCategories || []; - - // 只提取 type 为 duanjuCategory 的作为主分类 - if (it.type && it.type.includes("duanjuCategory")) { - classes.push({ - type_name: typeName, - type_id: `${typeId}@${typeName}`, - }); - } - - // 其他作为筛选条件 - if (subCategories.length > 0) { - filters[typeName] = { - key: categoryItemVo.categoryId, - name: categoryItemVo.oppoCategory, - value: subCategories.map(sub => ({ - n: sub.oppoCategory, - v: `${sub.oppoCategory}@${sub.categoryId}` - })) - }; - } - }); - // 设置筛选条件 - return { - class: classes, - filters: filters - }; - }, - - 一级: async function () { - let {input,MY_PAGE} = this; - const typeId = input.split('categoryId=')[1].split('@')[0]; - const typeName = input.split('categoryId=')[1].split('@')[1]; - let page = (MY_PAGE - 1) * rule.limit; - let current_timestamp = Math.floor(Date.now() / 1000); - let url = `${rule.host}/xifan/drama/portalPage?reqType=aggregationPage&offset=${page}&categoryId=${typeId}&quickEngineVersion=-1&scene=&categoryNames=${encodeURIComponent(typeName)}&categoryVersion=1&density=1.5&pageID=page_theater&version=2001001&androidVersionCode=28&requestId=${current_timestamp}aa498144140ef297&appId=drama&teenMode=false&userBaseMode=false&session=eyJpbmZvIjp7InVpZCI6IiIsInJ0IjoiMTc0MDY1ODI5NCIsInVuIjoiT1BHXzFlZGQ5OTZhNjQ3ZTQ1MjU4Nzc1MTE2YzFkNzViN2QwIiwiZnQiOiIxNzQwNjU4Mjk0In19&feedssession=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1dHlwIjowLCJidWlkIjoxNjMzOTY4MTI2MTQ4NjQxNTM2LCJhdWQiOiJkcmFtYSIsInZlciI6MiwicmF0IjoxNzQwNjU4Mjk0LCJ1bm0iOiJPUEdfMWVkZDk5NmE2NDdlNDUyNTg3NzUxMTZjMWQ3NWI3ZDAiLCJpZCI6IjNiMzViZmYzYWE0OTgxNDQxNDBlZjI5N2JkMDY5NGNhIiwiZXhwIjoxNzQxMjYzMDk0LCJkYyI6Imd6cXkifQ.JS3QY6ER0P2cQSxAE_OGKSMIWNAMsYUZ3mJTnEpf-Rc`; - - let d = []; - let html = await request(url, { headers: rule.headers }); - let data = JSON.parse(html).result.elements; - data.forEach((soup) => { - soup.contents.forEach((vod) => { - let dj = vod.duanjuVo; - d.push({ - title: dj.title, - img: dj.coverImageUrl, - desc: dj.total + '集', - url: `${dj.duanjuId}#${dj.source}` - }); - }); - }); - - return setResult(d); - }, - - 二级: async function () { - let {orId} = this; - let [duanjuId, source] = orId.split("#"); - let url = `${rule.host}/xifan/drama/getDuanjuInfo?duanjuId=${duanjuId}&source=${source}&openFrom=homescreen&type=&pageID=page_inner_flow&density=1.5&version=2001001&androidVersionCode=28&requestId=1740658944980aa498144140ef297&appId=drama&teenMode=false&userBaseMode=false&session=eyJpbmZvIjp7InVpZCI6IiIsInJ0IjoiMTc0MDY1ODI5NCIsInVuIjoiT1BHXzFlZGQ5OTZhNjQ3ZTQ1MjU4Nzc1MTE2YzFkNzViN2QwIiwiZnQiOiIxNzQwNjU4Mjk0In19&feedssession=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1dHlwIjowLCJidWlkIjoxNjMzOTY4MTI2MTQ4NjQxNTM2LCJhdWQiOiJkcmFtYSIsInZlciI6MiwicmF0IjoxNzQwNjU4Mjk0LCJ1bm0iOiJPUEdfMWVkZDk5NmE2NDdlNDUyNTg3NzUxMTZjMWQ3NWI3ZDAiLCJpZCI6IjNiMzViZmYzYWE0OTgxNDQxNDBlZjI5N2JkMDY5NGNhIiwiZXhwIjoxNzQxMjYzMDk0LCJkYyI6Imd6cXkifQ.JS3QY6ER0P2cQSxAE_OGKSMIWNAMsYUZ3mJTnEpf-Rc`; - - let response = await request(url, { headers: rule.headers }); - let data = JSON.parse(response).result; - VOD = { - vod_name: data.title, - vod_pic: data.coverImageUrl, - vod_content: data.desc || '未知', - vod_remarks: data.updateStatus === 'over' ? `${data.total}集 已完结` : `更新${data.total}集` - }; - - let playUrls = []; - data.episodeList.forEach((ep) => { - playUrls.push(`${ep.index}$${ep.playUrl}`); - }); - - VOD.vod_play_from = '西饭短剧'; - VOD.vod_play_url = playUrls.join("#"); - return VOD; - }, - - 搜索: async function () { - let {input,MY_PAGE,KEY} = this; - let d = []; - let current_timestamp = Math.floor(Date.now() / 1000); - let url = `${rule.host}/xifan/search/getSearchList?keyword=${KEY}84&pageIndex=${MY_PAGE}&version=2001001&androidVersionCode=28&requestId=${current_timestamp}ea3a14bc0317d76f&appId=drama&teenMode=false&userBaseMode=false&session=eyJpbmZvIjp7InVpZCI6IiIsInJ0IjoiMTc0MDY2ODk4NiIsInVuIjoiT1BHX2U5ODQ4NTgzZmM4ZjQzZTJhZjc5ZTcxNjRmZTE5Y2JjIiwiZnQiOiIxNzQwNjY4OTg2In19&feedssession=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1dHlwIjowLCJidWlkIjoxNjM0MDU3ODE4OTgxNDk5OTA0LCJhdWQiOiJkcmFtYSIsInZlciI6MiwicmF0IjoxNzQwNjY4OTg2LCJ1bm0iOiJPUEdfZTk4NDg1ODNmYzhmNDNlMmFmNzllNzE2NGZlMTljYmMiLCJpZCI6ImVhZGE1NmEyZWEzYTE0YmMwMzE3ZDc2ZmVjODJjNzc3IiwiZXhwIjoxNzQxMjczNzg2LCJkYyI6ImJqaHQifQ.IwuI0gK077RF4G10JRxgxx4GCG502vR8Z0W9EV4kd-c`; - - let html = await request(url, {headers: rule.headers }); - let data = JSON.parse(html).result.elements; - data.forEach((soup) => { - soup.contents.forEach((vod) => { - let dj = vod.duanjuVo; - let name = dj.title.replace(/<\/?tag>/g, ""); - if (rule.search_match && !new RegExp(KEY, "i").test(name)) { - return; - } - - d.push({ - title: name, - img: dj.coverImageUrl, - desc: dj.total + '集', - url: `${dj.duanjuId}#${dj.source}` - }); - }); - }); - - return setResult(d); - }, - lazy: async function () { - let {input} = this; - return { - parse: 0, - url: input - }; - }, -} 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 From b6a8616c72d907a66516bac53c9189a32889cb7e Mon Sep 17 00:00:00 2001 From: eylinsir <283371717@qq.com> Date: Sat, 17 Jan 2026 18:58:40 +0800 Subject: [PATCH 10/12] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\347\237\255\345\211\247[\347\237\255].js" | 0 ...\347\237\255\345\211\247[\347\237\255].js" | 155 ++++++++++++ ...\347\237\255\345\211\247[\347\237\255].js" | 229 ++++++++++++++++++ ...\347\237\255\345\211\247[\347\237\255].js" | 152 ++++++++++++ ...\347\237\255\345\211\247[\347\237\255].js" | 0 5 files changed, 536 insertions(+) rename "spider/js/\344\270\203\347\214\253\347\237\255\345\211\247.js" => "spider/js/\344\270\203\347\214\253\347\237\255\345\211\247[\347\237\255].js" (100%) create mode 100644 "spider/js/\346\230\237\350\212\275\347\237\255\345\211\247[\347\237\255].js" create mode 100644 "spider/js/\347\211\233\347\211\233\347\237\255\345\211\247[\347\237\255].js" create mode 100644 "spider/js/\350\245\277\351\245\255\347\237\255\345\211\247[\347\237\255].js" rename "spider/js/\350\275\257\351\270\255\347\237\255\345\211\247.js" => "spider/js/\350\275\257\351\270\255\347\237\255\345\211\247[\347\237\255].js" (100%) 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/\346\230\237\350\212\275\347\237\255\345\211\247[\347\237\255].js" "b/spider/js/\346\230\237\350\212\275\347\237\255\345\211\247[\347\237\255].js" new file mode 100644 index 00000000..f5aed999 --- /dev/null +++ "b/spider/js/\346\230\237\350\212\275\347\237\255\345\211\247[\347\237\255].js" @@ -0,0 +1,155 @@ +/* +@header({ + searchable: 2, + filterable: 1, + quickSearch: 1, + title: '星芽短剧', + lang: 'ds' +}) +*/ + +// http://localhost:5757/api/星芽短剧?ac=list&t=1&pg=1 +// http://localhost:5757/api/星芽短剧?ac=detail&ids=https://app.whjzjx.cn/v2/theater_parent/detail?theater_parent_id=3523 +// http://localhost:5757/api/星芽短剧?wd=龙王&pg=1 +// http://localhost:5757/api/星芽短剧?play=http://qcapp.xingya.com.cn/h265/wz_mp40905dingtianhou01.mp4?sign=4db245c4e9cd5bd3d3026e2e0f6147a6&t=674ee966&flag=星芽短剧 +var rule = { + 类型: '影视', + title: '星芽短剧', + desc: '星芽短剧纯js版本', + host: 'https://app.whjzjx.cn', + url: '/cloud/v2/theaterfyfilter', + filter_url: '/home_page?theater_class_id=fyclass&type=1&{{fl.type or "class2_ids=0"}}&page_num=fypage&page_size=24', + searchUrl: '/v3/search', + searchable: 2, + quickSearch: 1, + filterable: 1, + filter: 'H4sIAAAAAAAAA6vmUgACJUMlK4VoMBMEquEssGR2aiVQWqmksiBVSQdVKi8xNxUk93zj7qfzutFlyxJzSlNRTMZuA8I4kFlPW1e8bF6BZhbCTJCS5JzE4mKj+MyUYlsDJQx1tZha8dn3snnv0x1NxNpnQrF9T/uXvFjcSqx9phTb97xvw5Pdi1+saHjWTLSthpRb+6xjxvOl84i10IjycH3Z0PZi0VpiLTSnPFxX7n+xrYvoEKXcwqd9bU/7NxGdUCnPGS+2zni6cj/RUWhGeZAunfe0ZzfRFlKeSF+29z6fMp9YC6ngwSlznq5bQKx9xsbUKGxIzvzGVMgbfS1PdxIdkcaUR+SLCT1P180l1kJLyu1rmfhsC9Glm7ERxRY+2bWJhCg0MaTchzMnPGtEr9JxWmiBxT4UkVguVPFYrloA8HqNcnwIAAA=', + headers: { + 'User-Agent': 'okhttp/4.10.0', + 'Accept-Encoding': 'gzip', + 'x-app-id': '7', + 'platform': '1', + 'manufacturer': 'realme', + 'version_name': '3.3.1', + 'user_agent': 'Mozilla/5.0 (Linux; Android 9; RMX1931 Build/PQ3A.190605.05081124; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/91.0.4472.114 Mobile Safari/537.36', + 'dev_token': 'BFdbZBGOEgG7QDt01ldOQNNfhO2F-rv4QcugZoFZm5_3DlPJEo_bSBeJ6dW2X3eKzxxKKWz3xJCM_u5PppGMqRuYPxcsVg9a-jriWiIoPZvHMSLbcbxTFuasqgTivTY3GabW1yP57LQSsJNQfKoX1BKYGHducrhb0bTwvigfn3gE*', + 'app_version': '3.1.0.1', + 'device_platform': 'android', + 'personalized_recommend_status': '1', + 'device_type': 'RMX1931', + 'device_brand': 'realme', + 'os_version': '9', + 'channel': 'default', + 'raw_channel': 'default', + 'oaid': '', + 'msa_oaid': '', + 'uuid': 'randomUUID_8a0324bf-03c8-4789-8ef8-12d3bcff28f5', + 'device_id': '24250683a3bdb3f118dff25ba4b1cba1a', + 'ab_id': '', + 'support_h265': '1' + }, + timeout: 5000, + class_name: '剧场&热播剧&会员专享&星选好剧&新剧&阳光剧场', + class_url: '1&2&8&7&3&5', + play_parse: true, + class_parse: async () => { + }, + 预处理: async () => { + let html = await post('https://u.shytkjgs.com/user/v1/account/login', { + headers: { + 'User-Agent': 'okhttp/4.10.0', + 'Accept-Encoding': 'gzip', + 'Content-Type': 'application/x-www-form-urlencoded', + 'x-app-id': '7', + 'platform': '1', + 'manufacturer': 'realme', + 'version_name': '3.3.1', + 'user_agent': 'Mozilla/5.0 (Linux; Android 9; RMX1931 Build/PQ3A.190605.05081124; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/91.0.4472.114 Mobile Safari/537.36', + 'app_version': '3.3.1', + 'device_platform': 'android', + 'personalized_recommend_status': '1', + 'device_type': 'RMX1931', + 'device_brand': 'realme', + 'os_version': '9', + 'channel': 'default', + 'raw_channel': 'default', + 'oaid': '', + 'msa_oaid': '', + 'uuid': 'randomUUID_914e7a9b-deac-4f80-9247-db56669187df', + 'device_id': '24250683a3bdb3f118dff25ba4b1cba1a', + 'ab_id': '', + 'support_h265': '1' + }, + body: "device=24250683a3bdb3f118dff25ba4b1cba1a&install_first_open=false&first_install_time=1723214205125&last_update_time=1723214205125&report_link_url=" + }); + // log('html:', html); + html = JSON.parse(html); + try { + rule.headers['authorization'] = html.data.token + } catch (e) { + rule.headers['authorization'] = html.data.data.token + } + log('authorization:', rule.headers['authorization']); + }, + 推荐: async () => { + return [] + }, + 一级: async function (tid, pg, filter, extend) { + let {input} = this; + let d = []; + let html = await request(input, {headers: rule.headers}); + let data = JSON.parse(html).data.list; + data.forEach(it => { + let id = 'https://app.whjzjx.cn/v2/theater_parent/detail?theater_parent_id=' + it.theater.id; + d.push({ + url: id, + title: it.theater.title, + img: it.theater.cover_url, + desc: it.theater.theme, + }) + }) + return setResult(d); + }, + 二级: async function (ids) { + let {input} = this; + let urls = []; + let html = await request(input, {headers: rule.headers}); + let data = JSON.parse(html).data; + let vod = { + vod_id: input, + vod_name: data.theaters.son_title, + vod_pic: data.cover_url, + } + let playFroms = []; + let playUrls = []; + data.theaters.forEach(it => { + urls.push(it.num + '$' + encodeURIComponent(it.son_video_url)); + }) + playFroms.push('不知道倾情打造'); + vod.vod_play_from = playFroms.join('$$$'); + playUrls.push(urls.join('#')); + vod.vod_play_url = playUrls.join('$$$'); + return vod + }, + 搜索: async function (wd, quick, pg) { + let {input, KEY} = this + let d = []; + let html = await post(input, {headers: rule.headers, body: {"text": KEY}}) + let list = JSON.parse(html).data.theater.search_data; + list.forEach(it => { + let id = 'https://app.whjzjx.cn/v2/theater_parent/detail?theater_parent_id=' + it.id; + d.push({ + url: id, + title: it.title, + desc: it.total, + img: it.cover_url, + content: it.introduction, + }) + }) + return setResult(d); + }, + lazy: async function (flag, id, flags) { + let {input} = this; + return {parse: 0, url: input, js: ''} + }, +}; diff --git "a/spider/js/\347\211\233\347\211\233\347\237\255\345\211\247[\347\237\255].js" "b/spider/js/\347\211\233\347\211\233\347\237\255\345\211\247[\347\237\255].js" new file mode 100644 index 00000000..204129dc --- /dev/null +++ "b/spider/js/\347\211\233\347\211\233\347\237\255\345\211\247[\347\237\255].js" @@ -0,0 +1,229 @@ +/* +@header({ + searchable: 2, + filterable: 1, + quickSearch: 0, + title: '牛牛短句[短]', + '类型': '影视', + lang: 'ds' +}) +*/ + +var rule = { + title: '牛牛短句[短]', + host: 'https://new.tianjinzhitongdaohe.com', + homeUrl: '/api/v1/app/screen/screenType', + searchUrl: '/api/v1/app/search/searchMovie', + url: '/api/v1/app/screen/screenMovie?classify=fyclass&page=fypage', + headers: { + "Cache-Control": "no-cache", + "Content-Type": "application/json;charset=UTF-8", + "User-Agent": "okhttp/4.12.0" + }, + timeout: 5000, + filterable: 1, + limit: 40, + multi: 1, + searchable: 2, + play_parse: true, + search_match: true, + + class_parse: async function () { + const url = `${rule.host}/api/v1/app/screen/screenType`; + try { + const response = await request(url, { + method: 'POST', + headers: rule.headers + }); + const data = JSON.parse(response); + const classes = []; + + if (data.data && data.data[0]?.children?.[0]?.children) { + data.data[0].children[0].children.forEach(vod => { + classes.push({ + type_name: `${vod.name}`, + type_id: vod.name + }); + }); + } + + return { + class: classes, + filters: {} + }; + } catch (e) { + console.error("分类解析错误:", e); + return {class: []}; + } + }, + + 一级: async function () { + const {input, MY_PAGE} = this; + const cid = input.split('classify=')[1].split('&')[0]; + const page = MY_PAGE || 1; + const payload = JSON.stringify({ + condition: { + classify: cid, + typeId: "S1" + }, + pageNum: String(page), + pageSize: rule.limit + }); + + try { + const url = `${rule.host}/api/v1/app/screen/screenMovie`; + const response = await request(url, { + method: 'POST', + headers: rule.headers, + body: payload + }); + const data = JSON.parse(response); + const videos = []; + if (data.data?.records) { + data.data.records.forEach(vod => { + videos.push({ + title: vod.name, + img: vod.cover, + desc: `${vod.totalEpisode}集`, + url: vod.id + }); + }); + } + + return setResult(videos); + } catch (e) { + console.error("一级列表错误:", e); + return []; + } + }, + + 二级: async function () { + const { orId } = this; + let did = orId; + let bofang = ''; + let xianlu = ''; + let content = ''; + + try { + // 获取剧集列表 + const detailPayload = JSON.stringify({ + id: did, + source: 0, + typeId: "S1", + userId: "223664" + }); + + const detailUrl = `${rule.host}/api/v1/app/play/movieDetails`; + const detailResponse = await request(detailUrl, { + method: 'POST', + headers: rule.headers, + body: detailPayload + }); + + const detailData = JSON.parse(detailResponse).data || {}; + if (detailData.episodeList && detailData.episodeList.length > 0) { + const episodes = detailData.episodeList.map(ep => { + return `${ep.episode}$${did}@${ep.id}`; + }); + bofang = episodes.join('#'); + xianlu = '牛牛短句'; + content = detailData.introduce || '暂无剧情介绍'; + } + + return { + vod_name: detailData.name || '未知名称', + vod_pic: detailData.cover || '', + vod_content: content, + vod_play_from: xianlu || '暂无资源', + vod_play_url: bofang || '暂无播放地址$0' + }; + } catch (e) { + console.error("详情解析错误:", e); + return { + vod_name: '加载失败', + vod_pic: '', + vod_content: '详情加载失败,请稍后重试', + vod_play_from: '暂无资源', + vod_play_url: '暂无播放地址$0' + }; + } + }, + + 搜索: async function () { + const {KEY, MY_PAGE} = this; + const page = MY_PAGE || 1; + const payload = JSON.stringify({ + condition: { + typeId: "S1", + value: KEY + }, + pageNum: String(page), + pageSize: rule.limit + }); + + try { + const url = `${rule.host}/api/v1/app/search/searchMovie`; + const response = await request(url, { + method: 'POST', + headers: rule.headers, + body: payload + }); + const data = JSON.parse(response); + const videos = []; + + if (data.data?.records) { + data.data.records.forEach(vod => { + if (rule.search_match && !vod.name.includes(KEY)) return; + + videos.push({ + title: vod.name, + img: vod.cover, + desc: `更新时间${vod.year || '未知'}`, + url: vod.id + }); + }); + } + return setResult(videos); + } catch (e) { + console.error("搜索错误:", e); + return []; + } + }, + + lazy: async function () { + const {input} = this; + const [videoId, episodeId] = input.split('@'); + const payload = JSON.stringify({ + episodeId, + id: videoId, + source: 0, + typeId: "S1", + userId: "223664" + }); + + try { + const url = `${rule.host}/api/v1/app/play/movieDetails`; + const response = await request(url, { + method: 'POST', + headers: rule.headers, + body: payload + }); + const data = JSON.parse(response); + + return { + parse: 0, + url: data.data?.url || '', + header: { + 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.87 Safari/537.36' + } + }; + } catch (e) { + console.error("播放地址获取错误:", e); + return { + parse: 0, + url: '', + header: {} + }; + } + } +}; diff --git "a/spider/js/\350\245\277\351\245\255\347\237\255\345\211\247[\347\237\255].js" "b/spider/js/\350\245\277\351\245\255\347\237\255\345\211\247[\347\237\255].js" new file mode 100644 index 00000000..3a1c8a7b --- /dev/null +++ "b/spider/js/\350\245\277\351\245\255\347\237\255\345\211\247[\347\237\255].js" @@ -0,0 +1,152 @@ +/* +@header({ + searchable: 2, + filterable: 1, + quickSearch: 0, + title: '西饭短剧[短]', + '类型': '影视', + lang: 'ds' +}) +*/ + +var rule = { + title: '西饭短剧[短]', + host: 'https://xifan-api-cn.youlishipin.com', + homeUrl: '/xifan/drama/portalPage?reqType=duanjuCategory&version=2001001&androidVersionCode=28', + searchUrl: '**', + url: '/xifan/drama/portalPage?reqType=aggregationPage&offset=fypage&categoryId=fyclass', + headers: { + 'User-Agent': 'okhttp/3.12.11', + }, + timeout: 5000, + filterable: 1, + limit: 30, + multi: 1, + searchable: 2, + play_parse: true, + search_match: true, + + class_parse: async function () { + let {input} = this; + let html = await request(input); + let classes = []; + let filters = {}; + let data = JSON.parse(html).result.elements[0].contents; + data.forEach((it) => { + const categoryItemVo = it.categoryItemVo || {}; + const typeName = categoryItemVo.oppoCategory; + const typeId = categoryItemVo.categoryId; + const subCategories = categoryItemVo.subCategories || []; + + // 只提取 type 为 duanjuCategory 的作为主分类 + if (it.type && it.type.includes("duanjuCategory")) { + classes.push({ + type_name: typeName, + type_id: `${typeId}@${typeName}`, + }); + } + + // 其他作为筛选条件 + if (subCategories.length > 0) { + filters[typeName] = { + key: categoryItemVo.categoryId, + name: categoryItemVo.oppoCategory, + value: subCategories.map(sub => ({ + n: sub.oppoCategory, + v: `${sub.oppoCategory}@${sub.categoryId}` + })) + }; + } + }); + // 设置筛选条件 + return { + class: classes, + filters: filters + }; + }, + + 一级: async function () { + let {input,MY_PAGE} = this; + const typeId = input.split('categoryId=')[1].split('@')[0]; + const typeName = input.split('categoryId=')[1].split('@')[1]; + let page = (MY_PAGE - 1) * rule.limit; + let current_timestamp = Math.floor(Date.now() / 1000); + let url = `${rule.host}/xifan/drama/portalPage?reqType=aggregationPage&offset=${page}&categoryId=${typeId}&quickEngineVersion=-1&scene=&categoryNames=${encodeURIComponent(typeName)}&categoryVersion=1&density=1.5&pageID=page_theater&version=2001001&androidVersionCode=28&requestId=${current_timestamp}aa498144140ef297&appId=drama&teenMode=false&userBaseMode=false&session=eyJpbmZvIjp7InVpZCI6IiIsInJ0IjoiMTc0MDY1ODI5NCIsInVuIjoiT1BHXzFlZGQ5OTZhNjQ3ZTQ1MjU4Nzc1MTE2YzFkNzViN2QwIiwiZnQiOiIxNzQwNjU4Mjk0In19&feedssession=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1dHlwIjowLCJidWlkIjoxNjMzOTY4MTI2MTQ4NjQxNTM2LCJhdWQiOiJkcmFtYSIsInZlciI6MiwicmF0IjoxNzQwNjU4Mjk0LCJ1bm0iOiJPUEdfMWVkZDk5NmE2NDdlNDUyNTg3NzUxMTZjMWQ3NWI3ZDAiLCJpZCI6IjNiMzViZmYzYWE0OTgxNDQxNDBlZjI5N2JkMDY5NGNhIiwiZXhwIjoxNzQxMjYzMDk0LCJkYyI6Imd6cXkifQ.JS3QY6ER0P2cQSxAE_OGKSMIWNAMsYUZ3mJTnEpf-Rc`; + + let d = []; + let html = await request(url, { headers: rule.headers }); + let data = JSON.parse(html).result.elements; + data.forEach((soup) => { + soup.contents.forEach((vod) => { + let dj = vod.duanjuVo; + d.push({ + title: dj.title, + img: dj.coverImageUrl, + desc: dj.total + '集', + url: `${dj.duanjuId}#${dj.source}` + }); + }); + }); + + return setResult(d); + }, + + 二级: async function () { + let {orId} = this; + let [duanjuId, source] = orId.split("#"); + let url = `${rule.host}/xifan/drama/getDuanjuInfo?duanjuId=${duanjuId}&source=${source}&openFrom=homescreen&type=&pageID=page_inner_flow&density=1.5&version=2001001&androidVersionCode=28&requestId=1740658944980aa498144140ef297&appId=drama&teenMode=false&userBaseMode=false&session=eyJpbmZvIjp7InVpZCI6IiIsInJ0IjoiMTc0MDY1ODI5NCIsInVuIjoiT1BHXzFlZGQ5OTZhNjQ3ZTQ1MjU4Nzc1MTE2YzFkNzViN2QwIiwiZnQiOiIxNzQwNjU4Mjk0In19&feedssession=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1dHlwIjowLCJidWlkIjoxNjMzOTY4MTI2MTQ4NjQxNTM2LCJhdWQiOiJkcmFtYSIsInZlciI6MiwicmF0IjoxNzQwNjU4Mjk0LCJ1bm0iOiJPUEdfMWVkZDk5NmE2NDdlNDUyNTg3NzUxMTZjMWQ3NWI3ZDAiLCJpZCI6IjNiMzViZmYzYWE0OTgxNDQxNDBlZjI5N2JkMDY5NGNhIiwiZXhwIjoxNzQxMjYzMDk0LCJkYyI6Imd6cXkifQ.JS3QY6ER0P2cQSxAE_OGKSMIWNAMsYUZ3mJTnEpf-Rc`; + + let response = await request(url, { headers: rule.headers }); + let data = JSON.parse(response).result; + VOD = { + vod_name: data.title, + vod_pic: data.coverImageUrl, + vod_content: data.desc || '未知', + vod_remarks: data.updateStatus === 'over' ? `${data.total}集 已完结` : `更新${data.total}集` + }; + + let playUrls = []; + data.episodeList.forEach((ep) => { + playUrls.push(`${ep.index}$${ep.playUrl}`); + }); + + VOD.vod_play_from = '西饭短剧'; + VOD.vod_play_url = playUrls.join("#"); + return VOD; + }, + + 搜索: async function () { + let {input,MY_PAGE,KEY} = this; + let d = []; + let current_timestamp = Math.floor(Date.now() / 1000); + let url = `${rule.host}/xifan/search/getSearchList?keyword=${KEY}84&pageIndex=${MY_PAGE}&version=2001001&androidVersionCode=28&requestId=${current_timestamp}ea3a14bc0317d76f&appId=drama&teenMode=false&userBaseMode=false&session=eyJpbmZvIjp7InVpZCI6IiIsInJ0IjoiMTc0MDY2ODk4NiIsInVuIjoiT1BHX2U5ODQ4NTgzZmM4ZjQzZTJhZjc5ZTcxNjRmZTE5Y2JjIiwiZnQiOiIxNzQwNjY4OTg2In19&feedssession=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1dHlwIjowLCJidWlkIjoxNjM0MDU3ODE4OTgxNDk5OTA0LCJhdWQiOiJkcmFtYSIsInZlciI6MiwicmF0IjoxNzQwNjY4OTg2LCJ1bm0iOiJPUEdfZTk4NDg1ODNmYzhmNDNlMmFmNzllNzE2NGZlMTljYmMiLCJpZCI6ImVhZGE1NmEyZWEzYTE0YmMwMzE3ZDc2ZmVjODJjNzc3IiwiZXhwIjoxNzQxMjczNzg2LCJkYyI6ImJqaHQifQ.IwuI0gK077RF4G10JRxgxx4GCG502vR8Z0W9EV4kd-c`; + + let html = await request(url, {headers: rule.headers }); + let data = JSON.parse(html).result.elements; + data.forEach((soup) => { + soup.contents.forEach((vod) => { + let dj = vod.duanjuVo; + let name = dj.title.replace(/<\/?tag>/g, ""); + if (rule.search_match && !new RegExp(KEY, "i").test(name)) { + return; + } + + d.push({ + title: name, + img: dj.coverImageUrl, + desc: dj.total + '集', + url: `${dj.duanjuId}#${dj.source}` + }); + }); + }); + + return setResult(d); + }, + lazy: async function () { + let {input} = this; + return { + parse: 0, + url: input + }; + }, +} diff --git "a/spider/js/\350\275\257\351\270\255\347\237\255\345\211\247.js" "b/spider/js/\350\275\257\351\270\255\347\237\255\345\211\247[\347\237\255].js" similarity index 100% rename from "spider/js/\350\275\257\351\270\255\347\237\255\345\211\247.js" rename to "spider/js/\350\275\257\351\270\255\347\237\255\345\211\247[\347\237\255].js" From 752b4a0c34efe900ba184aa25067398c4fd48833 Mon Sep 17 00:00:00 2001 From: eylinsir <283371717@qq.com> Date: Sat, 17 Jan 2026 19:26:52 +0800 Subject: [PATCH 11/12] Update files and clean up spider js scripts --- public/sub/order_common.example.html | 2 + ...57\345\217\257\345\275\261\350\247\206.js" | 60 --------- ...57\350\247\206\345\275\261\351\231\242.js" | 121 ------------------ ...37\350\276\260\345\275\261\351\231\242.js" | 34 ++--- 4 files changed, 16 insertions(+), 201 deletions(-) delete mode 100644 "spider/js/\345\217\257\345\217\257\345\275\261\350\247\206.js" delete mode 100644 "spider/js/\345\217\257\350\247\206\345\275\261\351\231\242.js" rename "spider/js/\345\245\275\344\271\220\345\275\261\350\247\206.js" => "spider/js/\346\230\237\350\276\260\345\275\261\351\231\242.js" (87%) 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/\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\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_.*?=(.*?) Date: Sat, 17 Jan 2026 19:51:14 +0800 Subject: [PATCH 12/12] =?UTF-8?q?Add=20=E7=B1=B3=E5=85=94=E9=9F=B3?= =?UTF-8?q?=E4=B9=90[=E5=90=AC].js=20file?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\351\237\263\344\271\220[\345\220\254].js" | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 "spider/js/\347\261\263\345\205\224\351\237\263\344\271\220[\345\220\254].js" diff --git "a/spider/js/\347\261\263\345\205\224\351\237\263\344\271\220[\345\220\254].js" "b/spider/js/\347\261\263\345\205\224\351\237\263\344\271\220[\345\220\254].js" new file mode 100644 index 00000000..6a2a6720 --- /dev/null +++ "b/spider/js/\347\261\263\345\205\224\351\237\263\344\271\220[\345\220\254].js" @@ -0,0 +1,59 @@ +/* +@header({ + searchable: 2, + filterable: 0, + quickSearch: 0, + title: '米兔音乐', + '类型': '影视', + lang: 'ds' +}) +*/ + +var rule = { + title: '米兔音乐', + host: 'https://api.qqmp3.vip', + url: '/api/fyclass', + searchUrl: '/api/songs.php?type=search&keyword=**', + class_name: '热门歌曲&新歌曲&随机歌曲', + class_url: 'songs.php&songs.php?type=new&songs.php?type=rand', + searchable: 2, + quickSearch: 0, + filterable: 0, + play_parse: true, + limit: 6, + double: true, + headers: { + 'User-Agent': 'Mozilla/5.0 (Linux; Android 12; V2284A Build/V417IR; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/101.0.4951.61 Safari/537.36', + 'Accept': '*/*', + 'Origin': 'https://www.qqmp3.vip', + 'referer': 'https://www.qqmp3.vip', + 'x-requested-with': 'com.mmbox.xbrowser', + 'Sec-Fetch-Site': 'same-site', + 'Sec-Fetch-Mode': 'cors', + 'Sec-Fetch-Dest': 'empty', + 'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7' + }, + 推荐: '*', + 一级: 'json:data;name;pic;artist;rid', + 二级: '*', + 搜索: 'json:data;name;pic;artist;rid', + lazy: async function() { + let ridMatch = this.input.match(/api\/([^/?]+)/); + if (!ridMatch) return this.input; + let rid = ridMatch[1]; + let api = 'https://api.qqmp3.vip/api/kw.php?rid=' + rid; + // console.log('解析接口:', api); + let json = await request(api); + let data = JSON.parse(json); + if (data.code === 200 && data.data?.url) { + return { + parse: 0, + url: data.data.url, + header: this.headers, + lrc: data.data.lrc || '', + playMode: 'repeat' + }; + } + return this.input; + }, +}; \ No newline at end of file