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

32 lines
9.3 KiB
JavaScript
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
//本资源来源于互联网公开渠道,仅可用于个人学习爬虫技术。
//严禁将其用于任何商业用途,下载后请于 24 小时内删除,搜索结果均来自源站,本人不承担任何责任。
let e={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",Connection:"Keep-Alive","Accept-Language":"zh-CN,zh;q=0.8","Cache-Control":"no-cache"},t=5e3,i=2,a=0,s=1,r={},l={},n={},o={},p=[],c="",f="",h="",d="",u="";async function g(l){let p=l.ext||"";if("string"==typeof p&&p.startsWith("http"))c=p;else if("object"==typeof p)try{c=p.host,d=p.key||"",u=p.sign||"",i=p.ver||2,h=(p.cms||"").replace(/\/$/,""),/^https?:\/\/.*\/vod/.test(h)&&(h+=h.includes("?")?"&":"?"),f=p.from||"",o=p.parse||{},a=p.custom_first||0,s=void 0!==p.category?p.category:1;let l=p.ua;l&&("string"==typeof l?e["User-Agent"]=l:"object"==typeof l&&(r={host:l.host,config:l.config,home:l.home,category:l.category,search:l.search,parse:l.parse,player:l.player})),t=1e3*(p.timeout||5)}catch(e){}if(!/^https?:\/\/[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*(:\d+)?(\/)?$/.test(c)){let i=Object.assign({},e);r.host&&(i["User-Agent"]=r.host);let a=await req(c,{headers:i,timeout:t});try{let e=JSON.parse(a.content);e.apiDomain&&(c=e.apiDomain)}catch(e){let t=(a.content||"").trim();t.startsWith("http")&&(c=t)}}c=c.replace(/\/$/,"");let g=d&&u;if(3!==i||g)g&&(i=3);else{let e=O();r.config&&(e["User-Agent"]=r.config);let i=(await S(`${c}/api.php/Appfox/config`,{headers:e,timeout:t})).data||{};i.app_key&&i.app_sign&&(d=i.app_key,u=i.app_sign);let a=i.playerList||[],s=i.jiexiDataList||[];a.length>0&&(n={playerList:a,jiexiDataList:s})}}async function y(i){if(!c||0===s)return JSON.stringify({class:[]});let a=Object.assign({},e);r.home&&(a["User-Agent"]=r.home);let l=[],n={},o={class:l,filters:n};if(h&&2!==s){let e=h.replace(/&$/,"");e=e.replace(/&ac=videolist/g,"").replace(/ac=videolist&/g,"").replace(/ac=videolist/g,""),e=e.replace("ac=detail","ac=list");let i=await S(e,{headers:a,timeout:t});i&&i.class&&(l=i.class),o=await S(h.replace(/&$/,""),{headers:a,timeout:t})||{},o.class=l,2===s&&o.list&&o.list.forEach((e=>e.vod_id=`msearch:${e.vod_id}`))}else{let e=await S(`${c}/api.php/Appfox/init`,{headers:a,timeout:t});e&&e.data&&e.data.type_list&&e.data.type_list.forEach((e=>{let t=String(e.type_id);if(l.push({type_id:t,type_name:e.type_name}),i&&e.filter_type_list&&e.filter_type_list.length>0){let i=[];e.filter_type_list.forEach((e=>{let t=e.name;switch(e.name){case"class":t="类型";break;case"area":t="地区";break;case"lang":t="语言";break;case"year":t="年份";break;case"sort":t="排序"}let a=[],s="";e.list.forEach((e=>{e&&a.push({n:e,v:e})})),a.length>0&&(s="sort"===e.name&&e.list.includes("最新")?"最新":e.list.includes("全部")?"全部":a[0].v,i.push({key:e.name,name:t,init:s,value:a}))})),i.length>0&&(n[t]=i)}})),o.class=l,o.filters=n}return JSON.stringify(o)}async function m(){if(!c||0===s)return JSON.stringify({list:[]});if(h&&2!==s)return JSON.stringify({list:[]});let a=Object.assign({},e);(r.homeVideo||r.home)&&(a["User-Agent"]=r.homeVideo||r.home);let l="index";if(2===i||3===i){let e=await S(`${c}/api.php/appfox/nav`,{headers:a,timeout:t}),i="";if(e&&e.data)for(let t of e.data)if("object"==typeof t){i=t.navigationId;break}if(!i)return JSON.stringify({list:[]});l=`nav_video?id=${i}`}let n=await S(`${c}/api.php/Appfox/${l}`,{headers:a,timeout:t}),o=[];return n&&n.data&&n.data.forEach((e=>{e.banner&&o.push(...e.banner),e.categories&&e.categories.forEach((e=>{e.videos&&o.push(...e.videos)}))})),o.length>0&&2===s&&o.forEach((e=>e.vod_id=`msearch:${e.vod_id}`)),JSON.stringify({list:o})}async function $(i,a,l,n){if(!c)return JSON.stringify({list:[]});let o=Object.assign({},e);r.category&&(o["User-Agent"]=r.category);let p={list:[]};if(h&&2!==s)p=await S(`${h}pg=${a}&t=${i}`,{headers:o,timeout:t})||{list:[]};else{let e=n.class||"全部",s=n.area||"全部",r=n.lang||"全部",l=n.year||"全部",f=n.sort||"最新",h=`${c}/api.php/Appfox/vodList?type_id=${i}&class=${encodeURIComponent(e)}&area=${encodeURIComponent(s)}&lang=${encodeURIComponent(r)}&year=${encodeURIComponent(l)}&sort=${encodeURIComponent(f)}&page=${a}`,d=await S(h,{headers:o,timeout:t});d&&d.data&&d.data.recommend_list&&(p.list=d.data.recommend_list)}return 2===s&&p.list&&p.list.forEach((e=>e.vod_id=`msearch:${e.vod_id}`)),JSON.stringify({...p,page:parseInt(a)})}async function _(a,s,l=1){if(!c)return JSON.stringify({list:[]});let n=Object.assign({},e);r.search&&(n["User-Agent"]=r.search);let o={list:[]};if(h){let e=h.includes("?")?h.split("?")[0]+"?":h;o=await S(`${e}ac=detail&wd=${encodeURIComponent(a)}`,{headers:n,timeout:t})||{list:[]},p=o.list||[]}else{if(3===i){let e={ac:"detail",wd:a,pg:String(l)},i=O(JSON.stringify(e));r.search&&(i["User-Agent"]=r.search),o=b((await req(`${c}/api.php/appfoxs/vod`,{method:"post",data:e,headers:i,postType:"",timeout:t})).content)}else{let e=`${c}/api.php/Appfox/vod?ac=detail&wd=${encodeURIComponent(a)}`;f&&(e+=`&from=${f}`),o=await S(e,{headers:n,timeout:t})||{list:[]}}p=o.list||[]}return JSON.stringify(o)}async function v(a){let s=Object.assign({},e),o=r.detail||r.search;o&&(s["User-Agent"]=o);let f=p.find((e=>String(e.vod_id)===String(a)));if(!f)if(h){let e=h.includes("?")?h.split("?")[0]+"?":h,i=await S(`${e}ac=detail&ids=${a}`,{headers:s,timeout:t});i&&i.list&&i.list.length>0&&(f=i.list[0])}else if(3===i){let e={ac:"detail",ids:String(a)},i=O(JSON.stringify(e));o&&(i["User-Agent"]=o);let s=b((await req(`${c}/api.php/appfoxs/vod`,{method:"post",data:e,headers:i,postType:"",timeout:t})).content);s&&s.list&&(f=s.list[0])}else{let e=await S(`${c}/api.php/Appfox/vod?ac=detail&ids=${a}`,{headers:s,timeout:t});e&&e.list&&(f=e.list[0])}if(!f)return JSON.stringify({list:[]});let d=(f.vod_play_from||"").split("$$$"),u=(f.vod_play_url||"").split("$$$");try{let a=3===i?O():Object.assign({},e);if(r.config&&(a["User-Agent"]=r.config),!n||!n.playerList)if(3===i){let e=b((await req(`${c}/api.php/appfoxs/config`,{headers:a,timeout:t})).content);n={playerList:e?.data?.playerList||[],jiexiDataList:e?.data?.jiexiDataList||[]}}else{let e=await S(`${c}/api.php/Appfox/config`,{headers:a,timeout:t});n={playerList:e?.data?.playerList||[],jiexiDataList:e?.data?.jiexiDataList||[]}}let s=n.playerList||[],o=n.jiexiDataList||[],p={};s.forEach((e=>p[e.playerCode]=e));let h=[];for(let e=0;e<d.length;e++){let t=d[e];if(p[t]){let i=p[t];i.playerCode!==i.playerName&&(d[e]=`${i.playerName}(${t})`)}if(e<u.length){let i=u[e].split("#"),a=[];for(let e of i){let i=e.split("$");i.length>=2?a.push(i[0]+"$"+t+"@"+i[1]):a.push(e)}h.push(a.join("#"))}}
// 播放线路优先级排序逻辑
let playSources = [];
for (let idx = 0; idx < d.length; idx++) {
playSources.push({
show: d[idx],
urls: h[idx] || ""
});
}
playSources.sort((a, b) => {
const aShow = a.show.toLowerCase();
const bShow = b.show.toLowerCase();
const getPriority = (show) => {
if (show.includes('ns4k')) return 1;
if (show.includes('jd4k')) return 2;
if (show.includes('nsys')) return 3;
if (show.includes('nb')) return 4;
if (show.includes('自建')) return 5;
if (show.includes('蓝光')) return 6;
if (show.includes('专线')) return 7;
return 8;
};
return getPriority(aShow) - getPriority(bShow);
});
d = playSources.map(item => item.show);
h = playSources.map(item => item.urls);
f.vod_play_from=d.join("$$$"),f.vod_play_url=h.join("$$$"),l={},o.forEach((e=>{(e.url||"").startsWith("http")&&(l[e.playerCode]=e.url)}))}catch(e){}return JSON.stringify({list:[f]})}async function A(i,s,n){let p=s.indexOf("@"),c=p>-1?s.substring(0,p):"",f=p>-1?s.substring(p+1):s,h=0,d=0,u=0,g={...e};r.parse&&(g["User-Agent"]=r.parse);let y=r.player||"Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1",m=f,$=1===a?[o,l]:[l,o];for(let e of $){if(!u&&!/^https?:\/\/.*\.(m3u8|mp4|flv|mkv)/.test(m))for(let i in e){if(!i.includes(c))continue;let a=e[i];if(Array.isArray(a))for(let e of a){if(e.startsWith("parse:")){m=e.split("parse:")[1]+f,h=0,d=1,u=1;break}try{let i=await S(`${e}${f}`,{headers:g,timeout:t});if(i&&i.url&&i.url.startsWith("http")){m=i.url,u=1;break}}catch(e){}}else if("string"==typeof a){if(a.startsWith("parse:")){m=a.split("parse:")[1]+f,h=0,d=1,u=1;break}try{let e=await S(`${a}${f}`,{headers:g,timeout:t});if(e&&e.url&&e.url.startsWith("http")){m=e.url,u=1;break}}catch(e){}}if(u||d)break}if(u||d)break}return/^https?:\/\/.*\.(m3u8|mp4|flv|mkv)/.test(m)||1===u||(h=1),JSON.stringify({jx:h,parse:d,url:m,header:{"User-Agent":y}})}function b(e){if(!e)return{};try{return JSON.parse(e)}catch(t){try{return JSON.parse(function(e){try{let t=md5X(d).substring(0,16),i=t.split("").reverse().join("");return aesX("AES/CBC/PKCS7",!1,e,!0,t,i,!1)}catch(t){return e}}(e))}catch(t){return e}}}async function S(e,t={}){try{return b((await req(e,t)).content)}catch(e){return{}}}function O(t=""){let i=(new Date).getTime(),a=Math.floor(9e5*Math.random())+1e5,s=md5X(`${u}${d}${i}${a}${t}`);return{"User-Agent":e["User-Agent"],"x-security-auth":`${i}|${a}|${s}`,"content-type":"application/json; charset=utf-8"}}export function __jsEvalReturn(){return{init:g,home:y,homeVod:m,category:$,search:_,detail:v,play:A}}