taozi_open.js 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. import { Crypto, load, _ } from './lib/cat.js';
  2. let siteKey = '';
  3. let siteType = 0;
  4. let timeout = 10000;
  5. 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';
  6. let HOST = 'https://taozi007.com';
  7. let headers = {
  8. 'User-Agent': PC_UA,
  9. 'Referer': HOST,
  10. };
  11. let html = '';
  12. async function request(reqUrl, data, header, method) {
  13. let res = await req(reqUrl, {
  14. method: method || 'get',
  15. data: data || '',
  16. headers: header || headers,
  17. postType: method === 'post' ? 'form-data' : '',
  18. timeout: timeout,
  19. });
  20. return res.content;
  21. }
  22. async function init(cfg) {
  23. siteKey = cfg.skey;
  24. siteType = cfg.stype;
  25. let res = await req(HOST, {headers: headers});
  26. while (true) {
  27. if (typeof(res.headers['set-cookie']) == 'object' && res.headers['set-cookie'][0].includes('guardok=')) {
  28. headers['Cookie'] = res.headers['set-cookie'].join(' ');
  29. html = res.content;
  30. break;
  31. } else if (res.headers['set-cookie'].includes('guard=')) {
  32. let id = res.headers['set-cookie'].match(/guard=([^;]+)/)[1];
  33. let a = id.substr(0, 8);
  34. let b = parseInt(id.substr(12));
  35. b = b * 2 + 16;
  36. let c = '';
  37. for(let i =0;i<String(b).length;i++) {
  38. let code = String(b).charCodeAt(i) ^ a.charCodeAt(i%a.length);
  39. c += String.fromCharCode(code);
  40. }
  41. headers.Cookie = 'guard=' + id + '; guardret=' + btoa(c);
  42. res = await req(HOST, {headers: headers});
  43. } else {
  44. break;
  45. }
  46. }
  47. }
  48. async function home(filter) {
  49. 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': '短剧'}]
  50. return JSON.stringify({
  51. 'class': classes,
  52. 'filters': {},
  53. })
  54. }
  55. async function homeVod() {
  56. const $ = load(html);
  57. let videos = _.map($('a.module-item'), item => {
  58. return {
  59. 'vod_id': $(item).attr('href'),
  60. 'vod_name': $(item).attr('title'),
  61. 'vod_pic': $(item).find('img').attr('data-original'),
  62. 'vod_remarks': $(item).find('.module-item-note').text(),
  63. }
  64. })
  65. return JSON.stringify({
  66. 'list': videos,
  67. })
  68. }
  69. async function category(tid, pg, filter, extend) {
  70. if (pg <= 0) pg = 1;
  71. let url = `${HOST}/show/${tid}--------${pg}---.html`;
  72. const $ = load(await request(url));
  73. let videos = _.map($('a.module-item'), item => {
  74. return {
  75. 'vod_id': $(item).attr('href'),
  76. 'vod_name': $(item).attr('title'),
  77. 'vod_pic': $(item).find('img').attr('data-original'),
  78. 'vod_remarks': $(item).find('.module-item-note').text(),
  79. }
  80. })
  81. return JSON.stringify({
  82. 'list': videos,
  83. 'pagecount': 999,
  84. 'page': pg,
  85. })
  86. }
  87. async function detail(id) {
  88. const $ = load(await request(HOST + id));
  89. let typeName = _.map($('.module-info-tag a'), item => $(item).text()).join(' ');
  90. let content = $('.show-desc').text();
  91. let director = _.map($('.module-info-item:has(span:contains("导演")) a'), item => $(item).text()).join(' ');
  92. let actor = _.map($('.module-info-item:has(span:contains("主演")) a'), item => $(item).text()).join(' ');
  93. let playFrom = _.map($('.module-tab-item.tab-item span'), item => $(item).text()).join('$$$');
  94. let playUrl = _.map($('.module-play-list'), item => {
  95. return _.map($(item).find('a'), it => $(it).text() + '$' + $(it).attr('href')).join('#');
  96. }).join('$$$');
  97. let vod = {
  98. type_name: typeName,
  99. vod_content: content,
  100. vod_actor: actor,
  101. vod_director: director,
  102. vod_play_from: playFrom,
  103. vod_play_url: playUrl
  104. }
  105. return JSON.stringify({
  106. list: [vod]
  107. });
  108. }
  109. async function play(flag, id, flags) {
  110. html = await request(HOST + id);
  111. const json = getPlay4aJson(html);
  112. let js = JSON.parse(json);
  113. let playUrl = js.url;
  114. if (js.encrypt == 1) {
  115. playUrl = unescape(playUrl);
  116. } else if (js.encrypt == 2) {
  117. playUrl = unescape(base64Decode(playUrl));
  118. }
  119. if (playUrl.endsWith('.m3u8')) {
  120. return JSON.stringify({
  121. parse: 0,
  122. url: playUrl
  123. });
  124. }
  125. let from = js.from;
  126. 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') {
  127. html = await request('https://jx.taozi007.com/player/ec.php?code=tz&if=1&url=' + playUrl);
  128. let str = html.split('"url":"')[1].split('"')[0];
  129. let uid = html.split('"uid":"')[1].split('"')[0];
  130. //console.log(str, uid, '2890' + uid + 'tB959C', '2F131BE91247866E');
  131. playUrl = aesDecode(str.replaceAll('\\',''), '2890' + uid + 'tB959C', '2F131BE91247866E');
  132. } else {
  133. html = await request('https://taozi007.com/player/?url=' + playUrl);
  134. if (html.includes('var rand') && html.includes('var player')) {
  135. let iv = html.split('var rand = "')[1].split('"');
  136. let str = html.split('var player = "')[1].split('"')[0];
  137. playUrl = JSON.parse(aesDecode(str, 'VFBTzdujpR9FWBhe', iv)).url;
  138. } else if (html.includes('iframe src=') && html.includes('.m3u8')) {
  139. playUrl = html.split('src="analysis.php?v=')[1].split('"')[0];
  140. }
  141. }
  142. return JSON.stringify({
  143. parse: 0,
  144. url: playUrl
  145. });
  146. }
  147. function getPlay4aJson(html) {
  148. let $ = load(html);
  149. return $('script:contains(player_aaaa)').text().replace('var player_aaaa=','');
  150. }
  151. function base64Decode(text) {
  152. return Crypto.enc.Utf8.stringify(Crypto.enc.Base64.parse(text));
  153. }
  154. //aes解密
  155. function aesDecode(str, keyStr, ivStr, type) {
  156. const key = Crypto.enc.Utf8.parse(keyStr);
  157. if (type === 'hex') {
  158. str = Crypto.enc.Hex.parse(str);
  159. return Crypto.AES.decrypt({
  160. ciphertext: str
  161. }, key, {
  162. iv: Crypto.enc.Utf8.parse(ivStr),
  163. mode: Crypto.mode.CBC,
  164. padding: Crypto.pad.Pkcs7
  165. }).toString(Crypto.enc.Utf8);
  166. } else {
  167. return Crypto.AES.decrypt(str, key, {
  168. iv: Crypto.enc.Utf8.parse(ivStr),
  169. mode: Crypto.mode.CBC,
  170. padding: Crypto.pad.Pkcs7
  171. }).toString(Crypto.enc.Utf8);
  172. }
  173. }
  174. export function __jsEvalReturn() {
  175. return {
  176. init: init,
  177. home: home,
  178. homeVod: homeVod,
  179. category: category,
  180. detail: detail,
  181. play: play,
  182. // search: search,
  183. // validCode: validCode,
  184. };
  185. }