diff --git a/js/xiaosa/api.json b/js/xiaosa/api.json index 31b72f2b0..92722fb62 100755 --- a/js/xiaosa/api.json +++ b/js/xiaosa/api.json @@ -121,6 +121,19 @@ "host": "https://cunchu8.obs.cn-north-4.myhuaweicloud.com/fox.json" } }, + { + "key": "火锅", + "name": "火锅|APP", + "type": 3, + "api": "csp_AppGet", + "searchable": 1, + "changeable": 1, + "ext": { + "url": "https://ios.hgyx.vip", + "dataKey": "062dec75d039980e", + "dataIv": "062dec75d039980e" + } + }, { "key": "云朵", "name": "云朵|APP", @@ -134,6 +147,21 @@ "dataIv": "Tpmm9FD99lJ8Dexa" } }, + { + "key": "顾我", + "name": "顾我|APP", + "type": 3, + "api": "csp_AppQi", + "searchable": 1, + "changeable": 1, + "ext": { + "site": "https://guwozj-1319364746.cos.ap-guangzhou.myqcloud.com/gw7.txt", + "dataKey": "ca94b06ca3c7d80e", + "dataIv": "ca94b06ca3c7d80e", + "init": "initV122", + "ua": "okhttp/3.10.0" + } + }, { "key": "爱影", "name": "爱影|APP", @@ -348,19 +376,6 @@ "token": "4181e508e7a17657d6a6246e70b1b13553e5ae9d8d287dc47000fb2df638dffa" } }, - { - "key": "仓鼠", - "name": "仓鼠|APP", - "type": 3, - "api": "csp_AppGet", - "searchable": 1, - "changeable": 1, - "ext": { - "url": "https://cs450appcms.cs4k.top", - "dataKey": "cD7wZ7iY6qN3sU1z", - "dataIv": "cD7wZ7iY6qN3sU1z" - } - }, { "key": "茉莉", "name": "茉莉|APP", @@ -1312,8 +1327,7 @@ "style": { "type": "list", "ratio": 1.433 - }, - "ext": "./json/aliShare.json" + } }, { "key": "夸克云盘", diff --git a/js/xiaosa/js/优酷视频.js b/js/xiaosa/js/优酷视频.js index 91f45a401..b98c8bae6 100755 --- a/js/xiaosa/js/优酷视频.js +++ b/js/xiaosa/js/优酷视频.js @@ -1,5 +1,5 @@ var rule = { - title: '优酷[官]', + title: '优酷', host: 'https://www.%79%6f%75%6b%75.com', homeUrl: '', searchUrl: 'https://search.%79%6f%75%6b%75.com/api/search?pg=fypage&keyword=**', @@ -2121,6 +2121,211 @@ var rule = { "n": "最新上线", "v": "1" }] + }], + "短剧": [{ + "key": "main_area", + "name": "全部地区", + "value": [{ + "n": "全部地区", + "v": "" + }, { + "n": "内地剧", + "v": "中国内地" + }, { + "n": "港剧", + "v": "中国香港" + }, { + "n": "台剧", + "v": "中国台湾" + }, { + "n": "韩剧", + "v": "韩国" + }, { + "n": "美剧", + "v": "美国" + }, { + "n": "英剧", + "v": "英国" + }, { + "n": "日剧", + "v": "日本" + }, { + "n": "泰剧", + "v": "泰国" + }] + }, { + "key": "tags", + "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": "悬疑" + }, { + "n": "罪案", + "v": "罪案" + }, { + "n": "家庭", + "v": "家庭" + }, { + "n": "历史", + "v": "历史" + }, { + "n": "年代", + "v": "年代" + }, { + "n": "农村", + "v": "农村" + }] + }, { + "key": "year", + "name": "全部年份", + "value": [{ + "n": "全部年份", + "v": "" + }, { + "n": "2026", + "v": "2026" + }, { + "n": "2025", + "v": "2025" + }, { + "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-2011", + "v": "2011-2014" + }, { + "n": "更早", + "v": "-2010" + }] + }, { + "key": "status", + "name": "全部规格", + "value": [{ + "n": "全部规格", + "v": "" + }, { + "n": "全网独播", + "v": "1" + }, { + "n": "优酷自制", + "v": "2" + }, { + "n": "已完结", + "v": "3" + }, { + "n": "即将上线", + "v": "4" + }, { + "n": "短剧", + "v": "5" + }] + }, { + "key": "pay_type", + "name": "付费类型", + "value": [{ + "n": "付费类型", + "v": "" + }, { + "n": "免费", + "v": "0" + }, { + "n": "VIP", + "v": "2" + }, { + "n": "付费", + "v": "1" + }] + }, { + "key": "sort", + "name": "综合排序", + "value": [{ + "n": "综合排序", + "v": "" + }, { + "n": "热度最高", + "v": "7" + }, { + "n": "最新上线", + "v": "1" + }, { + "n": "最好评", + "v": "3" + }, { + "n": "最多播放", + "v": "2" + }] }] }, headers: { @@ -2129,8 +2334,8 @@ var rule = { 'Referer': 'https://www.youku.com', }, timeout: 5000, - class_name: '电视剧&电影&综艺&动漫&少儿&纪录片&文化&亲子&教育&搞笑&生活&体育&音乐&游戏', - class_url: '电视剧&电影&综艺&动漫&少儿&纪录片&文化&亲子&教育&搞笑&生活&体育&音乐&游戏', + class_name: '电影&电视剧&动漫&短剧&综艺&少儿&纪录片&文化&亲子&教育&搞笑&生活&体育&音乐&游戏', + class_url: '电影&电视剧&动漫&短剧&综艺&少儿&纪录片&文化&亲子&教育&搞笑&生活&体育&音乐&游戏', limit: 20, play_parse: true, lazy: $js.toString(() => { @@ -2194,10 +2399,14 @@ var rule = { } lists.forEach(function(it) { let vid; - if (it.videoLink.includes("id_")) { + if (it.rightTagColor === "BLUE" && it.videoLink.includes("groupId=")) { + // 短剧格式:通过rightTagColor判断,提取groupId + let groupIdMatch = it.videoLink.match(/groupId=([^&]+)/); + vid = groupIdMatch && groupIdMatch[1] ? groupIdMatch[1] : "msearch:"; + } else if (it.videoLink.includes("id_")) { vid = it.videoLink.split("id_")[1].split(".html")[0] } else { - vid = "msearch:" + vid = "msearch:"; } d.push({ title: it.title, @@ -2212,6 +2421,7 @@ var rule = { } setResult(d); }), + 二级: $js.toString(() => { var d = []; VOD = {}; @@ -2234,7 +2444,6 @@ var rule = { }); let json = /__INITIAL_DATA__/.test(html) ? html.split("window.__INITIAL_DATA__ =")[1].split(";")[0] : "{}"; if (json === "{}") { - log("触发了优酷人机验证"); VOD.vod_pic = _img; VOD.vod_name = video_lists[0].title.replace(/(\d+)/g, ""); VOD.vod_content = "触发了优酷人机验证,本次未获取详情,但不影响播放(" + ourl + ")" @@ -2299,18 +2508,121 @@ var rule = { var d = []; let html = request(input); let json = JSON.parse(html); + + let searchKeyword = ''; + if (input.includes('keyword=')) { + searchKeyword = input.split('keyword=')[1].split('&')[0]; + searchKeyword = decodeURIComponent(searchKeyword); + } + + let titleFilterConfig = { + enabled: true, + keywords: ['精彩', '花絮', '预告', '晚会', '揭秘', '解说', '《', '解读', '动态漫', '9528', '杂谈', '十六部电影实验短片集', '片断', '公益', '音频'], + caseSensitive: false, + exactMatch: false + }; + + let contentFilterConfig = { + enabled: true, + keywords: ['游戏', '纪录片', '音频'], + caseSensitive: false, + exactMatch: false + }; + + let keywordMatchConfig = { + enabled: true, + matchType: 'contains', + caseSensitive: false + }; + json.pageComponentList.forEach(function(it) { if (it.hasOwnProperty("commonData")) { it = it.commonData; - d.push({ - title: it.titleDTO.displayName, + + let item = { + title: it.titleDTO.displayName || '', img: it.posterDTO.vThumbUrl, - desc: it.stripeBottom, - content: it.updateNotice + " " + it.feature, + desc: it.stripeBottom || '', + content: (it.updateNotice || '') + " " + (it.feature || ''), url: "https://search.youku.com/api/search?appScene=show_episode&showIds=" + it.showId + "&appCaller=h5" - }) + }; + + let titleFiltered = false; + if (titleFilterConfig.enabled && titleFilterConfig.keywords.length > 0) { + for (let keyword of titleFilterConfig.keywords) { + let titleText = item.title; + let filterKeyword = keyword; + + if (!titleFilterConfig.caseSensitive) { + titleText = titleText.toLowerCase(); + filterKeyword = filterKeyword.toLowerCase(); + } + + if (titleFilterConfig.exactMatch) { + if (titleText === filterKeyword) { + titleFiltered = true; + break; + } + } else { + if (titleText.includes(filterKeyword)) { + titleFiltered = true; + break; + } + } + } + } + + let contentFiltered = false; + if (contentFilterConfig.enabled && contentFilterConfig.keywords.length > 0) { + for (let keyword of contentFilterConfig.keywords) { + let contentText = item.content; + let filterKeyword = keyword; + + if (!contentFilterConfig.caseSensitive) { + contentText = contentText.toLowerCase(); + filterKeyword = filterKeyword.toLowerCase(); + } + + if (contentFilterConfig.exactMatch) { + if (contentText === filterKeyword) { + contentFiltered = true; + break; + } + } else { + if (contentText.includes(filterKeyword)) { + contentFiltered = true; + break; + } + } + } + } + + let keywordMatched = true; + if (keywordMatchConfig.enabled && searchKeyword) { + let titleText = item.title; + let searchKey = searchKeyword; + + if (!keywordMatchConfig.caseSensitive) { + titleText = titleText.toLowerCase(); + searchKey = searchKey.toLowerCase(); + } + + if (keywordMatchConfig.matchType === 'exact') { + keywordMatched = (titleText === searchKey); + } else if (keywordMatchConfig.matchType === 'contains') { + keywordMatched = titleText.includes(searchKey); + } else if (keywordMatchConfig.matchType === 'any') { + let keywords = searchKey.split(/\s+/); + keywordMatched = keywords.some(keyword => titleText.includes(keyword)); + } + } + + if (!titleFiltered && !contentFiltered && keywordMatched) { + d.push(item); + } } }); - setResult(d) + + setResult(d); }), } \ No newline at end of file diff --git a/js/xiaosa/js/腾讯视频.js b/js/xiaosa/js/腾讯视频.js index f44abe553..49119688e 100755 --- a/js/xiaosa/js/腾讯视频.js +++ b/js/xiaosa/js/腾讯视频.js @@ -9,8 +9,7 @@ var rule = { filterable: 1, multi: 1, url: '/x/bu/pagesheet/list?_all=1&append=1&channel=fyclass&listpage=1&offset=((fypage-1)*21)&pagesize=21&iarea=-1', - filter_url: 'sort={{fl.sort or 75}}&iyear={{fl.iyear}}&year={{fl.year}}&itype={{fl.type}}&ifeature={{fl.feature}}&iarea={{fl.area}}&itrailer={{fl.itrailer}}&gender={{fl.sex}}', - filter_url: 'sort={{fl.sort or 75}}&iyear={{fl.iyear}}&year={{fl.year}}&itype={{fl.type}}&ifeature={{fl.feature}}&iarea={{fl.area}}&itrailer={{fl.itrailer}}&gender={{fl.sex}}', + filter_url: 'sort={{fl.sort or 75}}&iyear={{fl.iyear}}&year={{fl.year}}&itype={{fl.type}}&ifeature={{fl.feature}}&iarea={{fl.area}}&itrailer={{fl.itrailer}}&gender={{fl.sex}}&prefer={{fl.prefer}}&identity={{fl.identity}}&attraction={{fl.attraction}}&story={{fl.story}}', filter: { "choice": [{ "key": "sort", @@ -648,6 +647,59 @@ var rule = { "n": "旅游", "v": "11" }] + }], + "mini_series": [{ + "key": "prefer", + "name": "频道", + "value": [{ + "n": "全部", + "v": "" + }, { + "n": "女频", + "v": "1" + }, { + "n": "男频", + "v": "2" + }] + }, { + "key": "identity", + "name": "身份", + "value": [{ + "n": "全部", + "v": "" + }, { + "n": "总裁", + "v": "1" + }, { + "n": "大女主", + "v": "2" + }, { + "n": "萌娃", + "v": "4" + }] + }, { + "key": "attraction", + "name": "看点", + "value": [{ + "n": "全部", + "v": "" + }, { + "n": "先婚后爱", + "v": "1" + }, { + "n": "颜值逆袭", + "v": "45" + }] + }, { + "key": "story", + "name": "题材", + "value": [{ + "n": "全部", + "v": "" + }, { + "n": "都市奇幻", + "v": "3" + }] }] }, headers: { @@ -655,8 +707,8 @@ var rule = { }, timeout: 5000, cate_exclude: '会员|游戏|全部', - class_name: '精选&电影&电视剧&综艺&动漫&少儿&纪录片', - class_url: 'choice&movie&tv&variety&cartoon&child&doco', + class_name: '电影&电视剧&短剧&综艺&动漫&少儿&纪录片', + class_url: 'movie&tv&mini_series&variety&cartoon&child&doco', limit: 20, play_parse: true, lazy: $js.toString(() => { @@ -671,7 +723,7 @@ var rule = { parse: 0, url: bata.url, jx: 0, - danmaku: 'http://127.0.0.1:9978/proxy?do=danmu&site=js&url=' + input.split("?")[0] + danmaku: "http://127.0.0.1:9978/proxy?do=danmu&site=js&url=" + input.split("?")[0] }; } else { input = { @@ -681,7 +733,7 @@ var rule = { parse: 0, url: input.split("?")[0], jx: 1, - danmaku: 'http://127.0.0.1:9978/proxy?do=danmu&site=js&url=' + input.split("?")[0] + danmaku: "http://127.0.0.1:9978/proxy?do=danmu&site=js&url=" + input.split("?")[0] }; } } catch { @@ -692,13 +744,188 @@ var rule = { parse: 0, url: input.split("?")[0], jx: 1, - danmaku: 'http://127.0.0.1:9978/proxy?do=danmu&site=js&url=' + input.split("?")[0] + danmaku: "http://127.0.0.1:9978/proxy?do=danmu&site=js&url=" + input.split("?")[0] }; } }), 推荐: '.list_item;img&&alt;img&&src;a&&Text;a&&data-float', - 一级: '.list_item;img&&alt;img&&src;a&&Text;a&&data-float', + 一级: $js.toString(() => { + let d = []; + let fyclass = MY_CATE; + let fypage = MY_PAGE; + let fl = MY_FL; + + // 短剧分类特殊处理 + if (fyclass === 'mini_series') { + let apiUrl = 'https://pbaccess.video.qq.com/trpc.vector_layout.page_view.PageService/getPage?video_appid=3000010&vversion_platform=2'; + + // 构建筛选条件 + let filterParts = []; + if (fl.prefer) filterParts.push('prefer=' + fl.prefer); + if (fl.identity) filterParts.push('identity=' + fl.identity); + if (fl.attraction) filterParts.push('attraction=' + fl.attraction); + if (fl.story) filterParts.push('story=' + fl.story); + let filterValue = filterParts.length > 0 ? filterParts.join('&') : 'sort=75'; + + // 获取或初始化分页上下文 + let pageContext = null; + let cacheKey = 'mini_series_ctx_' + filterValue; + + if (fypage > 1) { + try { + let cachedContext = storage0.getItem(cacheKey); + if (cachedContext) { + let contextObj = JSON.parse(cachedContext); + if (contextObj.page === fypage - 1 && contextObj.nextContext) { + pageContext = contextObj.nextContext; + } else if (fypage === 1) { + pageContext = null; + } + } + } catch (e) { + log('读取缓存失败: ' + e.message); + } + } else { + // 第一页清除缓存 + try { + storage0.setItem(cacheKey, ''); + } catch (e) {} + } + + let requestBody = { + "page_params": { + "page_type": "channel", + "page_id": "120188", + "scene": "channel", + "new_mark_label_enabled": "1", + "vl_to_mvl": "1", + "free_watch_trans_info": "{\"ad_frequency_control_time_list\":{}}", + "ad_exp_ids": "100000", + "skip_privacy_types": "0", + "support_click_scan": "1" + }, + "page_bypass_params": { + "params": { + "platform_id": "2", + "caller_id": "3000010", + "data_mode": "default", + "user_mode": "default", + "page_type": "channel", + "page_id": "120188", + "scene": "channel", + "new_mark_label_enabled": "1" + }, + "scene": "channel", + "app_version": "" + }, + "page_context": pageContext + }; + + // 如果有筛选条件,添加filter_value + if (filterParts.length > 0) { + requestBody.page_bypass_params.params.filter_value = filterValue; + } + + try { + let html = request(apiUrl, { + body: JSON.stringify(requestBody), + headers: { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36', + 'Content-Type': 'application/json', + 'Origin': 'https://v.qq.com', + 'Referer': 'https://v.qq.com/channel/mini_series' + }, + method: 'POST' + }); + + let json = JSON.parse(html); + + if (json.ret === 0 && json.data && json.data.CardList) { + // 保存下一页的上下文 + if (json.data.has_next_page && json.data.page_context) { + try { + storage0.setItem(cacheKey, JSON.stringify({ + page: fypage, + nextContext: json.data.page_context + })); + } catch (e) { + log('保存缓存失败: ' + e.message); + } + } + + // 解析视频列表 + json.data.CardList.forEach(function(card) { + // 处理筛选卡片(跳过) + if (card.type === 'pc_hot_filter') { + return; + } + + // 处理视频列表卡片 + if (card.type === '_eco_video_staggered' && card.children_list && card.children_list.card_list) { + let cards = card.children_list.card_list.cards || []; + cards.forEach(function(item) { + if (item.type === '_eco_video_staggered_drama_item' && item.params) { + let params = item.params; + let cid = params.cid || ''; + let posterInfo = {}; + let markInfo = {}; + + try { + posterInfo = JSON.parse(params.poster || '{}'); + } catch (e) {} + + try { + markInfo = JSON.parse(params.mark_label_list || '{}'); + } catch (e) {} + + let title = posterInfo.title || ''; + let img = posterInfo.image_url || ''; + let remarks = ''; + + if (markInfo.mark_label_list && markInfo.mark_label_list.length > 0) { + remarks = markInfo.mark_label_list[0].prime_text || ''; + } + + if (cid && title) { + d.push({ + title: title, + img: img, + desc: remarks, + url: cid + }); + } + } + }); + } + }); + } + } catch (e) { + log('短剧请求失败: ' + e.message); + } + + setResult(d); + } else { + // 其他分类使用原有的HTML解析逻辑 + let html = fetch(input, fetch_params); + let $ = pdfa(html, '.list_item'); + $.forEach(function(it) { + let item = pdfh(it, 'a&&data-float'); + let title = pdfh(it, 'img&&alt'); + let img = pdfh(it, 'img&&src'); + let desc = pdfh(it, 'a&&Text'); + if (item && title) { + d.push({ + title: title, + img: img, + desc: desc, + url: item + }); + } + }); + setResult(d); + } + }), 二级: $js.toString(() => { VOD = {}; let d = []; @@ -866,7 +1093,7 @@ var rule = { } const nonMainContentKeywords = [ - ':', '#', '特辑', '“', '剪辑', '片花', '独家', '专访', '纯享', + ':', '#', '特辑', '"', '剪辑', '片花', '独家', '专访', '纯享', '制作', '幕后', '宣传', 'MV', '主题曲', '插曲', '彩蛋', '精彩', '集锦', '盘点', '回顾', '解说', '评测', '反应', 'reaction' ]; @@ -878,7 +1105,7 @@ var rule = { } function isQQPlatform(playSites) { - if (!playSites || !Array.isArray(playSites)) return true; // 如果没有平台信息,默认保留 + if (!playSites || !Array.isArray(playSites)) return true; return playSites.some(site => site.enName && site.enName.toLowerCase() === 'qq'); } @@ -893,7 +1120,7 @@ var rule = { if (it.doc && it.doc.id && it.videoInfo && isMainContent(it.videoInfo.title) && isQQPlatform(it.videoInfo.playSites) && - Object.keys(it.videoInfo.episodeSites || {}).length > 0) { // ← 新增条件:episodeSites 不为空对象 + Object.keys(it.videoInfo.episodeSites || {}).length > 0) { const itemId = it.doc.id; if (!seenIds.has(itemId)) { @@ -925,5 +1152,4 @@ var rule = { setResult(d); }) - }; \ No newline at end of file diff --git a/js/xiaosa/spider.jar b/js/xiaosa/spider.jar index 21c5266ce..3404bfe68 100755 Binary files a/js/xiaosa/spider.jar and b/js/xiaosa/spider.jar differ