let root = 'https://jiohub.top'; let header = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36', 'Referer': 'https://jiohub.top' }; const wpurl = 'about:jojo'; const wpHtml = ` <script src="https://gcore.jsdelivr.net/gh/msterzhang/cdn@1.0.35/jojo/dist/js/wasm_exec_tiny.js"></script> <script> const go = new Go(); WebAssembly.instantiateStreaming(fetch('https:\/\/gcore.jsdelivr.net\/gh\/msterzhang\/cdn@1.0.35\/jojo\/dist/js/pid.wasm'), go.importObject).then((result) => { go.run(result.instance); }); </script> <div style="display: none;" id="jojo">jojo</div> `; async function init(ext) { if (ext.indexOf('http') == 0) { root = ext; } } async function home(filter) { const purl = getAddress(true) + 'webparse/' + wpurl + '<<eval:"ok"?load=html&&init=1'; console.log(purl); const res = await req(purl, { method: 'POST', data: wpHtml, postType: 'text' }); console.log("loadWebHtml: " + res.content); const cate = "电影#国产#美剧#韩剧#日剧#动漫#纪录"; const cateFilter = "动作#爱情#剧情#科幻#恐怖#动画#喜剧#犯罪"; let classes = []; let filters = {}; const value = [{n:"全部", v:""}]; for (const v of cateFilter.split('#')) { value.push({n: v, v: v}); } const f = { key: 'label', name: '标签', value: value }; for (const item of cate.split('#')) { classes.push({ 'type_id': item, 'type_name': item }); filters[item] = f; } // console.log(JSON.stringify(classes)); return JSON.stringify({ 'class': classes, 'filters': filters ? filters : null }); } async function homeVod(params) { let videos = []; const url = `${root}/video/国产?page=1&size=51`; let res = await req(url, { headers: header, method: 'GET' }); const html = res.content; const data = html.match(/<a href="\/watch\/[\s\S]+?<\/a>/g); if (data) { for (const v of data) { const video = { 'vod_id': v.match(/href="(.+?)"/)[1], 'vod_name': v.match(/<p class="card-title">(.+?)<\/p>/)[1], 'vod_pic': v.match(/src="(.+?)"/)[1], 'vod_remarks': v.match(/<p class="item-speed">(.+?)<\/p>/)[1] + ' ' + v.match(/<p class="score">(.+?)<\/p>/)[1] }; videos.push(video); } } return JSON.stringify({ 'list': videos, 'type_des': '' }); } async function category(tid, page, filter, extend) { let videos = []; if (page < 1) page = 1; const label = (extend.label && extend.label!='' ? '/' + extend.label : ''); const url = `${root}/video/${tid}${label}?page=${page}&size=18`; console.log(url); let res = await req(url, { headers: header, method: 'GET' }); const html = res.content; const data = html.match(/<a href="\/watch\/[\s\S]+?<\/a>/g); if (data) { for (const v of data) { const video = { 'vod_id': v.match(/href="(.+?)"/)[1], 'vod_name': v.match(/<p class="card-title">(.+?)<\/p>/)[1], 'vod_pic': v.match(/src="(.+?)"/)[1], 'vod_remarks': v.match(/<p class="item-speed">(.+?)<\/p>/)[1] + ' ' + v.match(/<p class="score">(.+?)<\/p>/)[1] }; videos.push(video); } } // console.log(JSON.stringify(videos)); return JSON.stringify({ 'page': page, 'pagecount': page + 1, 'limit': videos.length, 'total': videos.length * (page + 1), 'list': videos, 'type_des': '' }); } async function detail(tid) { const url = root + tid; console.log(url); let res = await req(url, { headers: header, method: 'GET' }); let html = res.content; const div = html.match(/<div class="content-detail">([\s\S]+?)<\/div>/)[1]; const vod = { "vod_id": tid, "vod_name": div.match(/<h3.*?>(.+?)<\/h3>/)[1], "vod_pic": '', "type_name": div.match(/<p class="data">类型:(.+?)<\/p>/)[1], "vod_year": div.match(/<p class="data">年份:(.+?)<\/p>/)[1], "vod_area": '', "vod_remarks": '', "vod_actor": div.match(/<p class="data">主演:(.+?)<\/p>/)[1], "vod_director": div.match(/<p class="data">导演:(.+?)<\/p>/)[1], "vod_content": div.match(/class="detail-sketch hide">([\s\S]+?)<\/span>/)[1], "vod_play_from": 'JOJO', "vod_play_url": '' }; const urls = html.match(/let urls = "(.+?)"/)[1]; // console.log(urls); const purl = getAddress(true) + 'webparse/' + wpurl + '<<eval:getData(tvbox.getPostBody())'; console.log(purl); res = await req(purl, { headers: header, method: 'POST', data: urls, postType: 'text' }); // console.log(res.content); vod.vod_play_url = res.content.replaceAll(/\n/g, "#"); // console.log(JSON.stringify(vod)); return JSON.stringify({ 'list': [vod] }); } async function play(flag, id, flags) { const purl = getAddress(true) + 'webparse/' + wpurl + '<<eval:getPid()'; const res = await req(purl, { headers: header, method: 'GET' }); return JSON.stringify({ parse: 0, url: id + '?pid=' + res.content, header: {"User-Agent": "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 search(wd, quick) { const purl = getAddress(true) + 'webparse/' + wpurl + '<<eval:getPid()'; const pres = await req(purl, { headers: header, method: 'GET' }); const url = root + '/video/search?q=' + encodeURIComponent(wd) + '&pid=' + pres.content; console.log(url); let videos = []; let res = await req(url, { headers: header, method: 'GET' }); const html = res.content; const data = html.match(/<a href="\/watch\/[\s\S]+?<\/a>/g); if (data) { for (const v of data) { const video = { 'vod_id': v.match(/href="(.+?)"/)[1], 'vod_name': v.match(/<p class="card-title">(.+?)<\/p>/)[1], 'vod_pic': v.match(/src="(.+?)"/)[1], 'vod_remarks': v.match(/<p class="item-speed">(.+?)<\/p>/)[1] + ' ' + v.match(/<p class="score">(.+?)<\/p>/)[1] }; videos.push(video); } } return JSON.stringify({ 'list': videos, 'type_des': '' }); } __JS_SPIDER__ = { init: init, home: home, homeVod: homeVod, category: category, detail: detail, play: play, search: search, extResult: null };