This commit is contained in:
2025-08-25 13:35:05 +08:00
parent 02614fcd16
commit d36339b5a7
+17 -218
View File
@@ -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[^>]*>.*?<\/ins>/gs, '');
html = html.replace(/<script[^>]*>.*?<\/script>/gs, '');
html = html.replace(/<div class="google-auto-placed[^>]*>.*?<\/div>/gs, '');
html = html.replace(/onclick="[^"]*"/g, '');
html = html.replace(/onerror="[^"]*"/g, '');
return html;
}
play_json: [{"re":"*","json":{"jx":1,"parse":1}}],
double: true,
limit: 6,
};