123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197 |
- import { Crypto, load, _ } from './lib/cat.js';
- let siteKey = '';
- let siteType = 0;
- let timeout = 10000;
- const PC_UA = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36';
- let HOST = 'https://taozi007.com';
- let headers = {
- 'User-Agent': PC_UA,
- 'Referer': HOST,
- };
- let html = '';
- async function request(reqUrl, data, header, method) {
- let res = await req(reqUrl, {
- method: method || 'get',
- data: data || '',
- headers: header || headers,
- postType: method === 'post' ? 'form-data' : '',
- timeout: timeout,
- });
- return res.content;
- }
- async function init(cfg) {
- siteKey = cfg.skey;
- siteType = cfg.stype;
- let res = await req(HOST, {headers: headers});
- while (true) {
- if (typeof(res.headers['set-cookie']) == 'object' && res.headers['set-cookie'][0].includes('guardok=')) {
- headers['Cookie'] = res.headers['set-cookie'].join(' ');
- html = res.content;
- break;
- } else if (res.headers['set-cookie'].includes('guard=')) {
- let id = res.headers['set-cookie'].match(/guard=([^;]+)/)[1];
- let a = id.substr(0, 8);
- let b = parseInt(id.substr(12));
- b = b * 2 + 16;
- let c = '';
- for(let i =0;i<String(b).length;i++) {
- let code = String(b).charCodeAt(i) ^ a.charCodeAt(i%a.length);
- c += String.fromCharCode(code);
- }
- headers.Cookie = 'guard=' + id + '; guardret=' + btoa(c);
- res = await req(HOST, {headers: headers});
- } else {
- break;
- }
- }
-
- }
- 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': '短剧'}]
- return JSON.stringify({
- 'class': classes,
- 'filters': {},
- })
- }
- async function homeVod() {
- const $ = load(html);
- let videos = _.map($('a.module-item'), item => {
- return {
- 'vod_id': $(item).attr('href'),
- 'vod_name': $(item).attr('title'),
- 'vod_pic': $(item).find('img').attr('data-original'),
- 'vod_remarks': $(item).find('.module-item-note').text(),
- }
- })
- return JSON.stringify({
- 'list': videos,
- })
- }
- async function category(tid, pg, filter, extend) {
- if (pg <= 0) pg = 1;
- let url = `${HOST}/show/${tid}--------${pg}---.html`;
- const $ = load(await request(url));
- let videos = _.map($('a.module-item'), item => {
- return {
- 'vod_id': $(item).attr('href'),
- 'vod_name': $(item).attr('title'),
- 'vod_pic': $(item).find('img').attr('data-original'),
- 'vod_remarks': $(item).find('.module-item-note').text(),
- }
- })
- return JSON.stringify({
- 'list': videos,
- 'pagecount': 999,
- 'page': pg,
- })
- }
- async function detail(id) {
- const $ = load(await request(HOST + id));
- let typeName = _.map($('.module-info-tag a'), item => $(item).text()).join(' ');
- let content = $('.show-desc').text();
- let director = _.map($('.module-info-item:has(span:contains("导演")) a'), item => $(item).text()).join(' ');
- let actor = _.map($('.module-info-item:has(span:contains("主演")) a'), item => $(item).text()).join(' ');
- let playFrom = _.map($('.module-tab-item.tab-item span'), item => $(item).text()).join('$$$');
- let playUrl = _.map($('.module-play-list'), item => {
- return _.map($(item).find('a'), it => $(it).text() + '$' + $(it).attr('href')).join('#');
- }).join('$$$');
- let vod = {
- type_name: typeName,
- vod_content: content,
- vod_actor: actor,
- vod_director: director,
- vod_play_from: playFrom,
- vod_play_url: playUrl
- }
- return JSON.stringify({
- list: [vod]
- });
- }
- async function play(flag, id, flags) {
- html = await request(HOST + id);
- const json = getPlay4aJson(html);
- let js = JSON.parse(json);
- let playUrl = js.url;
- if (js.encrypt == 1) {
- playUrl = unescape(playUrl);
- } else if (js.encrypt == 2) {
- playUrl = unescape(base64Decode(playUrl));
- }
- if (playUrl.endsWith('.m3u8')) {
- return JSON.stringify({
- parse: 0,
- url: playUrl
- });
- }
- let from = js.from;
- if (from == 'qq' || from == 'youku' || from == 'iqiyi' || from == 'mgtv' || from == 'tudou' || from == 'sohu' || from == 'le' || from == 'pptv' || from == 'cntv' || from == 'bilibili' || from == 'youtube' || from == 'qqvideo' || from == 'miguvideo' || from == 'letv' || from == 'wasu') {
- html = await request('https://jx.taozi007.com/player/ec.php?code=tz&if=1&url=' + playUrl);
- let str = html.split('"url":"')[1].split('"')[0];
- let uid = html.split('"uid":"')[1].split('"')[0];
- //console.log(str, uid, '2890' + uid + 'tB959C', '2F131BE91247866E');
- playUrl = aesDecode(str.replaceAll('\\',''), '2890' + uid + 'tB959C', '2F131BE91247866E');
- } else {
- html = await request('https://taozi007.com/player/?url=' + playUrl);
- if (html.includes('var rand') && html.includes('var player')) {
- let iv = html.split('var rand = "')[1].split('"');
- let str = html.split('var player = "')[1].split('"')[0];
- playUrl = JSON.parse(aesDecode(str, 'VFBTzdujpR9FWBhe', iv)).url;
- } else if (html.includes('iframe src=') && html.includes('.m3u8')) {
- playUrl = html.split('src="analysis.php?v=')[1].split('"')[0];
- }
- }
- return JSON.stringify({
- parse: 0,
- url: playUrl
- });
- }
- function getPlay4aJson(html) {
- let $ = load(html);
- return $('script:contains(player_aaaa)').text().replace('var player_aaaa=','');
- }
- function base64Decode(text) {
- return Crypto.enc.Utf8.stringify(Crypto.enc.Base64.parse(text));
- }
- //aes解密
- function aesDecode(str, keyStr, ivStr, type) {
- const key = Crypto.enc.Utf8.parse(keyStr);
- if (type === 'hex') {
- str = Crypto.enc.Hex.parse(str);
- return Crypto.AES.decrypt({
- ciphertext: str
- }, key, {
- iv: Crypto.enc.Utf8.parse(ivStr),
- mode: Crypto.mode.CBC,
- padding: Crypto.pad.Pkcs7
- }).toString(Crypto.enc.Utf8);
- } else {
- return Crypto.AES.decrypt(str, key, {
- iv: Crypto.enc.Utf8.parse(ivStr),
- mode: Crypto.mode.CBC,
- padding: Crypto.pad.Pkcs7
- }).toString(Crypto.enc.Utf8);
- }
- }
- export function __jsEvalReturn() {
- return {
- init: init,
- home: home,
- homeVod: homeVod,
- category: category,
- detail: detail,
- play: play,
- // search: search,
- // validCode: validCode,
- };
- }
|