From 1ac436d7224a72a24a430ae45d71a07b466520af Mon Sep 17 00:00:00 2001 From: gyjune <13759589+gyjune@user.noreply.gitee.com> Date: Mon, 25 Aug 2025 04:42:37 +0000 Subject: [PATCH] sdf d Signed-off-by: gyjune <13759589+gyjune@user.noreply.gitee.com> --- lib/bh.js | 223 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 223 insertions(+) create mode 100644 lib/bh.js diff --git a/lib/bh.js b/lib/bh.js new file mode 100644 index 0000000..1f1a958 --- /dev/null +++ b/lib/bh.js @@ -0,0 +1,223 @@ +var rule = { + title: '八号影视', + host: 'https://www.bahaotv.com', + url: '/vodshow/fyclass--------fypage---.html', + searchUrl: '/so.html?wd=**', + searchable: 2, + quickSearch: 0, + filterable: 0, + headers: { + 'User-Agent': 'MOBILE_UA' + }, + 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(/