gz.js 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. //import { dayjs, Crypto, Uri, _ } from './lib/cat.js';
  2. import { Crypto,load, _ } from 'assets://js/lib/cat.js';
  3. let siteKey = '';
  4. let siteType = 0;
  5. const host = "https://api.9cec79d.com";
  6. const token = "97630f5f85d9f3c639fb7790ca881ef2.4cccf48dc340fe8bded39cfe4ef9ac2adb27425a9069e6cd121210fc7ba518ea8c1cc5629261e94bb6ccb66d8548449c72076c956a2fb46c253008909a6c66347eb458fe3c06d1fcc993ca03a298328f9229f1994a608250c7d1ae124c4520e6e14ce8bf9f4404119a6bbf53cf592a8df2e9145de92ec43ec87cf4bdc563f6e919fe32861b0e93b118ec37d8035fbb3c.473433979755ccd5ec1b4581ccef76e8209b9e0c6ff819917f12dffad47d0d5e";
  7. const rsaKey = "-----BEGIN PRIVATE KEY-----\nMIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGAe6hKrWLi1zQmjTT1ozbE4QdFeJGNxubxld6GrFGximxfMsMB6BpJhpcTouAqywAFppiKetUBBbXwYsYU1wNr648XVmPmCMCy4rY8vdliFnbMUj086DU6Z+/oXBdWU3/b1G0DN3E9wULRSwcKZT3wj/cCI1vsCm3gj2R5SqkA9Y0CAwEAAQKBgAJH+4CxV0/zBVcLiBCHvSANm0l7HetybTh/j2p0Y1sTXro4ALwAaCTUeqdBjWiLSo9lNwDHFyq8zX90+gNxa7c5EqcWV9FmlVXr8VhfBzcZo1nXeNdXFT7tQ2yah/odtdcx+vRMSGJd1t/5k5bDd9wAvYdIDblMAg+wiKKZ5KcdAkEA1cCakEN4NexkF5tHPRrR6XOY/XHfkqXxEhMqmNbB9U34saTJnLWIHC8IXys6Qmzz30TtzCjuOqKRRy+FMM4TdwJBAJQZFPjsGC+RqcG5UvVMiMPhnwe/bXEehShK86yJK/g/UiKrO87h3aEu5gcJqBygTq3BBBoH2md3pr/W+hUMWBsCQQChfhTIrdDinKi6lRxrdBnn0Ohjg2cwuqK5zzU9p/N+S9x7Ck8wUI53DKm8jUJE8WAG7WLj/oCOWEh+ic6NIwTdAkEAj0X8nhx6AXsgCYRql1klbqtVmL8+95KZK7PnLWG/IfjQUy3pPGoSaZ7fdquG8bq8oyf5+dzjE/oTXcByS+6XRQJAP/5ciy1bL3NhUhsaOVy55MHXnPjdcTX0FaLi+ybXZIfIQ2P4rb19mVq1feMbCXhz+L1rG8oat5lYKfpe8k83ZA==\n-----END PRIVATE KEY-----";
  8. const reqeustKeys = "bMTqITVqBsbq9UjLufsQuBvRiIyfqHLqAWUx0gj0ZUe9DMNDTmJDVZzAh45AZ5LtkC39Y0DU4Ufqm/9gliIJaj7cI/dhmoM5fib5HcslzyGONEwZY5fHBvokBreGaT8bPoaxmnWdTRjRfJzYZV6T06O7GsYVa6DuKTVArb0g48Q=";
  9. const headers = {
  10. "Version": "2406025",
  11. "PackageName": "com.j64f4b21072.ha69699879.dfea0a9826ba.ibf50c9b1d",
  12. "Ver": "1.9.2",
  13. "Referer": "https://api.9cec79d.com",
  14. "Content-Type": "application/x-www-form-urlencoded",
  15. "User-Agent": "okhttp/3.12.0",
  16. }
  17. async function request(url, data) {
  18. let dt = dayjs().unix();
  19. let request_key = aesEncode(data, 'U823n8pKnAAbWOST', 'wgr8N6BCs7426wf1', 'hex');
  20. let signature = Crypto.MD5("token_id=,token="+token+",phone_type=1,request_key=" + request_key + ",app_id=1,time=" + dt + ",keys=" + reqeustKeys + "*&zvdvdvddbfikkkumtmdwqppp?|4Y!s!2br").toString(Crypto.enc.Hex).toUpperCase();
  21. let param = {
  22. 'token': token,
  23. 'token_id': '',
  24. 'phone_type': 1,
  25. 'time': dt,
  26. 'phone_model': 'xiaomi-2206123sc',
  27. 'keys': reqeustKeys,
  28. 'request_key': request_key,
  29. 'signature': signature,
  30. 'app_id': '1',
  31. 'ad_version': '1',
  32. }
  33. let res = await req(host + url, {
  34. headers: headers,
  35. method: 'post',
  36. data: param,
  37. });
  38. let result = JSON.parse(res.content);
  39. let aesKeys = JSON.parse(rsaX('RSA/ECB/PKCS1', false, false, result.data.keys, true, rsaKey, false));
  40. return aesDecode(result.data.response_key, aesKeys.key, aesKeys.iv, 'hex');
  41. }
  42. function aesEncode(str, keyStr, ivStr, type) {
  43. const key = Crypto.enc.Utf8.parse(keyStr);
  44. let encData = Crypto.AES.encrypt(str, key, {
  45. iv: Crypto.enc.Utf8.parse(ivStr),
  46. mode: Crypto.mode.CBC,
  47. padding: Crypto.pad.Pkcs7
  48. });
  49. if (type === 'hex') return encData.ciphertext.toString(Crypto.enc.Hex);
  50. return encData.toString(Crypto.enc.Utf8);
  51. }
  52. //aes解密
  53. function aesDecode(str, keyStr, ivStr, type) {
  54. const key = Crypto.enc.Utf8.parse(keyStr);
  55. if (type === 'hex') {
  56. str = Crypto.enc.Hex.parse(str);
  57. return Crypto.AES.decrypt({
  58. ciphertext: str
  59. }, key, {
  60. iv: Crypto.enc.Utf8.parse(ivStr),
  61. mode: Crypto.mode.CBC,
  62. padding: Crypto.pad.Pkcs7
  63. }).toString(Crypto.enc.Utf8);
  64. } else {
  65. return Crypto.AES.decrypt(str, key, {
  66. iv: Crypto.enc.Utf8.parse(ivStr),
  67. mode: Crypto.mode.CBC,
  68. padding: Crypto.pad.Pkcs7
  69. }).toString(Crypto.enc.Utf8);
  70. }
  71. }
  72. async function init(cfg) {
  73. siteKey = cfg.skey;
  74. siteType = cfg.stype;
  75. if (cfg.ext) {
  76. host = cfg.ext;
  77. }
  78. }
  79. async function home(filter) {
  80. let classes = [];
  81. let classStr = JSON.parse(await request('/App/Index/indexPid', '{}'));
  82. let filters = {};
  83. for(let i=0;i<classStr.length;i++){
  84. let item = classStr[i];
  85. if (item.t_id > 0) {
  86. filters[item.t_id + ''] = [];
  87. let areaVals = [];
  88. let yearVals = [];
  89. let subVals = [];
  90. let sortVals = [];
  91. classes.push({
  92. type_id: item.t_id + '',
  93. type_name: item.name,
  94. });
  95. let filter = JSON.parse(await request('/App/IndexList/indexScreen', JSON.stringify({'t_id': item.t_id})));
  96. if(filter.area) {
  97. _.forEach(filter.area, t => {
  98. areaVals.push({n:t.name,v:t.value});
  99. })
  100. filters[item.t_id + ''].push({key: 'area', name: '地区', init: '0', value: areaVals});
  101. }
  102. if(filter.year) {
  103. _.forEach(filter.year, t => {
  104. yearVals.push({n:t.name,v:t.value});
  105. })
  106. filters[item.t_id + ''].push({key: 'year', name: '年份', init: '0', value: yearVals});
  107. }
  108. if(filter.sub) {
  109. _.forEach(filter.sub, t => {
  110. subVals.push({n:t.name,v:t.value});
  111. })
  112. filters[item.t_id + ''].push({key: 'sub', name: '类型', init: '0', value: subVals});
  113. }
  114. if(filter.sort) {
  115. _.forEach(filter.sort, t => {
  116. sortVals.push({n:t.name,v:t.value});
  117. })
  118. filters[item.t_id + ''].push({key: 'sort', name: '排序', init: 'd_id', value: sortVals});
  119. }
  120. }
  121. };
  122. return JSON.stringify({
  123. class: classes,
  124. filters: filters,
  125. });
  126. }
  127. async function category(tid, pg, filter, extend) {
  128. let param = {
  129. tid: tid,
  130. page: pg,
  131. sort: extend.sort || 'd_id',
  132. area: extend.area || '0',
  133. sub: extend.sub || '0',
  134. year: extend.year || '0',
  135. pageSize: '30',
  136. }
  137. let data = JSON.parse(await request('/App/IndexList/indexList', JSON.stringify(param)));
  138. return JSON.stringify({
  139. page: pg,
  140. limit: 30,
  141. total: data.total,
  142. list: data.list,
  143. });
  144. }
  145. async function detail(id) {
  146. let param = {
  147. 'token_id': '1009464',
  148. 'vod_id': id,
  149. 'mobile_time': dayjs().unix()+'',
  150. 'token': token,
  151. }
  152. let info = JSON.parse(await request('/App/IndexPlay/playInfo', JSON.stringify(param))).vodInfo;
  153. let videos = {
  154. vod_id: info.vod_id,
  155. vod_title: info.vod_title,
  156. vod_year: info.vod_year,
  157. vod_name: info.vod_name,
  158. vod_score: info.vod_scroe,
  159. vod_area: info.vod_area,
  160. vod_director: info.vod_director,
  161. vod_actor: info.vod_actor,
  162. vod_pic: info.vod_pic,
  163. vod_content: info.vod_use_content,
  164. type_name: info.videoTag.join(','),
  165. }
  166. let data2 = JSON.parse(await request('/App/Resource/Vurl/show', JSON.stringify({'vurl_cloud_id': '2','vod_d_id': id}))).list;
  167. let fromUrl = {};
  168. data2.forEach(item => {
  169. for (const key in item.play) {
  170. if (item.play[key].show_type == '2') {
  171. continue;
  172. }
  173. if (!fromUrl.hasOwnProperty(key)) {
  174. fromUrl[key] = [];
  175. }
  176. fromUrl[key].push(item.title + '$' + item.play[key].param);
  177. }
  178. });
  179. videos.vod_play_from = _.keys(fromUrl).join('$$$');
  180. let urls = _.values(fromUrl);
  181. let vod_play_url = [];
  182. for (const urlist of urls) {
  183. vod_play_url.push(urlist.join('#'));
  184. }
  185. videos.vod_play_url = vod_play_url.join('$$$');
  186. return JSON.stringify({
  187. list: [videos],
  188. });
  189. }
  190. async function play(flag, id, flags) {
  191. let arr = id.split('&');
  192. let param = {};
  193. _.forEach(arr, item => {
  194. let kv = item.split('=');
  195. param[kv[0]] = kv[1];
  196. });
  197. let data = JSON.parse(await request('/App/Resource/VurlDetail/showOne', JSON.stringify(param))).url;
  198. return JSON.stringify({
  199. parse: 0,
  200. url: data,
  201. });
  202. }
  203. async function search(wd, quick, pg) {
  204. let param = {
  205. 'keywords': wd,
  206. 'order_val': '1',
  207. }
  208. let data = JSON.parse(await request('/App/Index/findMoreVod', JSON.stringify(param))).list;
  209. let videos = [];
  210. _.map(data, item => {
  211. videos.push({
  212. vod_id: item.vod_id,
  213. vod_name: item.vod_name,
  214. vod_pic: item.vod_pic,
  215. vod_remarks: item.vod_scroe,
  216. })
  217. })
  218. return JSON.stringify({
  219. list: videos,
  220. });
  221. }
  222. export function __jsEvalReturn() {
  223. return {
  224. init: init,
  225. home: home,
  226. //homeVod: homeVod,
  227. category: category,
  228. detail: detail,
  229. play: play,
  230. search: search,
  231. //validCode: validCode,
  232. };
  233. }