193 lines
6.1 KiB
JavaScript
193 lines
6.1 KiB
JavaScript
//本资源来源于互联网公开渠道,仅可用于个人学习爬虫技术。
|
||
//严禁将其用于任何商业用途,下载后请于 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
|
||
};
|
||
} |