From d36339b5a7630ebebad2e72f9f16a952b3678241 Mon Sep 17 00:00:00 2001 From: gyjune Date: Mon, 25 Aug 2025 13:35:05 +0800 Subject: [PATCH] s --- lib/bh.js | 235 ++++-------------------------------------------------- 1 file changed, 17 insertions(+), 218 deletions(-) diff --git a/lib/bh.js b/lib/bh.js index 1f1a958..7aeb64a 100644 --- a/lib/bh.js +++ b/lib/bh.js @@ -1,223 +1,22 @@ var rule = { - title: '八号影视', - host: 'https://www.bahaotv.com', - url: '/vodshow/fyclass--------fypage---.html', - searchUrl: '/so.html?wd=**', + title: '影视规则', + 编码: 'utf-8', + homeUrl: '/', + url: '/fyclass/fypage.html', + detailUrl: '/voddetail/fyid.html', + class_name: '电影&电视剧&动漫&综艺', + class_url: '1&2&3&4', + class_parse: '#side-menu:lt(1) li;a&&Text;a&&href;com/(.*?)/', + 推荐: '.video-list .item;a&&Text;img&&src;.actor&&Text;a&&href', + 一级: '.video-list .item;a&&Text;img&&src;.actor&&Text;a&&href', + 二级: '*', + searchUrl: '/search.php?searchword=**&page=fypage', searchable: 2, - quickSearch: 0, - filterable: 0, - headers: { - 'User-Agent': 'MOBILE_UA' - }, + quickSearch: 1, + headers: {"User-Agent":"MOBILE_UA","Cookie":"searchneed=ok"}, timeout: 5000, - - // 分类配置 - class_name: '电影&电视剧&动漫', - class_url: 'movie&tvseries&anime', - - // 推荐内容 - 首页和详情页猜你喜欢 - 推荐: `js: - let html = request(input); - let data = []; - let items = pdfa(html, '.card-box&&.content-card'); - items.forEach(item => { - data.push({ - title: pdfh(item, '.title&&Text'), - img: pdfh(item, '.cover-img&&img&&data-original'), - desc: pdfh(item, '.role&&Text'), - url: pdfh(item, 'a&&href') - }); - }); - setResult(data); - `, - - // 一级内容 - 分类列表页 - 一级: `js: - let html = request(input); - let data = []; - let items = pdfa(html, '.card-box&&.content-card'); - items.forEach(item => { - data.push({ - title: pdfh(item, '.title&&Text'), - img: pdfh(item, '.cover-img&&img&&data-original'), - desc: pdfh(item, '.role&&Text'), - url: pdfh(item, 'a&&href') - }); - }); - setResult(data); - `, - - // 二级内容 - 详情页 - 二级: { - title: `js: - pdfh(html, 'h1.title&&Text') || pdfh(html, '.title-box&&h1&&Text') - `, - img: `js: - pdfh(html, '.img-box&&img&&data-original') || pdfh(html, '.vod-detailll&&img&&data-original') - `, - desc: `js: - let director = pdfh(html, '.director:contains("导演")&&Text').replace('导演:', '').trim(); - let actors = pdfh(html, '.director:contains("主演")&&Text').replace('主演:', '').trim(); - let alias = pdfh(html, '.roles:contains("别名")&&Text').replace('别名:', '').trim(); - let score = pdfh(html, '.score&&Text'); - let hits = pdfh(html, '.hot-num&&Text'); - - // 格式化描述信息 - let desc = ''; - if (director) desc += '导演: ' + director + ';;'; - if (actors) desc += '主演: ' + actors + ';;'; - if (alias) desc += '别名: ' + alias + ';;'; - if (score) desc += '评分: ' + score + ';;'; - if (hits) desc += '热度: ' + hits; - - desc; - `, - content: `js: - pdfh(html, '.intro&&Text') || pdfh(html, '.vod-content&&.intro&&Text') - `, - tabs: `js: - let tabs = []; - let tabElements = pdfa(html, '.player_name'); - tabElements.forEach(tab => { - tabs.push(pdfh(tab, 'a&&Text')); - }); - tabs; - `, - lists: `js: - let playList = []; - let tabPanes = pdfa(html, '.tab-pane'); - - tabPanes.forEach((pane, index) => { - let episodes = []; - let episodeElements = pdfa(pane, '.listitem'); - - episodeElements.forEach(ep => { - episodes.push({ - name: pdfh(ep, 'a&&Text'), - url: pdfh(ep, 'a&&href') - }); - }); - - if (episodes.length > 0) { - playList.push(episodes); - } - }); - - JSON.stringify(playList); - ` - }, - - // 搜索功能 - 搜索: `js: - let html = request(input); - let data = []; - let items = pdfa(html, '.vod-list&&li'); - - items.forEach(item => { - data.push({ - title: pdfh(item, '.title&&Text'), - img: pdfh(item, '.pic&&img&&data-original'), - desc: pdfh(item, '.desc&&Text'), - url: pdfh(item, 'a&&href') - }); - }); - - setResult(data); - `, - - // 播放地址解析 play_parse: true, - lazy: `js: - let html = request(input); - let playUrl = ''; - - // 尝试多种方式提取播放地址 - let patterns = [ - /player_aaaa.*?url.*?['"]([^'"]+)['"]/, - /video_url.*?['"]([^'"]+)['"]/, - /src.*?['"]([^'"]+\.m3u8[^'"]*)['"]/, - /file.*?['"]([^'"]+\.m3u8[^'"]*)['"]/ - ]; - - for (let pattern of patterns) { - let match = html.match(pattern); - if (match && match[1]) { - playUrl = match[1]; - break; - } - } - - // 如果没有找到播放地址,返回原始输入 - playUrl || input; - `, - - // 详情页预处理 - 详情: `js: - let html = request(input); - - // 移除广告和干扰元素 - const removeSelectors = [ - 'ins', - 'script', - '.google-auto-placed', - '.adsbygoogle', - '.ad-container', - '#theme-switcher', - '.side-top' - ]; - - removeSelectors.forEach(selector => { - let elements = pdfa(html, selector); - elements.forEach(el => { - html = html.replace(pdfh(el, '&&outerHtml'), ''); - }); - }); - - html; - `, - - // 分类解析 - class_parse: `js: - let html = request(HOST); - let classes = []; - - // 解析导航菜单中的分类 - let navItems = pdfa(html, '.menu&&a.nav'); - navItems.forEach(item => { - let text = pdfh(item, '&&Text'); - let href = pdfh(item, '&&href'); - - if (text && href && !text.includes('首页')) { - let match = href.match(/\/vodshow\/([^\/]+)/); - if (match) { - classes.push({ - type_name: text, - type_id: match[1] - }); - } - } - }); - - // 确保有默认分类 - if (classes.length === 0) { - classes = [ - {type_name: '电影', type_id: 'movie'}, - {type_name: '电视剧', type_id: 'tvseries'}, - {type_name: '动漫', type_id: 'anime'} - ]; - } - - JSON.stringify(classes); - `, - - // 预处理函数 - before: function(html) { - // 基础清理 - html = html.replace(/]*>.*?<\/ins>/gs, ''); - html = html.replace(/]*>.*?<\/script>/gs, ''); - html = html.replace(/