235 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			235 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
import { load, _ } from 'assets://js/lib/cat.js';
 | 
						||
//发布地址:http://shapp.us/
 | 
						||
let key = 'saohuo';
 | 
						||
let HOST = 'https://saohuo.us';
 | 
						||
let PARSE_URL = 'https://hhjx.hhplayer.com/api.php';
 | 
						||
var charStr = 'abacdefghjklmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ0123456789';
 | 
						||
let COOKIE = 'PHPSESSID=' + randStr(26, true);
 | 
						||
let validCheckUrl = '';
 | 
						||
let siteKey = '';
 | 
						||
let siteType = 0;
 | 
						||
 | 
						||
const UA = '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';
 | 
						||
 | 
						||
async function request(reqUrl, method, data) {
 | 
						||
    const res = await req(reqUrl, {
 | 
						||
        method: method || 'get',
 | 
						||
        headers: {
 | 
						||
            'User-Agent': UA,
 | 
						||
            'Referer': HOST,
 | 
						||
            'Cookie': COOKIE
 | 
						||
        },
 | 
						||
        data: data,
 | 
						||
        postType: method === 'post' ? 'form' : '',
 | 
						||
    });
 | 
						||
    return res.content;
 | 
						||
}
 | 
						||
 | 
						||
// cfg = {skey: siteKey, ext: extend}
 | 
						||
async function init(cfg) {
 | 
						||
    siteKey = cfg.skey;
 | 
						||
    siteType = cfg.stype;
 | 
						||
}
 | 
						||
 | 
						||
async function home(filter) {
 | 
						||
    let classes = [{'type_id':'1','type_name':'电影'},{'type_id':'2','type_name':'电视'}];
 | 
						||
    let filterObj = {
 | 
						||
        '1':[{'key':'class','name':'类型','init':'1','value':[{'n':'全部','v':'1'},{'n':'喜剧','v':'6'},{'n':'爱情','v':'7'},{'n':'恐怖','v':'8'},{'n':'动作','v':'9'},{'n':'科幻','v':'10'},{'n':'战争','v':'11'},{'n':'犯罪','v':'12'},{'n':'动画','v':'13'},{'n':'奇幻','v':'14'},{'n':'剧情','v':'15'},{'n':'冒险','v':'16'},{'n':'悬疑','v':'17'},{'n':'惊悚','v':'18'},{'n':'其它','v':'19'}]}],
 | 
						||
        '2':[{'key':'class','name':'类型','init':'2','value':[{'n':'全部','v':'2'},{'n':'大陆','v':'20'},{'n':'TVB','v':'21'},{'n':'韩剧','v':'22'},{'n':'美剧','v':'23'},{'n':'日剧','v':'24'},{'n':'英剧','v':'25'},{'n':'台剧','v':'26'},{'n':'其它','v':'27'}]}],
 | 
						||
       };
 | 
						||
 | 
						||
    return JSON.stringify({
 | 
						||
        class: classes,
 | 
						||
        filters: filterObj,
 | 
						||
    });
 | 
						||
}
 | 
						||
 | 
						||
async function homeVod() {
 | 
						||
    const videos = await getVideos(HOST);
 | 
						||
    return JSON.stringify({
 | 
						||
        list: videos,
 | 
						||
    })
 | 
						||
}
 | 
						||
 | 
						||
async function category(tid, pg, filter, extend) {
 | 
						||
    if (pg <= 0) pg = 1;
 | 
						||
    const clazz = extend['class'] || tid;
 | 
						||
    const link = HOST + `/list/${clazz}-${pg}.html`;
 | 
						||
    const videos = await getVideos(link);
 | 
						||
    return JSON.stringify({
 | 
						||
        page: parseInt(pg),
 | 
						||
        list: videos,
 | 
						||
    });
 | 
						||
}
 | 
						||
 | 
						||
async function detail(id) {
 | 
						||
    const html = await request(HOST + id);
 | 
						||
    const $ = load(html);
 | 
						||
    const parseUrl = $('iframe').attr('src');
 | 
						||
    const remarks = $('section.grid_box.v_info_box > p').text().split('/');
 | 
						||
    const playFroms = _.map($('ul.from_list > li'), item => {
 | 
						||
        return $(item).text();
 | 
						||
    }).join('$$$');
 | 
						||
    const playUrls = _.map($('ul#play_link > li'), list => {
 | 
						||
        return _.map($(list).find('a'), item => {
 | 
						||
            return $(item).text() + '$' + $(item).attr('href');
 | 
						||
        }).join('#');
 | 
						||
    }).join('$$$');
 | 
						||
 | 
						||
    const vod = {
 | 
						||
        vod_id: id,
 | 
						||
        vod_name: $('h1.v_title').text(),
 | 
						||
        vod_director: remarks[remarks.length-2].replace('导演:', '').trim(),
 | 
						||
        vod_actor: remarks[remarks.length-1].replace('主演:', '').trim(),
 | 
						||
        vod_content: '该影视由leospring采集分享,公众号【蹲街捏蚂蚁】,请勿传播分享,仅供技术学习使用,请在学习后24小时内删除;由此产生的任何法律风险自行承担,与本作者无关!' + $('p.p_txt.show_part').text(),
 | 
						||
        vod_play_from: playFroms,
 | 
						||
        vod_play_url: playUrls,
 | 
						||
    };
 | 
						||
    
 | 
						||
    return JSON.stringify({
 | 
						||
        list: [vod],
 | 
						||
    });
 | 
						||
}
 | 
						||
 | 
						||
async function play(flag, id, flags) {
 | 
						||
    const html = await request(HOST + id);
 | 
						||
    const $ = load(html);
 | 
						||
    const parseUrl = $('iframe').attr('src');
 | 
						||
    const url = await getRealUrl(parseUrl);
 | 
						||
    return JSON.stringify({
 | 
						||
        parse: 0,
 | 
						||
        url: url,
 | 
						||
    });
 | 
						||
}
 | 
						||
 | 
						||
async function search(wd, quick, pg) {
 | 
						||
    try {
 | 
						||
        let page = pg || 1;
 | 
						||
        if (page == 0) page = 1;
 | 
						||
        let searchURL = `${HOST}/search.php?searchword=${encodeURIComponent(wd)}`;
 | 
						||
        let html = await request(searchURL);
 | 
						||
        if (html.includes("请输入正确的验证码继续访问")) {
 | 
						||
            for (let i = 0; i < 2; i++) {
 | 
						||
                html = await validCode(`${HOST}/include/vdimgck.php`, wd);
 | 
						||
                if (!html.includes("请输入正确的验证码继续访问")) {
 | 
						||
                break;
 | 
						||
                }
 | 
						||
            }
 | 
						||
        }
 | 
						||
        //console.log('html', html);
 | 
						||
        const $ = load(html);
 | 
						||
        const items = $('ul.v_list > li > div');
 | 
						||
        let videos = _.map(items, (it) => {
 | 
						||
            const img = $(it).find('img:first')[0];
 | 
						||
            const remarks = $(it).find('div.v_note').text().trim();
 | 
						||
            return {
 | 
						||
                vod_id: $(it).find('a:first')[0].attribs['href'],
 | 
						||
                vod_name: $(it).find('a:first')[0].attribs.title,
 | 
						||
                vod_pic: img.attribs['data-original'],
 | 
						||
                vod_remarks: remarks || '',
 | 
						||
            };
 | 
						||
        });
 | 
						||
        return JSON.stringify({
 | 
						||
            list: videos,
 | 
						||
        });
 | 
						||
    } catch (err) {
 | 
						||
 | 
						||
    }
 | 
						||
}
 | 
						||
 | 
						||
async function getVideos(link) {
 | 
						||
    const html = await request(link);
 | 
						||
    const $ = load(html);
 | 
						||
    const items = $('ul.v_list > li > div');
 | 
						||
    let videos = _.map(items, (it) => {
 | 
						||
        const img = $(it).find('img:first')[0];
 | 
						||
        const remarks = $(it).find('div.v_note').text().trim();
 | 
						||
        return {
 | 
						||
            vod_id: $(it).find('a:first')[0].attribs['href'],
 | 
						||
            vod_name: $(it).find('a:first')[0].attribs.title,
 | 
						||
            vod_pic: img.attribs['data-original'],
 | 
						||
            vod_remarks: remarks || '',
 | 
						||
        };
 | 
						||
    });
 | 
						||
    return videos;
 | 
						||
}
 | 
						||
 | 
						||
async function getRealUrl(link) {
 | 
						||
    const html = await request(link);
 | 
						||
    // const rand =  response.match(/<iframe src="(.*?)"/);
 | 
						||
    const url = html.match(/var url = "(.*?)";/)[1];
 | 
						||
    const t = html.match(/var t = "(.*?)";/)[1];
 | 
						||
    const key = html.match(/var key = "(.*?)";/)[1];
 | 
						||
    const act = html.match(/var act = "(.*?)";/)[1];
 | 
						||
    const play = html.match(/var play = "(.*?)";/)[1];
 | 
						||
    const res = await req(PARSE_URL, {
 | 
						||
        method: 'post',
 | 
						||
        headers: {
 | 
						||
            'User-Agent': UA,
 | 
						||
            'Referer': link,
 | 
						||
        },
 | 
						||
        data: {
 | 
						||
            url,
 | 
						||
            t,
 | 
						||
            key,
 | 
						||
            act,
 | 
						||
            play,   
 | 
						||
        },
 | 
						||
        postType: 'form',
 | 
						||
    });
 | 
						||
    const video = JSON.parse(res.content);
 | 
						||
    return video.url;
 | 
						||
}
 | 
						||
 | 
						||
async function validCode(url, wd) {
 | 
						||
    try {
 | 
						||
        //获取验证码的base64
 | 
						||
        const res = await req(url, {
 | 
						||
            buffer: 2,
 | 
						||
            headers: {
 | 
						||
                'User-Agent': UA,
 | 
						||
                'Referer': HOST,
 | 
						||
                'Cookie': COOKIE
 | 
						||
            }
 | 
						||
        });
 | 
						||
        const response = await req('https://api.nn.ci/ocr/b64/text', {
 | 
						||
          method: 'post',
 | 
						||
          data: res.content,
 | 
						||
          headers: {
 | 
						||
            'Content-Type': 'text/plain',
 | 
						||
          },
 | 
						||
        });
 | 
						||
        if(response['code'] === 200) {
 | 
						||
            let checkRes = await request(`${HOST}/search.php?scheckAC=check&page=&searchtype=&order=&tid=&area=&year=&letter=&yuyan=&state=&money=&ver=&jq`, 'post', {
 | 
						||
                validate: response.content,
 | 
						||
                searchword: wd
 | 
						||
            });
 | 
						||
            return checkRes;
 | 
						||
        }
 | 
						||
      } catch (error) {
 | 
						||
        console.error(error);
 | 
						||
      }
 | 
						||
}
 | 
						||
 | 
						||
function randStr(len, withNum) {
 | 
						||
    var _str = '';
 | 
						||
    let containsNum = withNum === undefined ? true : withNum;
 | 
						||
    for (var i = 0; i < len; i++) {
 | 
						||
        let idx = _.random(0, containsNum ? charStr.length - 1 : charStr.length - 11);
 | 
						||
        _str += charStr[idx];
 | 
						||
    }
 | 
						||
    return _str;
 | 
						||
}
 | 
						||
 | 
						||
export function __jsEvalReturn() {
 | 
						||
    return {
 | 
						||
        init: init,
 | 
						||
        home: home,
 | 
						||
        homeVod: homeVod,
 | 
						||
        category: category,
 | 
						||
        detail: detail,
 | 
						||
        play: play,
 | 
						||
        search: search,
 | 
						||
    };
 | 
						||
}
 |