From 82240ff938f1f23a0560c801cd0e620f2a97c23a Mon Sep 17 00:00:00 2001 From: n3rddd <119649988+n3rddd@users.noreply.github.com> Date: Wed, 23 Aug 2023 21:22:51 +0800 Subject: [PATCH] Add files via upload --- JN/EXT/OPENJS/open/boosj_open.js | 190 +++++++++++ JN/EXT/OPENJS/open/cntv_open.js | 109 +++++++ JN/EXT/OPENJS/open/dj0898_open.js | 156 +++++++++ JN/EXT/OPENJS/open/ikanbot_open.js | 464 +++++++++++++++------------ JN/EXT/OPENJS/open/kuqimv_open.js | 173 ++++++++++ JN/EXT/OPENJS/open/tuxiaobei_open.js | 135 ++++++++ JN/EXT/OPENJS/open/ubestkid_open.js | 118 +++++++ JN/EXT/OPENJS/open/zxzj_open.js | 258 +++++++++++++++ 8 files changed, 1400 insertions(+), 203 deletions(-) create mode 100644 JN/EXT/OPENJS/open/boosj_open.js create mode 100644 JN/EXT/OPENJS/open/cntv_open.js create mode 100644 JN/EXT/OPENJS/open/dj0898_open.js create mode 100644 JN/EXT/OPENJS/open/kuqimv_open.js create mode 100644 JN/EXT/OPENJS/open/tuxiaobei_open.js create mode 100644 JN/EXT/OPENJS/open/ubestkid_open.js create mode 100644 JN/EXT/OPENJS/open/zxzj_open.js diff --git a/JN/EXT/OPENJS/open/boosj_open.js b/JN/EXT/OPENJS/open/boosj_open.js new file mode 100644 index 00000000..abcce6fe --- /dev/null +++ b/JN/EXT/OPENJS/open/boosj_open.js @@ -0,0 +1,190 @@ +import { load, _ } from './lib/cat.js'; + +let key = '童趣'; +let HOST = 'https://www.boosj.com'; +let siteKey = ''; +let siteType = 0; + +const MOBILE_UA = 'Mozilla/5.0 (Linux; Android 11; M2007J3SC Build/RKQ1.200826.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045714 Mobile Safari/537.36'; + +async function request(reqUrl, agentSp) { + let res = await req(reqUrl, { + method: 'get', + headers: { + 'User-Agent': agentSp || MOBILE_UA, + 'Referer': HOST + }, + }); + return res.content; +} + +// cfg = {skey: siteKey, ext: extend} +async function init(cfg) { + siteKey = cfg.skey; + siteType = cfg.stype; +} + +async function home(filter) { + const classes = [{ type_id: '', type_name: '全部' }, { type_id: 28, type_name: '辅食' }, { type_id: 582, type_name: '动画' }, { type_id: 3364, type_name: '儿童舞蹈' }, { type_id: 3366, type_name: '少儿英语' }, { type_id: 3367, type_name: '儿童歌曲' }, { type_id: 3622, type_name: '才艺' }, { type_id: 3782, type_name: '播视自制' }, { type_id: 3822, type_name: '故事' }, { type_id: 3842, type_name: '亲子教育' }, { type_id: 4402, type_name: '美术' }, { type_id: 4583, type_name: '其他' }, { type_id: 4762, type_name: '儿童游戏' }, { type_id: 4842, type_name: '识物' }, { type_id: 4843, type_name: '绘本' }, { type_id: 4844, type_name: '古诗' }, { type_id: 4845, type_name: '科普' }, { type_id: 5102, type_name: '儿童玩具' }, { type_id: 5142, type_name: '播视童趣儿童玩具' }]; + const filterObj = {}; + const jsonData = [ + { + key: 'age', + name: '年龄段', + value: [ + { n: '全部', v: '' }, + { n: '6岁以上', v: '?p367=370' }, + { n: '3~6岁', v: '?p367=369' }, + { n: '0~3岁', v: '?p367=368' }, + ], + init: '', + }, + { + key: 'by', + name: '排序', + value: [ + { n: '全部', v: '' }, + { n: '最新发布', v: 'lately' }, + { n: '最多播放', v: 'pop' }, + { n: '最多评论', v: 'view' }, + ], + init: '', + }, + ]; + return JSON.stringify({ + class: _.map(classes, (cls) => { + cls.land = 1; + cls.ratio = 1.78; + filterObj[cls.type_id] = jsonData; + return cls; + }), + filters: filterObj, + }); +} + +async function homeVod() { + const link = HOST + '/search_res_3362__3364_1_.html'; + const html = await request(link); + const $ = load(html); + const items = $('body div.bj-col4:has(h3)'); + let videos = _.map(items, (it) => { + const a = $(it).find('a:first')[0]; + const img = $(it).find('img:first')[0]; + const remarks = $(it).find('span.played')[0]; + return { + vod_id: a.attribs.href, + vod_name: a.attribs.title, + vod_pic: img.attribs['data-original'], + vod_remarks: remarks.children[0].data || '', + }; + }); + return JSON.stringify({ + list: videos, + }); +} + +async function category(tid, pg, filter, extend) { + if (pg <= 0 || typeof (pg) == 'undefined') pg = 1; + const link = HOST + '/search_res_3362__' + tid + '_' + pg + '_' + (extend.by || '') + '.html' + (extend.age || ''); + const html = await request(link); + const $ = load(html); + const items = $('body div.bj-col4:has(h3)'); + let videos = _.map(items, (it) => { + const a = $(it).find('a:first')[0]; + const img = $(it).find('img:first')[0]; + const remarks = $(it).find('span.played')[0]; + return { + vod_id: a.attribs.href, + vod_name: a.attribs.title, + vod_pic: img.attribs['data-original'], + vod_remarks: remarks.children[0].data || '', + }; + }); + const hasMore = $('div.pub_paging > a:contains(下一页)').length > 0; + const pgCount = hasMore ? parseInt(pg) + 1 : parseInt(pg); + return JSON.stringify({ + page: parseInt(pg), + pagecount: pgCount, + limit: 30, + total: 30 * pgCount, + list: videos, + }); +} + +async function detail(id) { + const vod = { + vod_id: id, + vod_remarks: "", + }; + const playlist = ["点击播放" + "$" + vod.vod_id]; + vod.vod_play_from = "道长在线"; + vod.vod_play_url = playlist.join("#"); + return JSON.stringify({ + list: [vod], + }); +} + +async function play(flag, id, flags) { + const body = JSON.parse(await request('https://gslb.boosj.com/ipv2.json')); + body._id = id.match(/\d+/)[0]; + const json = JSON.parse(await request(buildUrl(body.gslb, body))); + const purl = json.url + '?' + json.t + // console.debug('童趣purl =====>' + purl); // js_debug.log + let headers = { + 'User-Agent': 'Dalvik/2.1.0 (Linux; U; Android 9; 22081212C Build/PQ3B.190801.002)', + }; + return JSON.stringify({ + parse: 0, + url: purl, + header: headers, + }); +} + +async function search(wd, quick) { + var data = JSON.parse(await request('https://search.boosj.com/m_ajax?q=' + wd + '&p=' + pg + '&typeId=3362')).body; + let videos = _.map(data.result, (it) => { + return { + vod_id: it.playUrl, + vod_name: it.resourceName, + vod_pic: it.imageUrl, + vod_remarks: it.clickNumStr || '', + } + }); + return JSON.stringify({ + page: parseInt(pg), + pagecount: data.pageCount, + limit: 30, + total: data.rowCount, + list: videos, + }); +} + +function buildUrl(url, obj) { + obj = obj || {}; + if (url.indexOf('?') < 0) { + url += '?' + } + let param_list = []; + let keys = Object.keys(obj); + keys.forEach(it => { + param_list.push(it + '=' + obj[it]) + }); + let prs = param_list.join('&'); + if (keys.length > 0 && !url.endsWith('?')) { + url += '&' + } + url += prs; + return url +} + +export function __jsEvalReturn() { + return { + init: init, + home: home, + homeVod: homeVod, + category: category, + detail: detail, + play: play, + search: search, + }; +} \ No newline at end of file diff --git a/JN/EXT/OPENJS/open/cntv_open.js b/JN/EXT/OPENJS/open/cntv_open.js new file mode 100644 index 00000000..fcd75364 --- /dev/null +++ b/JN/EXT/OPENJS/open/cntv_open.js @@ -0,0 +1,109 @@ +// 无搜索功能 +import { _ } from './lib/cat.js'; +let key = '视聚场'; +let HOST = 'http://api.cntv.cn'; +let siteKey = ''; +let siteType = 0; +const MOBILE_UA = 'Mozilla/5.0 (Linux; Android 11; M2007J3SC Build/RKQ1.200826.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045714 Mobile Safari/537.36'; + +async function request(reqUrl, agentSp) { + let res = await req(reqUrl, { + method: 'get', + headers: { + 'User-Agent': agentSp || MOBILE_UA, + }, + }); + return res.content +} + +async function init(cfg) { + siteKey = cfg.skey; + siteType = cfg.stype +} + +async function home(filter) { + const classes = [{ type_id: "TOPC1451528971114112", type_name: "新闻联播" }, { type_id: "TOPC1451558976694518", type_name: "焦点访谈" }, { type_id: "TOPC1451464665008914", type_name: "今日说法" }, { type_id: "TOPC1451378757637200", type_name: "等着我" }, { type_id: "TOPC1451559129520755", type_name: "新闻直播间" }, { type_id: "TOPC1451540328102649", type_name: "海峡两岸" }, { type_id: "TOPC1451530382483536", type_name: "天网" }, { type_id: "TOPC1451540389082713", type_name: "今日关注" }, { type_id: "TOPC1451557893544236", type_name: "探索·发现" }, { type_id: "TOPC1665739007799851", type_name: "高端访谈" }, { type_id: "TOPC1451557052519584", type_name: "百家讲坛" }, { type_id: "TOPC1451464884159276", type_name: "开讲啦" }, { type_id: "TOPC1451464884159276", type_name: "故事里的中国" }, { type_id: "TOPC1514182710380601", type_name: "对话" }, { type_id: "TOPC1451559038345600", type_name: "面对面" }, { type_id: "TOPC1451378967257534", type_name: "动物世界" }, { type_id: "TOPC1451558190239536", type_name: "走进科学" }, { type_id: "TOPC1451525103989666", type_name: "人与自然" }, { type_id: "TOPC1451557421544786", type_name: "地理·中国" }, { type_id: "TOPC1451541349400938", type_name: "远方的家" }, { type_id: "TOPC1451558150787467", type_name: "自然传奇" }, { type_id: "TOPC1451534366388377", type_name: "是真的吗" }, { type_id: "TOPC1451467630488780", type_name: "星光大道" }, { type_id: "TOPC1451557646802924", type_name: "健康之路" }, { type_id: "TOPC1451559025546574", type_name: "动画大放映" }, { type_id: "TOPC1451378857272262", type_name: "第一动画乐园" }, { type_id: "TOPC1451541414450906", type_name: "精彩音乐汇" }, { type_id: "TOPC1451534421925242", type_name: "音乐厅" }, { type_id: "TOPC1451541994820527", type_name: "民歌·中国" }, { type_id: "TOPC1575253587571324", type_name: "跟着书本去旅行" }, { type_id: "TOPC1451354597100320", type_name: "中国电影报道" }, { type_id: "TOPC1451469943519994", type_name: "星推荐" }, { type_id: "TOPC1571217727564820", type_name: "方圆剧阵" }, { type_id: "TOPC1451558856402351", type_name: "空中剧院" }, { type_id: "TOPC1650782829200997", type_name: "正大综艺" }, { type_id: "TOPC1451550970356385", type_name: "体坛快讯" }, { type_id: "TOPC1451530259915198", type_name: "第一时间" }, { type_id: "TOPC1451465894294259", type_name: "开门大吉" }, { type_id: "TOPC1451464884159276", type_name: "开讲啦" }, { type_id: "TOPC1451558858788377", type_name: "共同关注" }, { type_id: "TOPC1451527941788652", type_name: "军事报道" }, { type_id: "TOPC1451558819463311", type_name: "新闻调查" }, { type_id: "TOPC1451559097947700", type_name: "新闻30分" }, { type_id: "TOPC1451559066181661", type_name: "新闻1+1" }, { type_id: "TOPC1451540448405749", type_name: "今日亚洲" }, { type_id: "TOPC1451559129520755", type_name: "新闻直播间" }, { type_id: "TOPC1451558428005729", type_name: "24小时" }, { type_id: "TOPC1451539894330405", type_name: "中国新闻" }, { type_id: "TOPC1451558779639282", type_name: "午夜新闻" }, { type_id: "TOPC1451558496100826", type_name: "朝闻天下" }, { type_id: "TOPC1451528792881669", type_name: "晚间新闻" }, { type_id: "TOPC1451559180488841", type_name: "新闻周刊" }, { type_id: "TOPC1601362002656197", type_name: "经济半小时" }, { type_id: "TOPC1451533652476962", type_name: "经济大讲堂" }, { type_id: "TOPC1453100395512779", type_name: "正点财经" }, { type_id: "TOPC1451546588784893", type_name: "生活圈" }, { type_id: "TOPC1451526037568184", type_name: "生活提示" }, { type_id: "TOPC1451558532019883", type_name: "东方时空" }, { type_id: "TOPC1451533782742171", type_name: "经济信息联播" }, { type_id: "TOPC1571034705435323", type_name: "今日环球" }, { type_id: "TOPC1451543462858283", type_name: "一线" }]; + const filterObj = {}; + return JSON.stringify({ + class: _.map(classes, (cls) => { + cls.land = 1; + cls.ratio = 1.78; + return cls; + }), + filters: filterObj, + }) +} + +async function homeVod() { + const data = JSON.parse(await request(HOST + '/NewVideo/getVideoListByColumn?id=TOPC1451558856402351&n=10&sort=desc&p=1&mode=0&serviceId=tvcctv')); + let videos = _.map(data.data.list, (it) => { + return { + vod_id: it.guid, + vod_name: it.title, + vod_pic: it.image, + vod_remarks: it.time || '', + } + }); + return JSON.stringify({ + list: videos, + }) +} + +async function category(tid, pg, filter, extend) { + if (pg <= 0 || typeof pg == 'undefined') pg = 1; + const data = JSON.parse(await request(HOST + '/NewVideo/getVideoListByColumn?id=' + tid + '&n=10&sort=desc&p=' + pg + '&mode=0&serviceId=tvcctv')); + let videos = _.map(data.data.list, (it) => { + return { + vod_id: it.guid, + vod_name: it.title, + vod_pic: it.image, + vod_remarks: it.time || '', + } + }); + const pgChk = JSON.parse(await request(HOST + '/NewVideo/getVideoListByColumn?id=' + tid + '&n=10&sort=desc&p=' + (parseInt(pg) + 1) + '&mode=0&serviceId=tvcctv')).data.list; + const pgCount = pgChk.length > 0 ? parseInt(pg) + 1 : parseInt(pg); + return JSON.stringify({ + page: parseInt(pg), + pagecount: parseInt(pgCount), + limit: 10, + total: parseInt(data.total), + list: videos, + }) +} + +async function detail(id) { + const vod = { + vod_id: id, + vod_remarks: '', + }; + const playlist = ['点击播放' + '$' + 'https://hls.cntv.myhwcdn.cn/asp/hls/2000/0303000a/3/default/' + id + '/2000.m3u8']; + vod.vod_play_from = key; + vod.vod_play_url = playlist.join('#'); + return JSON.stringify({ + list: [vod], + }); +} + +async function play(flag, id, flags) { + // console.debug('视聚场 id =====>' + id); // js_debug.log + return JSON.stringify({ + parse: 0, + url: id, + }) +} + +async function search(wd, quick, pg) { + return '{}' +} + +export function __jsEvalReturn() { + return { + init: init, + home: home, + homeVod: homeVod, + category: category, + detail: detail, + play: play, + search: search, + } +} \ No newline at end of file diff --git a/JN/EXT/OPENJS/open/dj0898_open.js b/JN/EXT/OPENJS/open/dj0898_open.js new file mode 100644 index 00000000..e92c55ba --- /dev/null +++ b/JN/EXT/OPENJS/open/dj0898_open.js @@ -0,0 +1,156 @@ +import { load, _ } from "assets://js/lib/cat.js"; + +let key = "世纪DJ音乐网"; +let HOST = "http://m.dj0898.com"; +let siteKey = ""; +let siteType = 0; + +const MOBILE_UA = "Mozilla/5.0 (Linux; Android 11; M2007J3SC Build/RKQ1.200826.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045714 Mobile Safari/537.36"; + +async function request(reqUrl, agentSp) { + let res = await req(reqUrl, { + method: "get", + headers: { + "User-Agent": agentSp || MOBILE_UA, + Referer: HOST, + }, + }); + return res.content; +} + +async function init(cfg) { + siteKey = cfg.skey; + siteType = cfg.stype; +} + +async function home(filter) { + const classes = [{ type_id: 1, type_name: "🎧串烧舞曲" }, { type_id: 2, type_name: "🎧外文舞曲" }, { type_id: 3, type_name: "🎧早场暖场" }, { type_id: 4, type_name: "🎧中文舞曲" }, { type_id: 5, type_name: "🎧其他舞曲" }, { type_id: 6, type_name: "🎧国外电音" }, { type_id: 8, type_name: "🎧慢歌连版" }, { type_id: 9, type_name: "🎧酒吧潮歌" }, { type_id: 10, type_name: "🎧中文串烧" }, { type_id: 11, type_name: "🎧外文串烧" }, { type_id: 12, type_name: "🎧中外串烧" }, { type_id: 13, type_name: "🎧车载串烧" }, { type_id: 14, type_name: "🎧越鼓串烧" }, { type_id: 40, type_name: "🎧3D/环绕" }, { type_id: 45, type_name: "🎧口水旋律" }, { type_id: 46, type_name: "🎧精品收藏" }, { type_id: 47, type_name: "🎧开场舞曲" }, { type_id: 48, type_name: "🎧印度舞曲" }, { type_id: 49, type_name: "🎧编排套曲" }, { type_id: 20, type_name: "🎧DuTch" }, { type_id: 21, type_name: "🎧Mash up" }, { type_id: 22, type_name: "🎧ClubHouse" }, { type_id: 23, type_name: "🎧ElectroHouse" }, { type_id: 24, type_name: "🎧越南鼓Dj" }, { type_id: 30, type_name: "🎧Funky" }, { type_id: 31, type_name: "🎧Reggae" }, { type_id: 32, type_name: "🎧Rnb" }, { type_id: 33, type_name: "🎧Hip Hop" }, { type_id: 34, type_name: "🎧Dubstep" }, { type_id: 8017, type_name: "🎧Hardstyle" }, { type_id: 8018, type_name: "🎧Hands Up" }]; + const filterObj = {}; + return JSON.stringify({ + class: _.map(classes, (cls) => { + cls.land = 1; + cls.ratio = 1.78; + return cls; + }), + filters: filterObj, + }); +} + +async function homeVod() { + const link = HOST + "/dance/lists/id/10/1"; + const html = await request(link); + const $ = load(html); + const list = $("ul.djddv_djList > li"); + let videos = _.map(list, (it) => { + const a = $(it).find("a")[1]; + const img = $(it).find("img:first")[0]; + const tt = $(it).find("strong:first")[0]; + const remarks = $(it).find("font")[5]; + return { + vod_id: a.attribs.href, + vod_name: tt.children[0].data, + vod_pic: img.attribs["src"], + vod_remarks: "🎵" + remarks.children[0].data || "", + }; + }); + return JSON.stringify({ + list: videos, + }); +} + +async function category(tid, pg, filter, extend) { + if (pg <= 0 || typeof pg == "undefined") pg = 1; + const link = HOST + "/dance/lists/id/" + tid + "/" + pg; + const html = await request(link); + const $ = load(html); + const list = $("ul.djddv_djList > li"); + let videos = _.map(list, (it) => { + const a = $(it).find("a")[1]; + const img = $(it).find("img:first")[0]; + const tt = $(it).find("strong:first")[0]; + const remarks = $(it).find("font")[5]; + return { + vod_id: a.attribs.href, + vod_name: tt.children[0].data, + vod_pic: img.attribs["src"], + vod_remarks: "🎵" + remarks.children[0].data || "", + }; + }); + const hasMore = $("ul.page_link > li > a:contains(\u00a0)").length > 0; + const pgCount = hasMore ? parseInt(pg) + 1 : parseInt(pg); + return JSON.stringify({ + page: parseInt(pg), + pagecount: pgCount, + limit: 60, + total: 60 * pgCount, + list: videos, + }); +} + +async function detail(id) { + const vod = { + vod_id: id, + vod_remarks: "", + }; + const playlist = ["点击播放" + "$" + vod.vod_id]; + vod.vod_play_from = "道长在线"; + vod.vod_play_url = playlist.join("#"); + return JSON.stringify({ + list: [vod], + }); +} + +async function play(flag, id, flags) { + const html = await request(id); + const $ = load(html); + const audio = $("body audio[src*=http]"); + const audioUrl = audio[0].attribs.src; + // console.debug('世纪DJ音乐网 audioUrl =====>' + audioUrl); // js_debug.log + return JSON.stringify({ + parse: 0, + url: audioUrl, + }); +} + +async function search(wd, quick, pg) { + if (pg <= 0 || typeof pg == "undefined") pg = 1; + const link = HOST + "/index.php/dance/so/key?key=" + wd + "&cid=0&p=" + pg; + const html = await request(link); + const $ = load(html); + const list = $("ul.djddv_djList > li"); + let videos = _.map(list, (it) => { + const a = $(it).find("a")[1]; + const img = $(it).find("img:first")[0]; + const tt = $(it).find("strong:first")[0]; + const remarks = $(it).find("font:first")[0]; + return { + vod_id: a.attribs.href, + vod_name: tt.children[0].data, + vod_pic: img.attribs["src"], + vod_remarks: "🎵" + remarks.children[0].data || "", + }; + }); + const hasMore = $("ul.page_link > li > a:contains(\u00a0)").length > 0; + const pgCount = hasMore ? parseInt(pg) + 1 : parseInt(pg); + return JSON.stringify({ + page: parseInt(pg), + pagecount: pgCount, + limit: 60, + total: 60 * pgCount, + list: videos, + land: 1, + ratio: 1.78, + }); +} + +export function __jsEvalReturn() { + return { + init: init, + home: home, + homeVod: homeVod, + category: category, + detail: detail, + play: play, + search: search, + }; +} \ No newline at end of file diff --git a/JN/EXT/OPENJS/open/ikanbot_open.js b/JN/EXT/OPENJS/open/ikanbot_open.js index 95fd9ba1..5d1455b8 100644 --- a/JN/EXT/OPENJS/open/ikanbot_open.js +++ b/JN/EXT/OPENJS/open/ikanbot_open.js @@ -1,203 +1,261 @@ -import { Crypto, load, _ } from './lib/cat.js'; - -let key = 'ikanbot'; -let url = 'https://www.ikanbot.com'; -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, agentSp) { - let res = await req(reqUrl, { - method: 'get', - headers: { - 'User-Agent': agentSp || UA, - }, - }); - return res.content; -} - -// cfg = {skey: siteKey, ext: extend} -async function init(cfg) { - siteKey = cfg.skey; - siteType = cfg.stype; -} - -function getClass($) { - const nav = $('ul.nav-pills:eq(1) > li > a'); - let tags = { - key: 'tag', - name: '标签', - value: _.map(nav, (n) => { - return { n: n.children[0].data, v: n.attribs.href }; - }), - }; - tags['init'] = tags.value[0].v; - const title = $('title:first').text().split('-')[0].substring(2); - return { cls: { type_id: tags.value[0].v, type_name: title }, tags: [tags] }; -} - -async function home(filter) { - let classes = []; - let filterObj = {}; - for (const cate of ['/hot/index-movie-热门.html', '/hot/index-tv-热门.html']) { - const html = await request(url + cate); - const $ = load(html); - const { cls, tags } = getClass($); - classes.push(cls); - filterObj[cls.type_id] = tags; - } - return JSON.stringify({ - class: classes, - filters: filterObj, - }); -} - -async function homeVod() { - return '{}'; -} - -async function category(tid, pg, filter, extend) { - if (pg <= 0) pg = 1; - const link = url + (extend.tag || tid).replace('.html', pg > 1 ? `-p-${pg}.html` : '.html'); - const html = await request(link); - const $ = load(html); - const items = $('div.v-list a.item'); - var jsBase = await js2Proxy(true, siteType, siteKey, 'img/', {}); - let videos = _.map(items, (item) => { - const img = $(item).find('img:first')[0]; - return { - vod_id: item.attribs.href, - vod_name: img.attribs.alt, - vod_pic: jsBase + base64Encode(img.attribs['data-src']), - vod_remarks: '', - }; - }); - const hasMore = $('div.page-more > a:contains(下一页)').length > 0; - const pgCount = hasMore ? parseInt(pg) + 1 : parseInt(pg); - return JSON.stringify({ - page: parseInt(pg), - pagecount: pgCount, - limit: 24, - total: 24 * pgCount, - list: videos, - }); -} - -async function detail(id) { - const html = await request(url + id); - const $ = load(html); - var jsBase = await js2Proxy(true, siteType, siteKey, 'img/', {}); - const detail = $('div.detail > .meta'); - let vod = { - vod_id: id, - vod_pic: jsBase + base64Encode($('div.item-root > img')[0].attribs['data-src']), - vod_remarks: '', - }; - for (const info of detail) { - if ($(info).hasClass('title')) { - vod.vod_name = info.children[0].data; - } else if ($(info).hasClass('year')) { - vod.vod_area = info.children[0].data; - } else if ($(info).hasClass('country')) { - vod.vod_area = info.children[0].data; - } else if ($(info).hasClass('celebrity')) { - vod.vod_actor = info.children[0].data; - } - } - - const res = await req(url + '/api/getResN?videoId=' + id.substring(id.lastIndexOf('/') + 1) + '&mtype=2', { - headers: { - Referer: url, - 'User-Agent': UA, - }, - }); - const list = JSON.parse(res.content).data.list; - let playlist = {}; - for (const l of list) { - const flagData = JSON.parse(l.resData); - for (const f of flagData) { - const from = f.flag; - const urls = f.url; - if (!from || !urls) continue; - if (playlist[from]) continue; - playlist[from] = urls; - } - } - vod.vod_play_from = _.keys(playlist).join('$$$'); - vod.vod_play_url = _.values(playlist).join('$$$'); - return JSON.stringify({ - list: [vod], - }); -} - -function base64Encode(text) { - return Crypto.enc.Base64.stringify(Crypto.enc.Utf8.parse(text)); -} - -function base64Decode(text) { - return Crypto.enc.Utf8.stringify(Crypto.enc.Base64.parse(text)); -} - -async function proxy(segments, headers) { - let what = segments[0]; - let url = base64Decode(segments[1]); - if (what == 'img') { - var resp = await req(url, { - buffer: 2, - headers: { - Referer: url, - 'User-Agent': UA, - }, - }); - return JSON.stringify({ - code: resp.code, - buffer: 2, - content: resp.content, - headers: resp.headers, - }); - } - return JSON.stringify({ - code: 500, - content: '', - }); -} - -async function play(flag, id, flags) { - return JSON.stringify({ - parse: 0, - url: id, - }); -} - -async function search(wd, quick) { - const html = await request(url + '/search?q=' + wd); - const $ = load(html); - const items = $('div.media > div.media-left > a'); - var jsBase = await js2Proxy(true, siteType, siteKey, 'img/', {}); - let videos = _.map(items, (item) => { - const img = $(item).find('img:first')[0]; - return { - vod_id: item.attribs.href, - vod_name: img.attribs.alt, - vod_pic: jsBase + base64Encode(img.attribs['data-src']), - vod_remarks: '', - }; - }); - return JSON.stringify({ - list: videos, - }); -} - -export function __jsEvalReturn() { - return { - init: init, - home: home, - homeVod: homeVod, - category: category, - detail: detail, - play: play, - proxy: proxy, - search: search, - }; -} +import { Crypto, load, _ } from './lib/cat.js'; + +let key = 'ikanbot'; +let url = 'https://www.ikanbot.com'; +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, agentSp) { + let res = await req(reqUrl, { + method: 'get', + headers: { + 'User-Agent': agentSp || UA, + 'referer': url + }, + }); + return res.content; +} + +// cfg = {skey: siteKey, ext: extend} +async function init(cfg) { + siteKey = cfg.skey; + siteType = cfg.stype; +} + +function getClass($) { + const nav = $('ul.nav-pills:eq(1) > li > a'); + let tags = { + key: 'tag', + name: '标签', + value: _.map(nav, (n) => { + return { n: n.children[0].data, v: n.attribs.href }; + }), + }; + tags['init'] = tags.value[0].v; + const title = $('title:first').text().split('-')[0].substring(2); + return { cls: { type_id: tags.value[0].v, type_name: title }, tags: [tags] }; +} + +async function home(filter) { + let classes = []; + let filterObj = {}; + for (const cate of ['/hot/index-movie-热门.html', '/hot/index-tv-热门.html']) { + const html = await request(url + cate); + const $ = load(html); + const { cls, tags } = getClass($); + classes.push(cls); + filterObj[cls.type_id] = tags; + } + return JSON.stringify({ + class: classes, + filters: filterObj, + }); +} + +async function homeVod() { + const html = await request(url); + const $ = load(html); + const items = $('div.v-list a.item'); + var jsBase = await js2Proxy(true, siteType, siteKey, 'img/', {}); + let videos = _.map(items, (item) => { + const img = $(item).find('img:first')[0]; + return { + vod_id: item.attribs.href, + vod_name: img.attribs.alt, + vod_pic: jsBase + base64Encode(img.attribs['data-src']), + vod_remarks: '', + }; + }); + return JSON.stringify({ + list: videos, + }); +} + +async function category(tid, pg, filter, extend) { + if (pg <= 0) pg = 1; + const link = url + (extend.tag || tid).replace('.html', pg > 1 ? `-p-${pg}.html` : '.html'); + const html = await request(link); + const $ = load(html); + const items = $('div.v-list a.item'); + var jsBase = await js2Proxy(true, siteType, siteKey, 'img/', {}); + let videos = _.map(items, (item) => { + const img = $(item).find('img:first')[0]; + return { + vod_id: item.attribs.href, + vod_name: img.attribs.alt, + vod_pic: jsBase + base64Encode(img.attribs['data-src']), + vod_remarks: '', + }; + }); + const hasMore = $('div.page-more > a:contains(下一页)').length > 0; + const pgCount = hasMore ? parseInt(pg) + 1 : parseInt(pg); + return JSON.stringify({ + page: parseInt(pg), + pagecount: pgCount, + limit: 24, + total: 24 * pgCount, + list: videos, + }); +} + +async function detail(id) { + const html = await request(url + id); + const $ = load(html); + var jsBase = await js2Proxy(true, siteType, siteKey, 'img/', {}); + const detail = $('div.detail'); + const remarks = $('span#line-tips').text(); + let vod = { + vod_id: id, + vod_pic: jsBase + base64Encode($('div.item-root > img')[0].attribs['data-src']), + vod_remarks: '', + vod_content: remarks || '', + vod_name: $(detail).find('h2').text().trim(), + vod_year: $(detail).find('h3:nth-child(3)').text(), + vod_area: $(detail).find('h3:nth-child(4)').text(), + vod_actor: $(detail).find('h3:nth-child(5)').text(), + }; + const res = await req(url + '/api/getResN?videoId=' + id.substring(id.lastIndexOf('/') + 1) + '&mtype=2', { + headers: { + Referer: 'play', + 'User-Agent': UA, + }, + }); + const list = JSON.parse(res.content).data.list; + let playlist = {}; + let arr = [] + for (const l of list) { + const flagData = JSON.parse(l.resData); + for (const f of flagData) { + const from = f.flag; + const urls = f.url; + if (!from || !urls) continue; + if (playlist[from]) continue; + playlist[from] = urls; + } + } + for (var key in playlist) { + if ('kuaikan' == key) { + arr.push({ + flag: '快看', + url: playlist[key], + sort: 1 + }) + } else if ('bfzym3u8' == key) { + arr.push({ + flag: '暴风', + url: playlist[key], + sort: 2 + }) + } else if ('ffm3u8' == key) { + arr.push({ + flag: '非凡', + url: playlist[key], + sort: 3 + }) + } else if ('lzm3u8' == key) { + arr.push({ + flag: '量子', + url: playlist[key], + sort: 4 + }) + } else { + arr.push({ + flag: key, + url: playlist[key], + sort: 5 + }) + } + } + arr.sort((a, b) => a.sort - b.sort); + let playFrom = []; + let playList = []; + arr.map(val => { + playFrom.push(val.flag); + playList.push(val.url); + }) + vod.vod_play_from = playFrom.join("$$$"); + vod.vod_play_url = playList.join("$$$"); + return JSON.stringify({ + list: [vod], + }); +} + +function base64Encode(text) { + return Crypto.enc.Base64.stringify(Crypto.enc.Utf8.parse(text)); +} + +function base64Decode(text) { + return Crypto.enc.Utf8.stringify(Crypto.enc.Base64.parse(text)); +} + +async function proxy(segments, headers) { + let what = segments[0]; + let url = base64Decode(segments[1]); + if (what == 'img') { + var resp = await req(url, { + buffer: 2, + headers: { + Referer: url, + 'User-Agent': UA, + }, + }); + return JSON.stringify({ + code: resp.code, + buffer: 2, + content: resp.content, + headers: resp.headers, + }); + } + return JSON.stringify({ + code: 500, + content: '', + }); +} + +async function play(flag, id, flags) { + return JSON.stringify({ + parse: 0, + url: id, + }); +} + +async function search(wd, quick, pg) { + if (pg <= 0 || typeof(pg) == 'undefined') pg = 1; + const html = await request(url + '/search?q=' + wd + '&p=' + pg); + const $ = load(html); + const items = $('div.media'); + var jsBase = await js2Proxy(true, siteType, siteKey, 'img/', {}); + let videos = _.map(items, (item) => { + const a = $(item).find('a:first')[0]; + const img = $(item).find('img:first')[0]; + const remarks = $($(item).find('span.label')[0]).text().trim(); + return { + vod_id: a.attribs.href, + vod_name: img.attribs.alt, + vod_pic: jsBase + base64Encode(img.attribs['data-src']), + vod_remarks: remarks || '', + }; + }); + const hasMore = $('div.page-more > a:contains(下一页)').length > 0; + const pgCount = hasMore ? parseInt(pg) + 1 : parseInt(pg); + return JSON.stringify({ + page: parseInt(pg), + pagecount: pgCount, + list: videos, + }); +} + +export function __jsEvalReturn() { + return { + init: init, + home: home, + homeVod: homeVod, + category: category, + detail: detail, + play: play, + proxy: proxy, + search: search, + }; +} diff --git a/JN/EXT/OPENJS/open/kuqimv_open.js b/JN/EXT/OPENJS/open/kuqimv_open.js new file mode 100644 index 00000000..2575ed68 --- /dev/null +++ b/JN/EXT/OPENJS/open/kuqimv_open.js @@ -0,0 +1,173 @@ +// 修正:分类改静态 (网站频繁变动分类) +import { load, _ } from "assets://js/lib/cat.js"; + +let key = "酷奇MV"; +let HOST = "https://www.kuqimv.com"; +let siteKey = ""; +let siteType = 0; +const PC_UA = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36"; + +async function request(reqUrl, referer, mth, data, hd) { + const headers = { + "User-Agent": PC_UA, + }; + if (referer) headers.referer = encodeURIComponent(referer); + let res = await req(reqUrl, { + method: mth || "get", + headers: headers, + data: data, + postType: mth === "post" ? "form" : "", + }); + return res.content; +} + +async function init(cfg) { + siteKey = cfg.skey; + siteType = cfg.stype; +} + +async function home(filter) { + var classes = [{ "type_id": "1", "type_name": "华语高清" }, { "type_id": "2", "type_name": "日韩精选" }, { "type_id": "3", "type_name": "欧美MV" }, { "type_id": "4", "type_name": "高清现场" }, { "type_id": "5", "type_name": "影视MV" }, { "type_id": "6", "type_name": "夜店视频" }, { "type_id": "7", "type_name": "车模视频" }, { "type_id": "8", "type_name": "热舞视频" }, { "type_id": "9", "type_name": "美女写真" }, { "type_id": "10", "type_name": "美女打碟" }]; + // const html = await request(HOST); + // const $ = load(html); + // const class_parse = $(".lei_fl > a[href*=play]"); + // const classes = []; + // classes = _.map(class_parse, (cls) => { + // const typeId = cls.attribs["href"]; + // typeId = typeId.substring(typeId.lastIndexOf("/") + 1).replace(".html", ""); + // return { + // type_id: typeId, + // type_name: cls.children[0].data, + // }; + // }); + const filterObj = {}; + return JSON.stringify({ + class: _.map(classes, (cls) => { + cls.land = 1; + cls.ratio = 1.78; + return cls; + }), + filters: filterObj, + }); +} + +async function homeVod() { + const link = HOST + "/play/9_1.html"; + const html = await request(link); + const $ = load(html); + const items = $("div.mv_list > li"); + let videos = _.map(items, (it) => { + const a = $(it).find("a:first")[0]; + const img = $(it).find("img:first")[0]; + const singer = $($(it).find("div.singer")[0]).text().trim(); + const remarks = $($(it).find("span.lei_03")[0]).text().trim(); + return { + vod_id: a.attribs.href.replace(/.*?\/play\/(.*).html/g, "$1"), + vod_name: a.attribs.title, + vod_pic: img.attribs["src"], + vod_remarks: "🎤" + singer + "|" + remarks || "", + }; + }); + return JSON.stringify({ + list: videos, + }); +} + +async function category(tid, pg, filter, extend) { + if (pg <= 0 || typeof pg == "undefined") pg = 1; + const link = HOST + "/play/" + tid + "_" + pg + ".html"; + const html = await request(link); + const $ = load(html); + const items = $("div.mv_list > li"); + let videos = _.map(items, (it) => { + const a = $(it).find("a:first")[0]; + const img = $(it).find("img:first")[0]; + const singer = $($(it).find("div.singer")[0]).text().trim(); + const remarks = $($(it).find("span.lei_03")[0]).text().trim(); + return { + vod_id: a.attribs.href.replace(/.*?\/play\/(.*).html/g, "$1"), + vod_name: a.attribs.title, + vod_pic: img.attribs["src"], + vod_remarks: "🎤" + singer + "|" + remarks || "", + }; + }); + const hasMore = $("div.lei_page > a:contains(下一页)").length > 0; + const pgCount = hasMore ? parseInt(pg) + 1 : parseInt(pg); + return JSON.stringify({ + page: parseInt(pg), + pagecount: pgCount, + limit: 24, + total: 24 * pgCount, + list: videos, + }); +} + +async function detail(id) { + const vod = { + vod_id: id, + vod_remarks: "", + }; + const playlist = ["观看视频" + "$" + id]; + vod.vod_play_from = "道长在线"; + vod.vod_play_url = playlist.join("#"); + return JSON.stringify({ + list: [vod], + }); +} + +async function play(flag, id, flags) { + const link = HOST + "/skin/kuqimv/play.php"; + const ref = HOST + "/play/" + id + ".html"; + const pdata = { id: id }; + const playUrl = JSON.parse(await request(link, ref, "post", pdata)).url; + const headers = { + Referer: HOST, + }; + return JSON.stringify({ + parse: 0, + url: playUrl, + header: headers, + }); +} + +async function search(wd, quick, pg) { + if (pg <= 0 || typeof pg == "undefined") pg = 1; + const link = HOST + "/search.php?key=" + wd + "&pages=" + pg; + const html = await request(link); + const $ = load(html); + const items = $("div.video_list > li"); + let videos = _.map(items, (it) => { + const a = $(it).find("a:first")[0]; + const singer = $($(it).find("div.singer")[0]).text().trim(); + const remarks = $($(it).find("span.lei_04")[0]).text().trim(); + return { + vod_id: a.attribs.href.replace(/.*?\/play\/(.*).html/g, "$1"), + vod_name: a.attribs.title, + vod_pic: "https://www.kuqimv.com/static/images/cover/singer.jpg", + vod_remarks: "🎤" + singer + "|" + remarks || "", + }; + }); + const hasMore = $("div.lei_page > a:contains(>)").length > 0; + const pgCount = hasMore ? parseInt(pg) + 1 : parseInt(pg); + return JSON.stringify({ + page: parseInt(pg), + pagecount: pgCount, + limit: 20, + total: 20 * pgCount, + list: videos, + land: 1, + ratio: 1.78, + }); +} + +export function __jsEvalReturn() { + return { + init: init, + home: home, + homeVod: homeVod, + category: category, + detail: detail, + play: play, + search: search, + }; +} \ No newline at end of file diff --git a/JN/EXT/OPENJS/open/tuxiaobei_open.js b/JN/EXT/OPENJS/open/tuxiaobei_open.js new file mode 100644 index 00000000..b560037d --- /dev/null +++ b/JN/EXT/OPENJS/open/tuxiaobei_open.js @@ -0,0 +1,135 @@ +import { load, _ } from './lib/cat.js'; +let key = '🐰兔小贝'; +let HOST = 'https://www.tuxiaobei.com'; +let siteKey = ''; +let siteType = 0; +const IOS_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, agentSp) { + let res = await req(reqUrl, { + method: 'get', + headers: { + 'User-Agent': agentSp || IOS_UA, + }, + }); + return res.content +} + +async function init(cfg) { + siteKey = cfg.skey; + siteType = cfg.stype +} + +async function home(filter) { + const classes = [{ type_id: '', type_name: '🐰全部' }, { type_id: 2, type_name: '🐰儿歌' }, { type_id: 3, type_name: '🐰故事' }, { type_id: 27, type_name: '🐰公益' }, { type_id: 9, type_name: '🐰十万个为什么' }, { type_id: 28, type_name: '🐰安全教育' }, { type_id: 29, type_name: '🐰动物奇缘' }, { type_id: 7, type_name: '🐰弟子规' }, { type_id: 5, type_name: '🐰古诗' }, { type_id: 6, type_name: '🐰三字经' }, { type_id: 8, type_name: '🐰千字文' }, { type_id: 11, type_name: '🐰数学' }, { type_id: 25, type_name: '🐰英语' }, { type_id: 24, type_name: '🐰折纸' }]; + const filterObj = {}; + return JSON.stringify({ + class: _.map(classes, (cls) => { + cls.land = 1; + cls.ratio = 1.78; + return cls; + }), + filters: filterObj, + }) +} + +async function homeVod() { + const link = await request(HOST + '/list/mip-data?typeId=9&page=1&callback='); + const html = link.match(/\((.*?)\);/)[1]; + const data = JSON.parse(html).data; + let videos = _.map(data.items, (it) => { + return { + vod_id: it.video_id, + vod_name: it.name, + vod_pic: it.image, + vod_remarks: it.root_category_name + ' | ' + it.duration_string || '', + } + }); + return JSON.stringify({ + list: videos, + }) +} + +async function category(tid, pg, filter, extend) { + if (pg <= 0 || typeof pg == 'undefined') pg = 1; + const link = await request(HOST + '/list/mip-data?typeId=' + tid + '&page=' + pg + '&callback='); + const html = link.match(/\((.*?)\);/)[1]; + const data = JSON.parse(html).data; + let videos = _.map(data.items, (it) => { + return { + vod_id: it.video_id, + vod_name: it.name, + vod_pic: it.image, + vod_remarks: it.root_category_name + ' | ' + it.duration_string || '', + } + }); + const pgCount = pg * 30 > data.totalCount ? parseInt(pg) : parseInt(pg) + 1; + return JSON.stringify({ + page: parseInt(pg), + pagecount: pgCount, + limit: 30, + total: data.totalCount, + list: videos, + }) +} + +async function detail(id) { + const vod = { + vod_id: id, + vod_remarks: '', + }; + const playlist = ['点击播放' + '$' + HOST + '/play/' + id]; + vod.vod_play_from = "道长在线"; + vod.vod_play_url = playlist.join('#'); + return JSON.stringify({ + list: [vod], + }); +} + +async function play(flag, id, flags) { + const html = await request(id); + const $ = load(html); + const pvideo = $("body mip-search-video[video-src*=http]"); + const purl = pvideo[0].attribs['video-src']; + // console.debug('兔小贝 purl =====>' + purl); // js_debug.log + return JSON.stringify({ + parse: 0, + url: purl, + }); +} + +async function search(wd, quick) { + const link = HOST + "/search/" + wd; + const html = await request(link); + const $ = load(html); + const list = $("div.list-con > div.items"); + let videos = _.map(list, (it) => { + const a = $(it).find("a:first")[0]; + const img = $(it).find("mip-img:first")[0]; + const tt = $(it).find("p:first")[0]; + const remarks = $(it).find("p")[1]; + return { + vod_id: a.attribs.href.replace(/.*?\/play\/(.*)/g, '$1'), + vod_name: tt.children[0].data, + vod_pic: img.attribs["src"], + vod_remarks: remarks.children[0].data || "", + }; + }); + return JSON.stringify({ + list: videos, + land: 1, + ratio: 1.78, + }); +} + +export function __jsEvalReturn() { + return { + init: init, + home: home, + homeVod: homeVod, + category: category, + detail: detail, + play: play, + search: search, + } +} \ No newline at end of file diff --git a/JN/EXT/OPENJS/open/ubestkid_open.js b/JN/EXT/OPENJS/open/ubestkid_open.js new file mode 100644 index 00000000..2eda6aa0 --- /dev/null +++ b/JN/EXT/OPENJS/open/ubestkid_open.js @@ -0,0 +1,118 @@ +// 无搜索功能 +import { _ } from './lib/cat.js'; +let key = '🐯贝乐虎'; +let HOST = 'https://vd.ubestkid.com'; +let siteKey = ''; +let siteType = 0; +const MOBILE_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, referer, mth, data, hd) { + const headers = { + "User-Agent": MOBILE_UA, + }; + if (referer) headers.referer = encodeURIComponent(referer); + let res = await req(reqUrl, { + method: mth || "get", + headers: headers, + data: data, + postType: mth === "post" ? "json" : "", + }); + return res.content; +} + +async function init(cfg) { + siteKey = cfg.skey; + siteType = cfg.stype +} + +async function home(filter) { + const classes = [{ type_id: 65, type_name: '🐯最新上架' }, { type_id: 113, type_name: '🐯人气热播' }, { type_id: 56, type_name: '🐯经典童谣' }, { type_id: 137, type_name: '🐯开心贝乐虎' }, { type_id: 53, type_name: '🐯律动儿歌' }, { type_id: 59, type_name: '🐯经典儿歌' }, { type_id: 101, type_name: '🐯超级汽车1' }, { type_id: 119, type_name: '🐯超级汽车第二季' }, { type_id: 136, type_name: '🐯超级汽车第三季' }, { type_id: 95, type_name: '🐯三字经' }, { type_id: 133, type_name: '🐯幼儿手势舞' }, { type_id: 117, type_name: '🐯哄睡儿歌' }, { type_id: 70, type_name: '🐯英文儿歌' }, { type_id: 116, type_name: '🐯节日与节气' }, { type_id: 97, type_name: '🐯恐龙世界' }, { type_id: 55, type_name: '🐯动画片儿歌' }, { type_id: 57, type_name: '🐯流行歌曲' }, { type_id: 118, type_name: '🐯贝乐虎入园记' }, { type_id: 106, type_name: '🐯贝乐虎大百科' }, { type_id: 62, type_name: '🐯经典古诗' }, { type_id: 63, type_name: '🐯经典故事' }, { type_id: 128, type_name: '🐯萌虎学功夫' }, { type_id: 100, type_name: '🐯绘本故事' }, { type_id: 121, type_name: '🐯开心贝乐虎英文版' }, { type_id: 96, type_name: '🐯嗨贝乐虎情商动画' }, { type_id: 108, type_name: '🐯动物音乐派对' }, { type_id: 126, type_name: '🐯动物音乐派对英文版' }, { type_id: 105, type_name: '🐯奇妙的身体' }, { type_id: 124, type_name: '🐯奇妙的身体英文版' }, { type_id: 64, type_name: '🐯认知卡片' }, { type_id: 109, type_name: '🐯趣味简笔画' }, { type_id: 78, type_name: '🐯数字儿歌' }, { type_id: 120, type_name: '🐯识字体验版' }, { type_id: 127, type_name: '🐯启蒙系列体验版' }]; + const filterObj = {}; + return JSON.stringify({ + class: _.map(classes, (cls) => { + cls.land = 1; + cls.ratio = 1.78; + return cls; + }), + filters: filterObj, + }) +} + +async function homeVod() { + const link = HOST + "/api/v1/bv/video"; + const pdata = { age: 1, appver: "6.1.9", egvip_status: 0, svip_status: 0, vps: 60, subcateId: 56, "p": 1 }; + const jo = JSON.parse(await request(link, "", "post", pdata)).result; + const videos = []; + _.each(jo.items, (it) => { + videos.push({ + vod_id: it.url, + vod_name: it.title, + vod_pic: it.image, + vod_remarks: '👀' + it.viewcount || '', + }) + }); + return JSON.stringify({ + list: videos, + }) +} + +async function category(tid, pg, filter, extend) { + if (pg <= 0 || typeof pg == 'undefined') pg = 1; + const link = HOST + "/api/v1/bv/video"; + const pdata = { age: 1, appver: "6.1.9", egvip_status: 0, svip_status: 0, vps: 60, subcateId: tid, "p": pg }; + const jo = JSON.parse(await request(link, "", "post", pdata)).result; + const videos = []; + _.each(jo.items, (it) => { + videos.push({ + vod_id: it.url, + vod_name: it.title, + vod_pic: it.image, + vod_remarks: '👀' + it.viewcount || '', + }) + }); + const pgCount = pg * 60 > jo.total ? parseInt(pg) : parseInt(pg) + 1; + return JSON.stringify({ + page: parseInt(pg), + pagecount: pgCount, + limit: 60, + total: jo.total, + list: videos, + }) +} + +async function detail(id) { + const vod = { + vod_id: id, + vod_remarks: '', + }; + const playlist = ['点击播放' + '$' + id]; + vod.vod_play_from = "道长在线"; + vod.vod_play_url = playlist.join('#'); + return JSON.stringify({ + list: [vod], + }); +} + +async function play(flag, id, flags) { + // console.debug('贝乐虎 id =====>' + id); // js_debug.log + return JSON.stringify({ + parse: 0, + url: id, + }); +} + +async function search(wd, quick) { + return '{}' +} + +export function __jsEvalReturn() { + return { + init: init, + home: home, + homeVod: homeVod, + category: category, + detail: detail, + play: play, + search: search, + } +} \ No newline at end of file diff --git a/JN/EXT/OPENJS/open/zxzj_open.js b/JN/EXT/OPENJS/open/zxzj_open.js new file mode 100644 index 00000000..f6edb207 --- /dev/null +++ b/JN/EXT/OPENJS/open/zxzj_open.js @@ -0,0 +1,258 @@ +// 自动从 地址发布页 获取&跳转url地址 +import { Crypto, load, _ } from './lib/cat.js'; + +let key = '在线之家'; +let HOST = 'https://www.zxzj.site'; // 地址发布页 +let host = ''; +let siteKey = ''; +let siteType = 0; + +const MOBILE_UA = 'Mozilla/5.0 (Linux; Android 11; M2007J3SC Build/RKQ1.200826.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045714 Mobile Safari/537.36'; + +async function request(reqUrl, agentSp) { + let res = await req(reqUrl, { + method: 'get', + headers: { + 'User-Agent': agentSp || MOBILE_UA, + 'Referer': host + }, + }); + return res.content; +} + +// cfg = {skey: siteKey, ext: extend} +async function init(cfg) { + siteKey = cfg.skey; + siteType = cfg.stype; + const html = await request(HOST); + const $ = load(html); + host = $('div.content-top > ul > li').find('a:first')[0].attribs.href; + console.debug('在线之家 跳转地址 =====>' + host); // js_debug.log +} + +async function home(filter) { + const html = await request(host); + const $ = load(html); + const class_parse = $('ul.stui-header__menu > li > a[href*=list]'); + let classes = _.map(class_parse, (cls) => { + let typeId = cls.attribs['href']; + typeId = typeId.substring(typeId.lastIndexOf('/') + 1).replace('.html', ''); + return { + type_id: typeId, + type_name: cls.children[0].data, + }; + }); + const filterObj = { + 1: [{ key: 'class', name: '剧情', value: [{ n: '全部', v: '' }, { n: '喜剧', v: '喜剧' }, { n: '爱情', v: '爱情' }, { n: '恐怖', v: '恐怖' }, { n: '动作', v: '动作' }, { n: '科幻', v: '科幻' }, { n: '剧情', v: '剧情' }, { n: '战争', v: '战争' }, { n: '警匪', v: '警匪' }, { n: '犯罪', v: '犯罪' }, { n: '动画', v: '动画' }, { n: '奇幻', v: '奇幻' }, { n: '冒险', v: '冒险' }] }, { key: 'area', name: '地区', value: [{ n: '全部', v: '' }, { n: '大陆', v: '大陆' }, { n: '香港', v: '香港' }, { n: '台湾', v: '台湾' }, { n: '欧美', v: '欧美' }, { n: '韩国', v: '韩国' }, { n: '日本', v: '日本' }, { n: '泰国', v: '泰国' }, { n: '印度', v: '印度' }, { n: '俄罗斯', v: '俄罗斯' }, { n: '其他', v: '其他' }] }], + 2: [{ key: 'class', name: '剧情', value: [{ n: '全部', v: '' }, { n: '剧情', v: '剧情' }, { n: '喜剧', v: '喜剧' }, { n: '爱情', v: '爱情' }, { n: '动作', v: '动作' }, { n: '悬疑', v: '悬疑' }, { n: '恐怖', v: '恐怖' }, { n: '奇幻', v: '奇幻' }, { n: '惊悚', v: '惊悚' }, { n: '犯罪', v: '犯罪' }, { n: '科幻', v: '科幻' }, { n: '音乐', v: '音乐' }, { n: '其他', v: '其他' }] }], + 3: [{ key: 'class', name: '剧情', value: [{ n: '全部', v: '' }, { n: '剧情', v: '剧情' }, { n: '喜剧', v: '喜剧' }, { n: '爱情', v: '爱情' }, { n: '动作', v: '动作' }, { n: '悬疑', v: '悬疑' }, { n: '恐怖', v: '恐怖' }, { n: '奇幻', v: '奇幻' }, { n: '惊悚', v: '惊悚' }, { n: '犯罪', v: '犯罪' }, { n: '科幻', v: '科幻' }, { n: '音乐', v: '音乐' }, { n: '其他', v: '其他' }] }], + 4: [{ key: 'class', name: '剧情', value: [{ n: '全部', v: '' }, { n: '剧情', v: '剧情' }, { n: '喜剧', v: '喜剧' }, { n: '爱情', v: '爱情' }, { n: '动作', v: '动作' }, { n: '悬疑', v: '悬疑' }, { n: '恐怖', v: '恐怖' }, { n: '奇幻', v: '奇幻' }, { n: '惊悚', v: '惊悚' }, { n: '犯罪', v: '犯罪' }, { n: '科幻', v: '科幻' }, { n: '音乐', v: '音乐' }, { n: '其他', v: '其他' }] }], + 6: [{ key: 'class', name: '剧情', value: [{ n: '全部', v: '' }, { n: '情感', v: '情感' }, { n: '科幻', v: '科幻' }, { n: '热血', v: '热血' }, { n: '推理', v: '推理' }, { n: '搞笑', v: '搞笑' }, { n: '冒险', v: '冒险' }, { n: '萝莉', v: '萝莉' }, { n: '校园', v: '校园' }, { n: '动作', v: '动作' }, { n: '机战', v: '机战' }, { n: '运动', v: '运动' }, { n: '战争', v: '战争' }, { n: '少年', v: '少年' }] }, { key: 'area', name: '地区', value: [{ n: '全部', v: '' }, { n: '国产', v: '国产' }, { n: '日本', v: '日本' }, { n: '欧美', v: '欧美' }, { n: '其他', v: '其他' }] }] + }; + let filYer = { key: 'year', name: '年份', value: [{ n: '全部', v: '' }, { n: '2023', v: '2023' }, { n: '2022', v: '2022' }, { n: '2021', v: '2021' }, { n: '2020', v: '2020' }, { n: '2019', v: '2019' }, { n: '2018', v: '2018' }, { n: '2017', v: '2017' }, { n: '2016', v: '2016' }, { n: '2015', v: '2015' }, { n: '2014', v: '2014' }, { n: '2013', v: '2013' }, { n: '2012', v: '2012' }, { n: '2011', v: '2011' }] }; + filYer['init'] = filYer.value[0].v; + let filBy = { key: 'by', name: '排序', value: [{ n: '时间', v: 'time' }, { n: '人气', v: 'hits' }, { n: '评分', v: 'score' }] }; + filBy['init'] = filBy.value[0].v; + return JSON.stringify({ + class: _.map(classes, (cls) => { + if (filterObj[cls.type_id]) { + filterObj[cls.type_id].push(filYer, filBy); + filterObj[cls.type_id][0]['init'] = filterObj[cls.type_id][0].value[0].v; + } else { + filterObj[cls.type_id] = []; + filterObj[cls.type_id].push(filYer, filBy) + } + return cls; + }), + filters: filterObj, + }); +} + +async function homeVod() { + const link = host + '/vodshow/1--hits---------2023.html'; + const html = await request(link); + const $ = load(html); + const js2Base = await js2Proxy(true, siteType, siteKey, 'img/', {}); + const items = $('ul.stui-vodlist > li'); + let videos = _.map(items, (item) => { + const a = $(item).find('a:first')[0]; + const remarks = $($(item).find('span.pic-text')[0]).text().trim(); + return { + vod_id: a.attribs.href.replace(/.*?\/detail\/(.*).html/g, '$1'), + vod_name: a.attribs.title, + vod_pic: js2Base + base64Encode(a.attribs['data-original']), + vod_remarks: remarks || '', + }; + }); + return JSON.stringify({ + list: videos, + }); +} + +async function category(tid, pg, filter, extend) { + if (pg <= 0 || typeof (pg) == 'undefined') pg = 1; + const link = host + '/vodshow/' + tid + '-' + (extend.area || '') + '-' + (extend.by || 'time') + '-' + (extend.class || '') + '-' + (extend.lang || '') + '-' + (extend.letter || '') + '---' + pg + '---' + (extend.year || '') + '.html'; + const html = await request(link); + const $ = load(html); + const js2Base = await js2Proxy(true, siteType, siteKey, 'img/', {}); + const items = $('ul.stui-vodlist > li'); + let videos = _.map(items, (item) => { + const a = $(item).find('a:first')[0]; + const remarks = $($(item).find('span.pic-text')[0]).text().trim(); + return { + vod_id: a.attribs.href.replace(/.*?\/detail\/(.*).html/g, '$1'), + vod_name: a.attribs.title, + vod_pic: js2Base + base64Encode(a.attribs['data-original']), + vod_remarks: remarks || '', + }; + }); + const hasMore = $('ul.stui-page__item > li > a:contains(下一页)').length > 0; + const pgCount = hasMore ? parseInt(pg) + 1 : parseInt(pg); + return JSON.stringify({ + page: parseInt(pg), + pagecount: pgCount, + limit: 24, + total: 24 * pgCount, + list: videos, + }); +} + +async function detail(id) { + const html = await request(host + '/detail/' + id + '.html'); + const $ = load(html); + const js2Base = await js2Proxy(true, siteType, siteKey, 'img/', {}); + const vod = { + vod_id: id, + vod_name: $('h1:first').text().trim(), + vod_type: $('.stui-content__detail p:first a').text(), + vod_actor: $('.stui-content__detail p:nth-child(3)').text().replace('主演:', ''), + vod_director: $('.stui-content__detail p:nth-child(4)').text().replace('导演:', ''), + vod_pic: js2Base + base64Encode($('.stui-content__thumb img:first').attr('data-original')), + vod_remarks: $('.stui-content__detail p:nth-child(5)').text() || '', + vod_content: $('span.detail-content').text().trim(), + }; + let playMap = {}; + const tabs = $('div.stui-vodlist__head > h3'); + const playlists = $('ul.stui-content__playlist'); + _.each(tabs, (tab, i) => { + const from = tab.children[0].data; + let list = playlists[i]; + list = $(list).find('a'); + _.each(list, (it) => { + const title = it.children[0].data; + const playUrl = it.attribs.href; + if (title.length == 0) title = it.children[0].data.trim(); + if (!playMap.hasOwnProperty(from)) { + playMap[from] = []; + } + playMap[from].push(title + '$' + playUrl); + }); + }); + vod.vod_play_from = _.keys(playMap).join('$$$'); + const urls = _.values(playMap); + let vod_play_url = _.map(urls, (urlist) => { + return urlist.join('#'); + }); + vod.vod_play_url = vod_play_url.join('$$$'); + return JSON.stringify({ + list: [vod], + }); +} + +async function play(flag, id, flags) { + const html = await request(host + id); + const mhtml = html.match(/r player_.*?=(.*?)= 0 || url.indexOf('mp4') >= 0) { + // console.debug('在线之家url =====>' + url); // js_debug.log + return JSON.stringify({ + parse: 0, + url: url, + }); + } else if (from.indexOf('line3') >= 0 || from.indexOf('line5') >= 0) { + const ifrwy = await request(url); + const code = ifrwy.match(/var url = '(.*?)'/)[1].split('').reverse().join(''); + let temp = ''; + for (let i = 0x0; i < code.length; i = i + 0x2) { + temp += String.fromCharCode(parseInt(code[i] + code[i + 0x1], 0x10)) + } + const purl = temp.substring(0x0, (temp.length - 0x7) / 0x2) + temp.substring((temp.length - 0x7) / 0x2 + 0x7); + // console.debug('在线之家purl =====>' + purl); // js_debug.log + return JSON.stringify({ + parse: 0, + url: purl, + }); + } else { + // console.debug('在线之家url =====>' + '空'); // js_debug.log + return '{}'; + } +} + +async function search(wd, quick) { + var data = JSON.parse(await request(host + '/index.php/ajax/suggest?mid=1&wd=' + wd + '&limit=50')).list; + const js2Base = await js2Proxy(true, siteType, siteKey, 'img/', {}); + let videos = _.map(data, (it) => { + return { + vod_id: it.id, + vod_name: it.name, + vod_pic: js2Base + base64Encode(it.pic), + vod_remarks: '', + } + }); + return JSON.stringify({ + list: videos, + limit: 50, + }); +} + +function base64Encode(text) { + return Crypto.enc.Base64.stringify(Crypto.enc.Utf8.parse(text)); +} + +function base64Decode(text) { + return Crypto.enc.Utf8.stringify(Crypto.enc.Base64.parse(text)); +} + +async function proxy(segments, headers) { + let what = segments[0]; + let url = base64Decode(segments[1]); + if (what == 'img') { + var resp = await req(url, { + buffer: 2, + headers: { + Referer: 'https://api.douban.com/', + 'User-Agent': MOBILE_UA, + }, + }); + return JSON.stringify({ + code: resp.code, + buffer: 2, + content: resp.content, + headers: resp.headers, + }); + } + return JSON.stringify({ + code: 500, + content: '', + }); +} + +export function __jsEvalReturn() { + return { + init: init, + home: home, + homeVod: homeVod, + category: category, + detail: detail, + play: play, + proxy: proxy, + search: search, + }; +} \ No newline at end of file