s
This commit is contained in:
@@ -1,223 +1,22 @@
|
|||||||
var rule = {
|
var rule = {
|
||||||
title: '八号影视',
|
title: '影视规则',
|
||||||
host: 'https://www.bahaotv.com',
|
编码: 'utf-8',
|
||||||
url: '/vodshow/fyclass--------fypage---.html',
|
homeUrl: '/',
|
||||||
searchUrl: '/so.html?wd=**',
|
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,
|
searchable: 2,
|
||||||
quickSearch: 0,
|
quickSearch: 1,
|
||||||
filterable: 0,
|
headers: {"User-Agent":"MOBILE_UA","Cookie":"searchneed=ok"},
|
||||||
headers: {
|
|
||||||
'User-Agent': 'MOBILE_UA'
|
|
||||||
},
|
|
||||||
timeout: 5000,
|
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,
|
play_parse: true,
|
||||||
lazy: `js:
|
play_json: [{"re":"*","json":{"jx":1,"parse":1}}],
|
||||||
let html = request(input);
|
double: true,
|
||||||
let playUrl = '';
|
limit: 6,
|
||||||
|
|
||||||
// 尝试多种方式提取播放地址
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
Reference in New Issue
Block a user