Files
2026-06-29 03:41:14 +00:00

193 lines
6.1 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
//本资源来源于互联网公开渠道,仅可用于个人学习爬虫技术。
//严禁将其用于任何商业用途,下载后请于 24 小时内删除,搜索结果均来自源站,本人不承担任何责任。
let host = '';
const tab = new Set(['泰剧','日剧','美剧','台剧']);
const headers = {
'User-Agent': 'okhttp-okgo/jeasonlzy',
'Connection': 'Keep-Alive',
'Accept-Language': 'zh-CN,zh;q=0.8'
};
async function init(cfg) {
let ext = cfg.ext;
if (typeof ext === 'string' && ext.startsWith('http')) {
host = ext;
}
}
async function home(filter) {
if (!host) return JSON.stringify({ class: [] });
const resp = await req(`${host}/v3/type/top_type`, {
method: 'post',
data: payload(),
postType: 'form',
headers: headers
});
const json = JSON.parse(resp.content);
let classes = [];
for (const i of json.data.list) {
if (!tab.has(i.type_name)) {
classes.push({
'type_id': i.type_id.toString(),
'type_name': i.type_name
});
}
}
return JSON.stringify({ class: classes });
}
async function homeVod() {
if (!host) return JSON.stringify({ list: [] });
const resp = await req(`${host}/v3/type/tj_vod`, {
method: 'post',
data: payload({ '': '' }),
postType: 'form',
headers: headers
});
const data = JSON.parse(resp.content).data;
let videos = [];
videos.push(...arr2vods(data.cai || []));
videos.push(...arr2vods(data.loop || []));
for (const i of (data.type_vod || [])) {
if (!tab.has(i.type_name)) {
videos.push(...arr2vods(i.vod || []));
}
}
return JSON.stringify({ list: videos });
}
async function category(tid, pg, filter, extend) {
if (!host) return JSON.stringify({ list: [] });
const resp = await req(`${host}/v3/home/type_search`, {
method: 'post',
data: payload({ 'type_id': tid.toString(), 'page': pg.toString() }),
postType: 'form',
headers: headers
});
const json = JSON.parse(resp.content);
return JSON.stringify({list: arr2vods(json.data.list), page: parseInt(pg)});
}
async function search(wd, quick, pg) {
if (!host) return JSON.stringify({ list: [] });
const resp = await req(`${host}/v3/home/search`, {
method: 'post',
data: payload({ 'keyword': wd }),
postType: 'form',
headers: headers
});
const json = JSON.parse(resp.content);
let videos = arr2vods(json.data.list);
return JSON.stringify({ list: videos, page: parseInt(pg || '1') });
}
async function detail(id) {
if (!host) return JSON.stringify({ list: [] });
const resp = await req(`${host}/v3/home/vod_details`, {
method: 'post',
data: payload({ 'vod_id': id.toString() }),
postType: 'form',
headers: headers
});
const data = JSON.parse(resp.content).data;
let shows = [];
let play_urls = [];
for (const i of data.vod_play_list) {
const parses = i.parse_urls.join(',');
let urls = [];
for (const j of i.urls) {
urls.push(`${j.name}$${j.url}@${parses}@${i.ua || ''}@${i.referer || ''}`);
}
play_urls.push(urls.join('#'));
let name = (i.title || i.name || '').replace(/[\(](?:点击|换)[^)]*[\)]|[Z▶❤【].*/g, '');
if (name === i.flag) {
shows.push(name);
} else {
shows.push(`${name}(${i.flag})`);
}
}
const video = {
'vod_id': data.vod_id.toString(),
'vod_name': data.vod_name,
'vod_pic': data.vod_pic || data.vod_pic_thumb,
'vod_remarks': data.vod_remarks,
'vod_year': data.vod_year,
'vod_area': data.vod_area,
'vod_actor': data.vod_actor,
'vod_director': data.vod_director,
'vod_content': data.vod_content,
'vod_play_from': shows.join('$$$'),
'vod_play_url': play_urls.join('$$$'),
'type_name': data.vod_class
};
return JSON.stringify({ list: [video] });
}
async function play(flag, id, flags) {
const parts = id.split('@');
const raw_url = parts[0];
const parses = parts[1] ? parts[1].split(',') : [];
const ua = parts[2] || '';
const referer = parts[3] || '';
let play_headers = {};
if (ua) play_headers['User-Agent'] = ua;
if (referer) play_headers['Referer'] = referer;
let final_url = '';
let jx = 0;
for (const parse of parses) {
if (parse.startsWith('http')) {
try {
const res = await req(parse + raw_url, { headers: headers });
const json = JSON.parse(res.content);
if (json.url && json.url.startsWith('http')) {
final_url = json.url;
break;
}
} catch (e) {}
}
}
if (!final_url && raw_url.startsWith('http')) {
final_url = raw_url;
if (/(?:www\.iqiyi|v\.qq|v\.youku|www\.mgtv|www\.bilibili)\.com/.test(raw_url)) {
jx = 1;
}
}
return JSON.stringify({parse: jx, url: final_url, header: play_headers});
}
function arr2vods(arr) {
let videos = [];
for (const i of arr) {
try {
if(i.vod_name !== '首页轮播'){
videos.push({
'vod_id': i.vod_id.toString(),
'vod_name': i.vod_name,
'vod_pic': i.vod_pic || i.vod_pic_thumb,
'vod_remarks': i.vod_remarks,
'type_name': i.type_name,
'vod_year': i.vod_year
});
}
} catch (e) {}
}
return videos;
}
function payload(arr = {}) {
const timestamp = Math.floor(Date.now() / 1000).toString();
const sign = md5X('7gp0bnd2sr85ydii2j32pcypscoc4w6c7g5spl' + timestamp);
return {...arr, 'sign': sign, 'timestamp': timestamp};
}
export function __jsEvalReturn() {
return {
init: init,
home: home,
homeVod: homeVod,
category: category,
search: search,
detail: detail,
play: play
};
}