const axios = require('axios'); const querystring = require('querystring'); const host = "https://mov.cenguigui.cn"; const base_url = host + "/duanju/api.php"; const quality_host = "https://mov.cenguigui.cn"; const headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36' }; const timeout = 10000; class Spider { constructor() { // 模拟Python类的初始化 } getName() { return "小心儿悠悠"; } init(extend) { // pass } isVideoFormat(url) { // pass } manualVideoCheck() { // pass } async homeContent(filter) { const class_names = "推荐榜&热播榜&新剧榜&漫剧榜大唐&大秦&大明&擦边&逆袭&霸总&豪门恩怨&神豪&都市日常&大女主&都市修仙&强者回归&重生&闪婚&赘婿逆袭&追妻&萌宝&奇幻脑洞&传承觉醒&奇幻爱情&乡村&历史古代&王妃&娱乐圈&暗恋成真&系统&真假千金&穿书&女帝&团宠&年代爱情&玄幻仙侠&皇后&逆袭&霸总&现代言情&打脸虐渣&豪门恩怨&神豪&马甲&都市日常&战神归来&小人物&女性成长&大女主&穿越&都市修仙&强者回归&亲情&古装&重生&闪婚&赘婿逆袭&虐恋&追妻&天下无敌&家庭伦理&萌宝&古风权谋&职场&奇幻脑洞&异能&无敌神医&古风言情&传承觉醒&现言甜宠&奇幻爱情&乡村&历史古代&王妃&高手下山&娱乐圈&强强联合&破镜重圆&暗恋成真&民国&欢喜冤家&系统&真假千金&龙王&校园&穿书&女帝&团宠&年代爱情&玄幻仙侠&青梅竹马&悬疑推理&皇后&替身&大叔&喜剧&剧情"; const class_list = class_names.split('&'); const classes = class_list.map(class_name => ({ type_id: class_name, type_name: class_name })); return { class: classes }; } async homeVideoContent() { return { list: [] }; } async categoryContent(cid, pg, filter, ext) { const page = parseInt(pg) || 1; let params = `page=${page}&name=${encodeURIComponent(cid)}`; let tab_type = "19"; if (ext && ext.tab_type) { tab_type = ext.tab_type; } params += `&tab_type=${tab_type}`; const url = `${base_url}?${params}`; try { const response = await axios.get(url, { headers, timeout }); if (response.status !== 200) { return { list: [] }; } const data = response.data; if (data.code === 200 && data.data) { const videos = data.data.map(vod => ({ vod_id: `book_id=${vod.book_id || ''}&actor=${vod.author || ''}&type=${vod.type || ''}`, vod_name: vod.title || '', vod_pic: vod.cover || '', vod_remarks: vod.type || '', vod_content: vod.intro || '' })); return { list: videos, page: pg, pagecount: 9999, limit: 20, total: 999999 }; } return { list: [] }; } catch (error) { console.error('categoryContent error:', error); return { list: [] }; } } async detailContent(ids) { let did = ids[0]; let params = {}; let queryString = did.includes('?') ? did.split('?')[1] : did; const pairs = queryString.split('&'); for (const pair of pairs) { const [key, value] = pair.split('='); if (key && value) { params[key] = value; } } let book_id = params.book_id || ''; const actor = params.actor || ''; const fullType = params.type || ''; if (!book_id) { const match = did.match(/book_id=([^&]*)/); if (match && match[1]) { book_id = match[1]; } } if (!book_id) { return { list: [] }; } const apiUrl = `${base_url}?book_id=${book_id}`; try { const response = await axios.get(apiUrl, { headers, timeout }); if (response.status !== 200) { return { list: [] }; } const data = response.data; if (data.code === 200 && data.data) { const vod_list = data.data; const play_from = []; const play_url = []; const quality_options = [ ["超清", "2160p"], ["高清", "1080p"], ["标清", "720p"], ["低清", "480p"], ["流畅", "360p"] ]; for (const [quality_name, quality_value] of quality_options) { const urls = vod_list.map(item => { const chapterName = item.title || ''; const videoId = item.video_id || ''; const playUrl = `${quality_host}/duanju/api.php?video_id=${videoId}&type=json&level=${quality_value}`; return `${chapterName}$${playUrl}`; }); play_from.push(quality_name); play_url.push(urls.join('#')); } let actors = []; try { const actor_api_url = `${base_url}?series_id=${book_id}&showRawParams=false`; const actor_response = await axios.get(actor_api_url, { headers, timeout }); if (actor_response.status === 200) { const actor_data = actor_response.data; if (actor_data.code === 200 && actor_data.celebrities) { const celebrities = actor_data.celebrities; if (Array.isArray(celebrities)) { for (const celeb of celebrities) { const actor_name = celeb.user_name || celeb.name || celeb.actor_name || ''; if (actor_name && actor_name.trim() && !actors.includes(actor_name)) { actors.push(actor_name); } } } } } } catch (error) { console.error('获取演员信息失败:', error); } if (actor) { actors = [actor]; } const actor_str = actors.length > 0 ? actors.join(', ') : (actor || ''); let categories = []; if (data.category_names && Array.isArray(data.category_names)) { categories = data.category_names.slice(0, 3); } else if (data.category) { categories = [data.category]; } const type_str = categories.length > 0 ? categories.join(', ') : ''; const remarks_str = `共${vod_list.length}集`; const content_str = data.desc || ''; const VOD = { vod_id: did, vod_name: data.book_name || '', vod_pic: data.book_pic || '', vod_actor: actor_str, type_name: type_str || fullType, vod_remarks: remarks_str, vod_content: content_str, vod_play_from: play_from.join('$$$'), vod_play_url: play_url.join('$$$') }; return { list: [VOD] }; } else { return { list: [] }; } } catch (error) { console.error('获取详情失败:', error); return { list: [] }; } } async playerContent(flag, id, vipFlags) { const max_retries = 3; let lastError = null; for (let i = 0; i < max_retries; i++) { try { const response = await axios.get(id, { headers, timeout }); if (response.status === 200) { const data = response.data; if (data.code === 200 && data.data) { const play_url = data.data.url || ''; if (play_url) { return { parse: 0, playUrl: '', url: play_url, header: headers }; } } } break; } catch (error) { lastError = error; if (i < max_retries - 1) { continue; } else { break; } } } return { parse: 0, playUrl: '', url: 'about:blank', header: headers }; } async searchContent(key, quick, pg = 1) { const page = parseInt(pg) || 1; const params = `page=${page}&name=${encodeURIComponent(key)}&tab_type=19`; const search_url = `${base_url}?${params}`; try { const response = await axios.get(search_url, { headers, timeout }); if (response.status !== 200) { return { list: [] }; } const data = response.data; if (data.code !== 200 || !data.data) { return { list: [] }; } const videos = data.data.map(vod => ({ vod_id: `book_id=${vod.book_id || ''}&actor=${vod.author || ''}&type=${vod.type || ''}`, vod_name: vod.title || '', vod_pic: vod.cover || '', vod_remarks: vod.type || '', vod_content: vod.intro || '' })); return { list: videos, page: page, pagecount: 9999, limit: videos.length, total: 999999 }; } catch (error) { console.error('searchContent error:', error); return { list: [] }; } } } module.exports = Spider;