Sleazy Fork is available in English.

汤头条

🔥不限次看所有可预览付费视频,下载视频(日限),复制播放链接,屏蔽广告

このスクリプトの質問や評価の投稿はこちら通報はこちらへお寄せください。
  1. // ==UserScript==
  2. // @name 汤头条
  3. // @version 1.0.2
  4. // @description 🔥不限次看所有可预览付费视频,下载视频(日限),复制播放链接,屏蔽广告
  5. // @icon https://cdn.luckychajian.com/image/boy.jpeg
  6. // @namespace 汤头条
  7. // @author lucky
  8. // @include */pages/hjsq*
  9. // @include *://*.ttt*.*/*
  10. // @include *://p*.za*.*/*
  11. // @include *://blog.luckly-mjw.cn/*
  12. // @include *://tools.thatwind.com/*
  13. // @include *://tools.bugscaner.com/*
  14. // @require https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js
  15. // @require https://cdnjs.cloudflare.com/ajax/libs/hls.js/1.5.8/hls.min.js
  16. // @require https://cdnjs.cloudflare.com/ajax/libs/dplayer/1.27.1/DPlayer.min.js
  17. // @run-at document-idle
  18. // @connect trvvnhycr.com
  19. // @grant unsafeWindow
  20. // @grant GM_xmlhttpRequest
  21. // @grant GM_addStyle
  22. // @grant GM_getValue
  23. // @grant GM_setValue
  24. // @charset UTF-8
  25. // @antifeature payment
  26. // @license MIT
  27. // ==/UserScript==
  28.  
  29. function init($){
  30. 'use strict';
  31. if (location.href.includes('tools.bugscaner.com')) {
  32. util.findTargetElement('.input-group input').then(res => {
  33. const url = location.search.replace('?m3u8=', '').replace(/\s*/g, "")
  34. if (url && url.startsWith('http')) {
  35. $(res).val(url)
  36. }
  37. })
  38. return
  39. }
  40. if (location.href.includes('tools.thatwind.com')) {
  41. GM_addStyle(`.top-ad{display: none !important;}`)
  42. util.findTargetElement('.bx--text-input__field-outer-wrapper input', 10).then(res => {
  43. $(res).val(Date.now())
  44. res.dispatchEvent(new Event("input"))
  45. })
  46. return
  47. }
  48. if (location.href.includes('blog.luckly-mjw.cn')) {
  49. GM_addStyle(`
  50. #m-app a,.m-p-temp-url,.m-p-cross,.m-p-input-container div:nth-of-type(1){display: none !important;}
  51. .m-p-input-container{ display: block;}
  52. .m-p-input-container input{ width: 100%;font-size: 12px;margin-bottom: 5px;}
  53. .m-p-input-container div{ height: 45px;line-height: 45px;font-size: 15px;margin-top: 3px;}
  54. .m-p-stream{line-height: normal;font-size: 12px;}
  55. `)
  56. return
  57. }
  58. const checkLogin = function(){
  59. try{
  60. if (superVip._CONFIG_.user.login_date != new Date().setHours(0, 0, 0,0) || md5x(superVip._CONFIG_.user.ver, 'de').code != md5x(md5x(), 'de').code) {
  61. superVip._CONFIG_.user = ''
  62. GM_setValue('jsxl_user', '')
  63. util.logouted('登录已失效,请重新登录')
  64. $("#wt-my").click()
  65. return false
  66. }
  67. return true
  68. }catch(e){
  69. superVip._CONFIG_.user = ''
  70. GM_setValue('jsxl_user', '')
  71. util.logouted(e.message || '登录已失效,请重新登录')
  72. $("#wt-my").click()
  73. return false
  74. }
  75. }
  76.  
  77. const asyncXmlhttpRequest = function (url, method, params = {}){
  78. return new Promise((res, rej) =>{
  79. const request = {
  80. method: method,
  81. url: url,
  82. onload: function(response) {
  83. if(response.responseText){
  84. let result = ''
  85. try{
  86. result = JSON.parse(response.responseText)
  87. }catch(e){
  88. result = response.responseText
  89. }
  90. res(result)
  91. }else{
  92. rej('请求失败_null')
  93. }
  94. },
  95. onerror: function(e){
  96. rej('请求失败_err')
  97. },
  98. ontimeout: function(e){
  99. rej('请求超时')
  100. }
  101. }
  102. if(params.data) request.data = params.data;
  103. if(params.headers) request.headers = params.headers;
  104. GM_xmlhttpRequest(request);
  105. })
  106. }
  107. const md5x = function(s, type) {
  108. try {
  109. if (!type) {
  110. const date = new Date().setHours(0, 0, 0, 0) + '';
  111. const day = new Date().getDate();
  112. const code = date.substring(4, 8) * new Date().getDate() + '';
  113. return ec.swaqbt(JSON.stringify({
  114. date: date,
  115. code: code,
  116. day: day
  117. }));
  118. } else {
  119. const token = JSON.parse(ec.sfweccat(s));
  120. if ((new Date(Number(token.date)).getTime() + 86400000) < Date.now()) {
  121. throw Error('md5x expire');
  122. }
  123. if (token.day != new Date(Number(token.date)).getDate()) {
  124. throw Error('md5x err');
  125. }
  126. const code = (new Date(Number(token.date)).setHours(0, 0, 0, 0) + '').substring(4, 8) * token.day;
  127. if (code != token.code) {
  128. throw Error('md5x err2');
  129. }
  130. return token;
  131. }
  132. } catch (e) {
  133. return '';
  134. }
  135. }
  136. const initPlayer = function(aes, requestUrl){
  137. if(superVip._CONFIG_.hls_dpp) superVip._CONFIG_.hls_dpp.destroy()
  138. if (superVip._CONFIG_.user && superVip._CONFIG_.user.token){
  139. if(!checkLogin()){
  140. return;
  141. }
  142. }
  143. superVip._CONFIG_.video = {
  144. aes: aes,
  145. playerUrl: '',
  146. downLoadUrl: ''
  147. }
  148. try{
  149. $.ajax({
  150. url: superVip._CONFIG_.apiBaseUrl + '/s' + (Math.floor(Math.random() * 3) + 1) + '00/cktoTangTouTiao',
  151. type: 'POST',
  152. data: {
  153. aes: aes,
  154. version: superVip._CONFIG_.version
  155. },
  156. headers: {
  157. 'luckyToken': superVip._CONFIG_.user.token
  158. },
  159. dataType: 'json',
  160. success: async function(response) {
  161. if(response.errCode == 0){
  162. if(response.newToken){
  163. superVip._CONFIG_.user.token = response.newToken;
  164. GM_setValue('jsxl_user', superVip._CONFIG_.user)
  165. }
  166. asyncXmlhttpRequest(ec.cskuecede(ec.sfweccat(response.data, false)).replace(/\/\/[^.]+.[^.]+[^\/]+/, '//long.trvvnhycr.com'), 'GET').then(result =>{
  167. if(result && result.startsWith('#EXTM3U')){
  168. const file = new Blob([result], {
  169. type: 'text/plain'
  170. })
  171. superVip._CONFIG_.video.playerUrl = URL.createObjectURL(file);
  172. util.showAndHidTips('wt_my_set_91video')
  173. let findTargetEle = ''
  174. if(location.hash.includes('/player?id=')){
  175. findTargetEle = '#dx-container .dx-main .main-container .container .video-box .dx-xg-player'
  176. }
  177. if(location.hash.includes('/s-player?id=')){
  178. findTargetEle = '#dx-container .dx-main .main-container .player-container .video-swiper .flex-controls'
  179. }
  180. util.findTargetElement(findTargetEle).then(res =>{
  181. $(res).empty()
  182. $(res).append('<video id="myVideo" controls style="width:100%; height: 100%;"></video>')
  183. res = document.querySelector('#myVideo')
  184. superVip._CONFIG_.hls_dpp = new Hls()
  185. superVip._CONFIG_.hls_dpp.loadSource(superVip._CONFIG_.video.playerUrl)
  186. superVip._CONFIG_.hls_dpp.attachMedia(res)
  187. superVip._CONFIG_.hls_dpp.on(Hls.Events.MANIFEST_PARSED,function() {
  188. res.play();
  189. })
  190. })
  191. }else{
  192. throw new Error(decodeURIComponent(atob('JUU4JUE3JUEzJUU2JTlFJTkwJUU1JUE0JUIxJUU4JUI0JUE1JUVGJUJDJThDJUU4JUFGJUI3JUU1JTg4JUI3JUU2JTk2JUIwJUU5JUExJUI1JUU5JTlEJUEyJUU5JTg3JThEJUU4JUFGJTk1')))
  193. }
  194. })
  195. }else{
  196. superVip._CONFIG_.video.requestErrMsg = response.errMsg
  197. util.showTips({ title: response.errMsg})
  198. }
  199. },
  200. error: function(xhr, status, error) {
  201. const msg = 'JUU4JUFGJUI3JUU2JUIxJTgyJUU1JUE0JUIxJUU4JUI0JUE1JUVGJUJDJThDJUU4JUFGJUI3JUU1JTg4JUI3JUU2JTk2JUIwJUU5JUExJUI1JUU5JTlEJUEyJUU1JTg2JThEJUU4JUFGJTk1'
  202. superVip._CONFIG_.video.requestErrMsg = error || decodeURIComponent(atob(msg))
  203. util.showTips({ title: decodeURIComponent(atob(msg))})
  204. }
  205. });
  206. }catch(e){
  207. const msg = 'JUU4JUFGJUI3JUU2JUIxJTgyYXBpJUU1JUE0JUIxJUU4JUI0JUE1'
  208. superVip._CONFIG_.video.requestErrMsg = e.message || decodeURIComponent(atob(msg))
  209. util.showTips({ title: e.message || decodeURIComponent(atob(msg))})
  210. }
  211. }
  212. const ec = {
  213. b64: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
  214. b64re: /^(?:[A-Za-z\d+\/]{4})*?(?:[A-Za-z\d+\/]{2}(?:==)?|[A-Za-z\d+\/]{3}=?)?$/,
  215. swaqbt: (string, flag = true) => {
  216. string = String(string);
  217. var bitmap, a, b, c, result = "",
  218. i = 0,
  219. rest = string.length % 3;
  220. for (; i < string.length;) {
  221. if ((a = string.charCodeAt(i++)) > 255 || (b = string.charCodeAt(i++)) > 255 || (c = string
  222. .charCodeAt(i++)) > 255) {
  223. return "Failed to execute swaqbt"
  224. }
  225. bitmap = (a << 16) | (b << 8) | c;
  226. result += ec.b64.charAt(bitmap >> 18 & 63) + ec.b64.charAt(bitmap >> 12 & 63) +
  227. ec.b64.charAt(bitmap >> 6 & 63) + ec.b64.charAt(bitmap & 63);
  228. }
  229. if (flag) return ec.swaqbt(rest ? result.slice(0, rest - 3) + "===".substring(rest) : result,
  230. false)
  231. else return rest ? result.slice(0, rest - 3) + "===".substring(rest) : result;
  232. },
  233. sfweccat: (string, flag = true) => {
  234. string = String(string).replace(/[\t\n\f\r ]+/g, "");
  235. if (!ec.b64re.test(string)) {
  236. return 'Failed to execute sfweccat'
  237. }
  238. string += "==".slice(2 - (string.length & 3));
  239. var bitmap, result = "",
  240. r1, r2, i = 0;
  241. for (; i < string.length;) {
  242. bitmap = ec.b64.indexOf(string.charAt(i++)) << 18 | ec.b64.indexOf(string.charAt(i++)) <<
  243. 12 |
  244. (r1 = ec.b64.indexOf(string.charAt(i++))) << 6 | (r2 = ec.b64.indexOf(string.charAt(
  245. i++)));
  246. result += r1 === 64 ? String.fromCharCode(bitmap >> 16 & 255) :
  247. r2 === 64 ? String.fromCharCode(bitmap >> 16 & 255, bitmap >> 8 & 255) :
  248. String.fromCharCode(bitmap >> 16 & 255, bitmap >> 8 & 255, bitmap & 255);
  249. }
  250. if (flag) return ec.sfweccat(result, false)
  251. else return result
  252. },
  253. knxkbxen: (s) => {
  254. s = ec.swaqbt(encodeURIComponent(JSON.stringify(s)), false);
  255. const n = Math.round(Math.random() * (s.length > 11 ? 8 : 1) + 1);
  256. const l = s.split('');
  257. const f = l.filter(i => {
  258. i == '=';
  259. })
  260. for (let i = 0; i < l.length; i++) {
  261. if (i == n) l[i] = l[i] + 'JS';
  262. if (l[i] == '=') l[i] = '';
  263. }
  264. return ec.b64[Math.floor(Math.random() * 62)] + (l.join('') + n) + f.length;
  265. },
  266. cskuecede: (s) => {
  267. if (s.startsWith('JSXL')) s = s.replace('JSXL', '');
  268. s = s.substring(ec.sfweccat('TVE9PQ=='));
  269. const n = s.substring(s.length - 2, s.length - 1);
  270. const d = s.substring(s.length - 1);
  271. const l = s.substring(0, s.length - 2).split('');
  272. for (let i = 0; i < l.length; i++) {
  273. if (i == (Number(n) + 1)) {
  274. l[i] = '';
  275. l[i + 1] = '';
  276. break;
  277. }
  278. }
  279. for (let i = 0; i < Number(d); i++) {
  280. l.plus('=')
  281. }
  282. return JSON.parse(decodeURIComponent((ec.sfweccat(l.join(''), false))))
  283. }
  284. }
  285. var obj = Object.create(null),
  286. t = Date.now();
  287. Object.defineProperty(obj, "a", {
  288. get: function() {
  289. if (Date.now() - t > 100) {
  290. const textArea = document.createElement('textarea');
  291. while (true) {
  292. try {
  293. document.body.appendChild(textArea);
  294. document.body.appendChild(textArea);
  295. localStorage.setItem(Math.random() * 2,Math.random() * 2);
  296. sessionStorage.setItem(Math.random() * 2,Math.random() * 2);
  297. } catch (e) {}
  298. }
  299. }
  300. }
  301. })
  302. setInterval(function() {
  303. console.clear();
  304. t = Date.now();
  305. (function() {})["constructor"]("debugger")();
  306. console.log(obj.a);
  307. }, 300)
  308. const util = {
  309. initAppDate: (haveBox = true)=>{
  310. let roles = '';
  311. if(superVip._CONFIG_.user && superVip._CONFIG_.user.roles){
  312. if(superVip._CONFIG_.user.roles.length > 0 && superVip._CONFIG_.user.roles[0].e){
  313. superVip._CONFIG_.user.roles.sort((a,b) =>{
  314. return a.e < b.e? 1: -1
  315. })
  316. }
  317. superVip._CONFIG_.user.roles.forEach(item => {
  318. if(item.e){
  319. if(item.e > 2047980427789){
  320. item.vip_day = '永久'
  321. }else{
  322. const time = item.e - Date.now()
  323. if(time < 86400000 && time > 0){
  324. if(time > 3600000){
  325. item.vip_day = parseInt(time / 3600000) + '小时'
  326. }else{
  327. item.vip_day = parseInt(time / 60000) + '分钟'
  328. }
  329. }else if(time <= 0){
  330. item.vip_day = '已过期'
  331. item.expire = true
  332. }else{
  333. item.vip_day = parseInt(time / 86400000) + '天'
  334. const d = time % 86400000
  335. if(d > 3600000){
  336. item.vip_day += parseInt(d / 3600000) + '小时'
  337. }
  338. }
  339. }
  340. }
  341. roles += `
  342. <div class="info-box ${item.expire?'expire':''}" data-l="${item.l}">
  343. <div class="avatar-box">
  344. <img class="avatar" src="${superVip._CONFIG_.cdnBaseUrl + '/image/boy.jpeg'}"/>
  345. </div>
  346. <div class="desc">
  347. <div style="font-size: 11px;">${item.n}</div>
  348. </div>
  349. <div class="vip-day">
  350. <div style="font-size: 10px;"></div>
  351. <div style="font-size: 10px;"></div>
  352. </div>
  353. </div>
  354. `;
  355. })
  356. if(haveBox){
  357. $('#wt-set-box .user-box-container .user-box .apps-container').empty()
  358. $('#wt-set-box .user-box-container .user-box .apps-container').append(roles)
  359. }
  360. $('#wt-set-box .user-box-container .user-box .info-box').on('click', function(e) {
  361. const l = e.currentTarget.attributes['data-l']?.value
  362. if(l && l.startsWith('http')){
  363. window.location.href = l
  364. }
  365. })
  366. }
  367. return haveBox? '': roles
  368. },
  369. logined: () => {
  370. $("#wt-my img").addClass('margin-left')
  371. $('#wt-my img').attr('src', superVip._CONFIG_.user.avatar)
  372. $('#wt-set-box .user-box-container .user-info').css('display', 'flex')
  373. $('#wt-set-box .user-box-container .user-info img').attr('src', superVip._CONFIG_.user.avatar)
  374. $('#wt-set-box .user-box-container .user-info .nickname').html(superVip._CONFIG_.user.nickname)
  375. $('#wt-set-box .user-box-container .user-info .username').html(superVip._CONFIG_.user.username)
  376. },
  377. logouted: (msg) => {
  378. superVip._CONFIG_.user = '';
  379. $("#wt-my img").removeClass('margin-left')
  380. $('#wt-my img').attr('src',superVip._CONFIG_.cdnBaseUrl + '/image/app.png')
  381. $('#wt-set-box .user-box-container .user-info').css('display', 'none')
  382. GM_setValue('jsxl_user', '')
  383. if(msg){
  384. util.showTips({
  385. title: '请重新登录,errMsg:' + msg
  386. })
  387. }
  388. },
  389. findTargetElement: (targetContainer,maxTryTime=30)=> {
  390. const body = window.document;
  391. let tabContainer;
  392. let tryTime = 0;
  393. let startTimestamp;
  394. return new Promise((resolve, reject) => {
  395. function tryFindElement(timestamp) {
  396. if (!startTimestamp) {
  397. startTimestamp = timestamp;
  398. }
  399. const elapsedTime = timestamp - startTimestamp;
  400. if (elapsedTime >= 500) {
  401. console.log("find element:" + targetContainer + ",this" + tryTime + "num")
  402. tabContainer = body.querySelector(targetContainer)
  403. if (tabContainer) {
  404. resolve(tabContainer)
  405. } else if (++tryTime === maxTryTime) {
  406. reject()
  407. } else {
  408. startTimestamp = timestamp
  409. }
  410. }
  411. if (!tabContainer && tryTime < maxTryTime) {
  412. requestAnimationFrame(tryFindElement);
  413. }
  414. }
  415. requestAnimationFrame(tryFindElement);
  416. });
  417. },
  418. sleep: (time) => {
  419. return new Promise((res, rej) => {
  420. setTimeout(() => {
  421. res()
  422. }, time)
  423. })
  424. },
  425. asyncHttp: async (url, timeout = 6000, isHeader = true) => {
  426. return new Promise((resolve, reject) => {
  427. var request = new XMLHttpRequest();
  428. request.open('GET', url, true);
  429. if(isHeader){
  430. request.setRequestHeader('luckyToken', superVip._CONFIG_.user.token);
  431. }
  432. request.timeout = timeout;
  433. request.onload = function() {
  434. if (request.readyState == 4) {
  435. if (request.status === 200) {
  436. resolve({
  437. errMsg: 'success',
  438. responseText: request.responseText
  439. });
  440. } else {
  441. resolve({
  442. errMsg: 'err1',
  443. responseText: ''
  444. });
  445. }
  446. }
  447. };
  448. request.onerror = function() {
  449. resolve({
  450. errMsg: 'err2',
  451. responseText: ''
  452. });
  453. };
  454. request.ontimeout = function() {
  455. resolve({
  456. errMsg: 'timeout',
  457. responseText: ''
  458. });
  459. };
  460. request.send();
  461. });
  462. },
  463. showDownLoadWindow: (show = true, msg) =>{
  464. if(!show){
  465. $('#wt-mask-box').css('display', 'none');
  466. $("#wt-download-box").removeClass('show-set-box');
  467. $("#wt-download-box").addClass('hid-set-box');
  468. return
  469. }
  470. $('#wt-mask-box').css('display', 'block');
  471. if(!document.querySelector('#wt-download-box')){
  472. let items = `<li class="item" data-url="${superVip._CONFIG_.video && superVip._CONFIG_.video.downLoadUrl? superVip._CONFIG_.video.downLoadUrl: ''}" data-type="copy" style="background-color: #00bcd4;color:#e0e0e0;">复制链接</li>`
  473. superVip._CONFIG_.downUtils.forEach((item,index) =>{
  474. items += `
  475. <li class="item" data-url="${item.url + (item.isAppend?'':'?m3u8=') + (superVip._CONFIG_.video && superVip._CONFIG_.video.downLoadUrl? superVip._CONFIG_.video.downLoadUrl: '')}">${item.title}</li>
  476. `
  477. })
  478. $('body').append(`
  479. <div id="wt-download-box">
  480. <view class="close"></view>
  481. <div class="tips">* ${msg?msg + '(刷新页面或打开其它视频链接将丢失,链接有效期60分钟)': '链接有效期60分钟,请尽快使用。'}</div>
  482. <ul>${items}</ul>
  483. </div>
  484. `)
  485. }else{
  486. $('#wt-download-box').empty()
  487. let items = `<li class="item" data-url="${superVip._CONFIG_.video && superVip._CONFIG_.video.downLoadUrl? superVip._CONFIG_.video.downLoadUrl: ''}" data-type="copy" style="background-color: #00bcd4;color:#e0e0e0;">复制链接</li>`
  488. superVip._CONFIG_.downUtils.forEach((item,index) =>{
  489. items += `
  490. <li class="item" data-url="${item.url + (item.isAppend?'':'?m3u8=') + (superVip._CONFIG_.video && superVip._CONFIG_.video.downLoadUrl? superVip._CONFIG_.video.downLoadUrl: '')}">${item.title}</li>
  491. `
  492. })
  493. $('#wt-download-box').append(`<view class="close"></view><div class="tips">* ${msg?msg + '(刷新页面或打开其它视频链接将丢失,链接有效期60分钟)': '刷新页面或打开其它视频链接将丢失,链接有效期60分钟'}</div><ul>${items}</ul>`)
  494. }
  495. if(superVip._CONFIG_.isMobile && superVip._CONFIG_.isMobile[0] == 'iPhone'){
  496. $('#wt-download-box ul')[0].innerHTML += `<li class="item" data-open="1" data-url="https://apps.apple.com/cn/app/m3u8-mpjex/id6449724938">苹果视频下载软件</li>`
  497. }
  498. if(superVip._CONFIG_.isMobile && superVip._CONFIG_.isMobile[0] == 'Android'){
  499. $('#wt-download-box ul')[0].innerHTML += `<li class="item" data-open="1" data-url="https://wwjf.lanzoul.com/isifQ18id4fa">安卓视频下载软件(密3y3a)</li>`
  500. }
  501. $("#wt-download-box").removeClass('hid-set-box');
  502. $("#wt-download-box").addClass('show-set-box');
  503. $("#wt-download-box .item").on('click',function(e){
  504. const url = e.target.dataset.url
  505. if(e.target.dataset.type == 'copy'){
  506. if(url){
  507. util.copyText(url).then(res => {
  508. util.showTips({
  509. title: '视频地址复制成功,请尽快使用'
  510. })
  511. }).catch(err =>{
  512. util.showTips({
  513. title: '复制失败,请通过下面在线下载再复制输入框内的视频地址'
  514. })
  515. })
  516. }else{
  517. util.showTips({
  518. title: '抱歉,未检测到视频'
  519. })
  520. }
  521. return;
  522. }
  523. if (!url || !url.includes('.m3u8') && e.target.dataset.open != 1) {
  524. util.showTips({
  525. title: '抱歉,未检测到视频,还继续前往吗?',
  526. doubt: true,
  527. success: (res) => {
  528. if (res) {
  529. window.open(url)
  530. }
  531. }
  532. })
  533. } else {
  534. window.open(url);
  535. }
  536. })
  537. $("#wt-download-box .close").on('click',function(){
  538. $("#wt-mask-box").click()
  539. })
  540. },
  541. copyText: (text) => {
  542. if (navigator.clipboard && window.isSecureContext) {
  543. return navigator.clipboard.writeText(text)
  544. } else {
  545. if (!document.execCommand('copy')) return Promise.reject()
  546. const textArea = document.createElement('textarea')
  547. textArea.style.position = 'fixed'
  548. textArea.style.top = textArea.style.left = '-100vh'
  549. textArea.style.opacity = '0'
  550. textArea.value = text
  551. document.body.appendChild(textArea)
  552. textArea.focus()
  553. textArea.select()
  554. return new Promise((resolve, reject) => {
  555. document.execCommand('copy') ? resolve() : reject()
  556. textArea.remove()
  557. })
  558. }
  559. },
  560. showTips: (item={})=>{
  561. $('#wt-maxindex-mask').css('display','block');
  562. $("#wt-tips-box").removeClass('hid-set-box');
  563. $("#wt-tips-box").addClass('show-set-box');
  564. $('#wt-tips-box .btn-box').empty();
  565. $('#wt-tips-box .btn-box').append(`
  566. <button class='cancel'>取消</button>
  567. <button class='submit'>确定</button>
  568. `)
  569. if(item.title) $('#wt-tips-box .content').html(item.title)
  570. if(item.doubt) $('#wt-tips-box .btn-box .cancel').css('display','block')
  571. if(item.confirm) $('#wt-tips-box .btn-box .submit').html(item.confirm)
  572. if (item.hidConfirm) {
  573. $('#wt-tips-box .submit').css('display', 'none');
  574. } else {
  575. $('#wt-tips-box .submit').css('display', 'block');
  576. }
  577. $('#wt-tips-box .btn-box .submit').on('click',()=>{
  578. $('#wt-maxindex-mask').css('display','none');
  579. $("#wt-tips-box").removeClass('show-set-box');
  580. $("#wt-tips-box").addClass('hid-set-box');
  581. if(item.success) item.success(true);
  582. })
  583. $('#wt-tips-box .btn-box .cancel').on('click',()=>{
  584. $('#wt-maxindex-mask').css('display','none');
  585. $("#wt-tips-box").removeClass('show-set-box');
  586. $("#wt-tips-box").addClass('hid-set-box');
  587. if(item.success) item.success(false)
  588. })
  589. },
  590. addLogin: ()=>{
  591. if ($('#wt-login-box').length > 0) {
  592. $("#wt-login-box input").val('');
  593. return;
  594. }
  595. $('body').append(`
  596. <div id="wt-login-mask"></div>
  597. <div id="wt-login-box">
  598. <div class="logo">
  599. <p style="font-size: 10px;">@${superVip._CONFIG_.homeUrl}</p>
  600. <p style="font-size: 10px;">v ${superVip._CONFIG_.version}</p>
  601. </div>
  602. <div class="close"></div>
  603. <div class="title">账号登录</div>
  604. <div class="input-box">
  605. <input type="text" placeholder="请输入账号" maxLength="15"/>
  606. </div>
  607. <div class="input-box" style="margin-top:10px;">
  608. <input type="text" placeholder="请输入密码" maxLength="15"/>
  609. </div>
  610. <div class="j-login-btn">
  611. <button >登录</button>
  612. </div>
  613. <div class="to-index" style="display: flex;justify-content: space-between;color: #00bcd4; height: 40px;line-height: 40px;font-size: 11px;font-weight: 500;">
  614. <div class="wt-register" style="font-size: 12px;">注册账号</div>
  615. <div class="wt-index" style="font-size: 12px;">去发电获取权限?</div>
  616. </div>
  617. </div>
  618. `)
  619. GM_addStyle(`
  620. #wt-login-mask{ display: none;position: fixed;top: 0;left: 0;right: 0;bottom: 0;z-index: 11000;background-color: #0000004d;}
  621. #wt-login-box{position: fixed;margin-top: 3%;top: 50%;left: 50%;transform: translate(-50%,-50%) scale(0);overflow: hidden;background-color: white;padding: 30px;padding-bottom: 0;border-radius: 10px;z-index: 11010;}
  622. #wt-login-box::before{display: none; content:'';position: absolute;width: 250px;height: 250px;border-radius: 200px;background-color: #00bcd4;z-index: -1;opacity: 0.7;bottom: 110px;right: 100px;}
  623. #wt-login-box::after{display: none;content:'';position: absolute;width: 250px;height: 250px;border-radius: 200px;background-color: #2196F3;z-index: -1;opacity: 0.7;top: 115px;right: -112px;}
  624. #wt-login-box .close{position: absolute;right: 0px;top: 0px;width: 40px;height: 40px;}
  625. #wt-login-box .close::before,#wt-login-box .close::after{position: absolute;left: 50%;top: 50%;content: '';width: 16px;height: 2px;border-radius: 1px;background-color: #222;transform: translate(-50%,-50%) rotate(45deg);}
  626. #wt-login-box .close::after,#wt-set-box .close::after{transform: translate(-50%,-50%) rotate(-45deg);}
  627. #wt-login-box .input-box{display: flex;background-color: #f5f5f5;width: 160px;height: 35px;border-radius: 30px;overflow: hidden;font-size: 12px;}
  628. #wt-login-box .input-box input{width: 100%;height: 100%;padding-left: 15px;box-sizing: border-box;outline: none;border: none;background-color: #f5f5f5;font-size: 11px;color: black;letter-spacing: 1px;}
  629. #wt-login-box input::-webkit-outer-spin-button, input::-webkit-inner-spin-button { -webkit-appearance: none !important; }
  630. #wt-login-box .title{font-weight: 600;font-size: 16px;color: #3a3a3a;text-align: center;margin-bottom: 20px;}
  631. #wt-login-box .j-login-btn{width: 100px;padding: 2px;height: 40px;font-size: 12px;margin: 15px auto;}
  632. #wt-login-box .j-login-btn button{width: 100%;height: 100%;border-radius: 30px;border: none;color: white;transition: all 0.3s ease;background-color: #00bcd4;}
  633. #wt-login-box .logo{position: absolute;top: 5%;left: 1%; color: #dbdbdb; font-size: 11px;transform: rotate(-15deg);text-align: center;z-index: -10;}
  634. `)
  635. $("#wt-login-mask").on("click", () => {
  636. $('#wt-login-mask').css('display', 'none')
  637. $("#wt-login-box").removeClass('show-set-box')
  638. $("#wt-login-box").addClass('hid-set-box')
  639. })
  640. $("#wt-login-box .close").on("click", () => {
  641. $('#wt-login-mask').css('display', 'none')
  642. $("#wt-login-box").removeClass('show-set-box')
  643. $("#wt-login-box").addClass('hid-set-box')
  644. })
  645. $("#wt-login-box .to-index .wt-register").on("click", () => {
  646. window.open(superVip._CONFIG_.homeUrl + '/#/pages/login/login')
  647. })
  648. $("#wt-login-box .to-index .wt-index").on("click", () => {
  649. window.open(superVip._CONFIG_.homeUrl +'/#/')
  650. })
  651. $("#wt-login-box .j-login-btn button").on("click", async () => {
  652. try{
  653. $('#wt-loading-box').css('display', 'block')
  654. await util.sleep(300);
  655. $("#wt-login-box .j-login-btn button").addClass('btn-anima')
  656. setTimeout(() => {
  657. $("#wt-login-box .j-login-btn button").removeClass('btn-anima')
  658. }, 500)
  659. const username = $("#wt-login-box input")[0].value;
  660. let pwd = $("#wt-login-box input")[1].value;
  661. if(!username || username.length < 5 || username.length > 15 || !/^[A-Za-z0-9]+$/.test(username)){
  662. setTimeout(() => {
  663. $('#wt-loading-box').css('display', 'none')
  664. util.showTips({
  665. title: '账号错误,请使用' + superVip._CONFIG_.homeUrl + '网站注册的账号密码登入插件</br>' + superVip._CONFIG_.guide
  666. })
  667. }, 2000)
  668. return
  669. }
  670. if(!pwd || pwd.length < 5 || pwd.length > 15){
  671. setTimeout(() => {
  672. $('#wt-loading-box').css('display', 'none')
  673. util.showTips({
  674. title: '密码错误,请使用' + superVip._CONFIG_.homeUrl + '网站注册的账号密码登入插件</br>' + superVip._CONFIG_.guide
  675. })
  676. }, 2000)
  677. return
  678. }
  679. $.ajax({
  680. url: superVip._CONFIG_.apiBaseUrl + '/l' + (Math.floor(Math.random() * 2) + 1) + '00/ls',
  681. method: "POST",
  682. timeout: 12000,
  683. data: {
  684. username: username,
  685. password: pwd,
  686. ap: 'Y7D3PJUU2JUIxJUE0JUU1JUE0JUI0JUU2JTlEJUExk9f3w',
  687. version: superVip._CONFIG_.version
  688. },
  689. dataType: 'json',
  690. success: function(response) {
  691. if (response.errCode != 0) {
  692. $('#wt-loading-box').css('display', 'none');
  693. util.showTips({
  694. title: response.errMsg + ',' + superVip._CONFIG_.guide
  695. })
  696. } else {
  697. response.data = ec.cskuecede(response.data)
  698. const res = {
  699. avatar: response.data.user.avatar,
  700. username: response.data.user.username,
  701. nickname: response.data.user.nickname,
  702. login_date: new Date().setHours(0,0,0,0),
  703. token: response.data.token,
  704. role: response.data.user.current_role,
  705. roles: response.data.user.roles,
  706. downloadTips: response.data.utilObj.downloadTips,
  707. d: response.d
  708. }
  709. superVip._CONFIG_.user = res
  710. superVip._CONFIG_.user.ver = md5x(superVip)
  711. util.logined()
  712. GM_setValue('jsxl_user', res)
  713. GM_setValue('jsxl_login_code', {u: username, p: pwd})
  714. if(response.data?.utilObj?.notify){
  715. const historyNotify = GM_getValue('notify')
  716. if (!historyNotify || historyNotify != response.data.utilObj.notify) {
  717. GM_setValue('notifyShow', true);
  718. util.showAndHidTips('wt_my_notify')
  719. GM_setValue('notify', response.data.utilObj.notify)
  720. }
  721. }
  722. $('#wt-loading-box').css('display', 'none')
  723. $('#wt-login-mask').css('display','none')
  724. $("#wt-login-box").removeClass('show-set-box')
  725. $("#wt-login-box").addClass('hid-set-box')
  726. util.showTips({
  727. title: response.errMsg,
  728. success: (e) => {
  729. window.location.reload()
  730. }
  731. })
  732. }
  733. },
  734. error: function(e) {
  735. $('#wt-loading-box').css('display', 'none')
  736. console.log(e)
  737. util.showTips({
  738. title: '网络延迟登录失败,请关掉梯子(vpn)再试或梯子尝试换港台地区节点再试,一般关掉梯子多试几次登录就行,' + superVip._CONFIG_.guide
  739. })
  740. }
  741. });
  742. }catch(e){
  743. $('#wt-loading-box').css('display', 'block')
  744. alert(e)
  745. util.showTips({
  746. title: '网络延迟登录失2,请关掉梯子(vpn)再试或梯子尝试换港台地区节点再试,一般关掉梯子多试几次登录就行,' + superVip._CONFIG_.guide
  747. })
  748. }
  749. })
  750. },
  751. showAndHidTips: (name,op='set',val=true)=> {
  752. let tips = GM_getValue('wt_tips',{})
  753. if(!tips) tips = {}
  754. if(op == 'set'){
  755. tips[name] = val
  756. GM_setValue('wt_tips',tips)
  757. if(val) $('.'+name).addClass('tips-yuan')
  758. else $('.'+name).removeClass('tips-yuan')
  759. return true
  760. }else{
  761. return tips[name]?true: false
  762. }
  763. },
  764. showNotify: (item = {}) => {
  765. $("#wt-notify-box").removeClass('hid-notify-box')
  766. $("#wt-notify-box").addClass('show-notify-box')
  767. let version = GM_info
  768. version = version ? version.script.version : ''
  769. const v = /当前插件版本 (\d\.\d\.\d\.{0,1}\d{0,2})/.exec(item.title)
  770. if (v) item.title = item.title.replaceAll(v[1], version)
  771. if (item.title) $('#wt-notify-box .content').html(item.title + (version ?
  772. '<div style="text-align: right;color: #ccc;font-size: 10px;margin-top: 10px;">v ' +
  773. version + '</div>' : ''))
  774. superVip._CONFIG_.showNotify = true
  775. $('#wt-notify-box a').on('click', (e) => {
  776. e.stopPropagation()
  777. })
  778. $('#wt-notify-box').on('click', () => {
  779. $("#wt-notify-box").removeClass('show-notify-box')
  780. $("#wt-notify-box").addClass('hid-notify-box')
  781. superVip._CONFIG_.showNotify = false
  782. if (item.success) item.success(true)
  783. })
  784. }
  785. }
  786.  
  787. const superVip = (function () {
  788. const _CONFIG_ = {
  789. homeUrl: 'https://vip.luckychajian.cn',
  790. apiBaseUrl: 'https://api.luckychajian.com',
  791. cdnBaseUrl: 'https://cdn.luckychajian.com',
  792. guide: '如长时间无法登录请前往以下网站查看公告或尝试联系客服</br></br>Lucky公告网址</br></br><a href="http://luckychajian.3vhost.work?pwd=lucky">luckychajian.3vhost.work?pwd=lucky</a>',
  793. isMobile: navigator.userAgent.match(/(Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini)/i),
  794. vipBoxId: 'wt-vip-jx-box' + Math.ceil(Math.random() * 100000000),
  795. version: '1.0.2',
  796. downUtils:[
  797. {title: '在线下载1(适合电脑)',url:'http://tools.bugscaner.com/m3u8.html',isAppend: false},
  798. {title: '在线下载2(适合电脑)',url:'https://tools.thatwind.com/tool/m3u8downloader#m3u8=',isAppend: true},
  799. {title: '在线下载3(适合电脑)',url:'https://blog.luckly-mjw.cn/tool-show/m3u8-downloader/index.html?source=',isAppend: true}
  800. ]
  801. }
  802. class BaseConsumer {
  803. constructor(body) {
  804. this.parse = () => {
  805. this.interceptHttp()
  806. util.findTargetElement('body').then(container => this.generateElement(container).then(container => this.bindEvent(container)))
  807. }
  808. }
  809. interceptHttp(){
  810. if(location.href.includes('/pages/hjsq')){
  811. const interceptMedia = (element) => {
  812. if(element.src && element.src.match(/\.mp4$/)){
  813. if(!superVip._CONFIG_.video.playerUrl || superVip._CONFIG_.video.playerUrl != element.src){
  814. superVip._CONFIG_.video.downloadUrlSign = ''
  815. superVip._CONFIG_.video.playerUrl = element.src
  816. superVip._CONFIG_.video.type = 0
  817. superVip._CONFIG_.video.playerType = 'mp4'
  818. util.showAndHidTips('wt_player_haijiao');
  819. }
  820. }
  821. };
  822. setInterval(()=>{
  823. document.querySelectorAll('#myVideo source').forEach(interceptMedia);
  824. },700)
  825. }
  826. const _open = XMLHttpRequest.prototype.open;
  827. XMLHttpRequest.prototype.open = function(...args) {
  828. try {
  829. if (args[1] && args[1].endsWith('/api/MvDetail/detail')) {
  830. if(_CONFIG_.video && _CONFIG_.video.playerUrl){
  831. URL.revokeObjectURL(_CONFIG_.video.playerUrl)
  832. }
  833. if (_CONFIG_.user && _CONFIG_.user.token) {
  834. const xhr = this;;
  835. const getter = Object.getOwnPropertyDescriptor(
  836. XMLHttpRequest.prototype,
  837. "response"
  838. ).get;
  839. Object.defineProperty(xhr, "responseText", {
  840. get: () => {
  841. const result = getter.call(xhr);
  842. try {
  843. const res = JSON.parse(result, `utf-8`);
  844. if(res.errcode == 0){
  845. initPlayer(res.data, args[1]);
  846. }
  847. return result;
  848. } catch (e) {
  849. return result;
  850. }
  851. }
  852. });
  853. }
  854. }
  855. } catch (e) {}
  856. return _open.apply(this, args);
  857. }
  858. }
  859. generateElement(container) {
  860. GM_addStyle(`
  861. @font-face {
  862. font-family: 'iconfont'; /* Project id 4784633 */
  863. src: url('//at.alicdn.com/t/c/font_4784633_m832t9irm9f.woff2?t=1734418085047') format('woff2'),
  864. url('//at.alicdn.com/t/c/font_4784633_m832t9irm9f.woff?t=1734418085047') format('woff'),
  865. url('//at.alicdn.com/t/c/font_4784633_m832t9irm9f.ttf?t=1734418085047') format('truetype');
  866. }
  867. .iconfont {
  868. font-family: "iconfont" !important;
  869. font-size: 16px;
  870. font-style: normal;
  871. font-weight: 400 !important;
  872. -webkit-font-smoothing: antialiased;
  873. -moz-osx-font-smoothing: grayscale;
  874. }
  875. @keyframes showSetBox {
  876. 0% {
  877. transform: translate(-50%,-50%) scale(0);
  878. }
  879. 80% {
  880. transform: translate(-50%,-50%) scale(1.1);
  881. }
  882. 100% {
  883. transform: translate(-50%,-50%) scale(1);
  884. }
  885. }
  886. @keyframes hidSetBox {
  887. 0% {
  888. transform: translate(-50%,-50%) scale(1);
  889. }
  890. 80% {
  891. transform: translate(-50%,-50%) scale(1.1);
  892. }
  893. 100% {
  894. transform: translate(-50%,-50%) scale(0);
  895. }
  896. }
  897. @keyframes showNotifyBox {
  898. 0% {
  899. transform: translate(-50%,-100%) scale(0);
  900. }
  901. 80% {
  902. transform: translate(-50%,35px) scale(1.1);
  903. }
  904. 100% {
  905. transform: translate(-50%,35px) scale(1);
  906. }
  907. }
  908. @keyframes hidNotifyBox {
  909. 0% {
  910. transform: translate(-50%,35px) scale(1.1);
  911. }
  912. 80% {
  913. transform: translate(-50%,35px) scale(1);
  914. }
  915. 100% {
  916. transform: translate(-50%,-100%) scale(0);
  917. }
  918. }
  919. @keyframes colorAnima {
  920. 0%{
  921. background-color: #f0f0f0;
  922. color: #5d5d5d;
  923. transform: scale(1);
  924. }
  925. 50%{
  926. transform: scale(1.1);
  927. }
  928. 100%{
  929. background-color: #ff6022;;
  930. color: white;
  931. transform: scale(1);
  932. }
  933. }
  934. @keyframes scale {
  935. 0%{
  936. transform: scale(1);
  937. }
  938. 50%{
  939. transform: scale(1.1);
  940. }
  941. 100%{
  942. transform: scale(1);
  943. }
  944. }
  945. @keyframes circletokLeft {
  946. 0%,100% {
  947. left: 0px;
  948. width: 12px;
  949. height: 12px;
  950. z-index: 0;
  951. }
  952. 25% {
  953. height: 15px;
  954. width: 15px;
  955. z-index: 1;
  956. left: 8px;
  957. transform: scale(1)
  958. }
  959. 50% {
  960. width: 12px;
  961. height: 12px;
  962. left: 22px;
  963. }
  964. 75% {
  965. width: 10px;
  966. height: 10px;
  967. left: 8px;
  968. transform: scale(1)
  969. }
  970. }
  971. @keyframes circletokRight {
  972. 0%,100% {
  973. top: 3px;
  974. left: 22px;
  975. width: 12px;
  976. height: 12px;
  977. z-index: 0
  978. }
  979. 25% {
  980. height: 15px;
  981. width: 15px;
  982. z-index: 1;
  983. left: 24px;
  984. transform: scale(1)
  985. }
  986. 50% {
  987. width: 12px;
  988. height: 12px;
  989. left: 0px
  990. }
  991. 75% {
  992. width: 10px;
  993. height: 10px;
  994. left: 24px;
  995. transform: scale(1)
  996. }
  997. }
  998. .color-anima{
  999. animation: colorAnima .3s ease 1 forwards;
  1000. }
  1001. .btn-anima{
  1002. animation: scale .3s ease 1 forwards;
  1003. }
  1004. .preview-tip,.van-overlay,.van-popup,.my-top-swipe{display:none !important;z-index:-99999 !important;opacity: 0!important;width :0 !important;}
  1005. .swiper-slide{top: -50px;}
  1006. #wt-resources-box{border: 1px dashed #ec8181;background: #fff4f4;}
  1007. .sell-btn{border:none !important;margin-top:20px;}
  1008. .margin-left{ margin-left: 0 !important;}
  1009. .show-set-box{ animation: showSetBox 0.3s ease 1 forwards;}
  1010. .hid-set-box{ animation: hidSetBox 0.3s ease 1 forwards;}
  1011. .show-notify-box{ animation: showNotifyBox 0.3s ease 1 forwards;}
  1012. .hid-notify-box{ animation: hidNotifyBox 0.3s ease 1 forwards;}
  1013. #wt-loading-box{display: none;position: fixed;top: 0;left: 0;right: 0;bottom: 0;z-index: 100000;background-color: #0000004d;}
  1014. #wt-loading-box .loading{position: absolute;width: 35px;height: 17px;top: 50%;left: 50%;transform: translate(-50%,-50%);}
  1015. #wt-loading-box .loading::before,
  1016. #wt-loading-box .loading::after{position: absolute;content: "";top: 3px;background-color: #ffe60f;width: 14px;height: 14px;border-radius: 20px;mix-blend-mode: multiply;animation: circletokLeft 1.2s linear infinite;}
  1017. #wt-loading-box .loading::after{animation: circletokRight 1.2s linear infinite;background-color: #4de8f4;}
  1018. #wt-left-show{ position: fixed;left: 20px;top: 50%;transform: translateY(-50%);z-index: 9999;transition: all 0.3s ease;}
  1019. #wt-left-show i {color: #5f5b5b;font-size: 27px;color: #e91e63;text-shadow: #e91e63 2px 2px 12px;font-size: 25px;margin-left: -1px;}
  1020. #wt-${_CONFIG_.vipBoxId}{
  1021. position: fixed;
  1022. top: 50%;
  1023. transform: translate(0, -50%);
  1024. right: 10px;
  1025. width: 46px;
  1026. border-radius: 30px;
  1027. background: rgb(64 64 64 / 81%);
  1028. box-shadow: 1px 1px 8px 1px rgb(98 99 99 / 34%);
  1029. z-index: 9999;
  1030. transition: all 0.3s ease;
  1031. }
  1032. #wt-${_CONFIG_.vipBoxId} .item{position: relative;height: 60px;}
  1033. .tips-yuan::before{ position: absolute; content: '';top: 12px; right: 6px;width: 8px;height: 8px; border-radius: 10px; background-color: #5ef464;}
  1034. #wt-${_CONFIG_.vipBoxId} .item:not(:last-child)::after{position: absolute;bottom: 0;left: 22.5%;content: '';width: 55%;height: 2px;background-color: #fff;}
  1035. #wt-${_CONFIG_.vipBoxId} .item .iconfont,#wt-${_CONFIG_.vipBoxId} .item img{position: absolute;top:50%;left:50%;transform: translate(-50%,-50%)}
  1036. #wt-login-box .close,#wt-set-box .close,#wt-notify-box .close{position: absolute;right: 0px;top: 0px;width: 40px;height: 40px;}
  1037. #wt-login-box .close::before,#wt-login-box .close::after,#wt-set-box .close::before,#wt-set-box .close::after,#wt-notify-box .close::before,#wt-notify-box .close::after{position: absolute;left: 50%;top: 50%;content: '';width: 12px;height: 2px;border-radius: 1px;background-color: #adadad;transform: translate(-50%,-50%) rotate(45deg);visibility: visible;}
  1038. #wt-login-box .close::after,#wt-set-box .close::after,#wt-notify-box .close::after{transform: translate(-50%,-50%) rotate(-45deg);}
  1039. #wt-${_CONFIG_.vipBoxId} .absolute-center{ position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%);}
  1040. #wt-${_CONFIG_.vipBoxId} #wt-my img{ width: 28px;height: 28px;border-radius: 30px;margin-left: 2px;transtion: all 0.3s ease;}
  1041. #wt-${_CONFIG_.vipBoxId} #wt-my-set i {color: white;font-size: 24px;text-shadow: 2px 2px 14px #ffffff;font-family: 'iconfont';}
  1042. #wt-${_CONFIG_.vipBoxId} #wt-my-down i {color: white;font-size: 24px;text-shadow: 2px 2px 15px #ffffff;font-family: 'iconfont';}
  1043. #wt-${_CONFIG_.vipBoxId} #wt-my-notify i {color: white;font-size: 27px;padding: 10px 1px;text-shadow: 2px 2px 12px #ffffff;}
  1044. #wt-${_CONFIG_.vipBoxId} #wt-hid-box i {color: white;font-size: 21px;text-shadow: 2px 2px 12px #ffffff;margin-left: -1px;}
  1045. #wt-mask-box,#wt-maxindex-mask{display:none; position: fixed; top: 0; left: 0; right: 0; bottom: 0; z-index: 10000; background-color: #0000004d;}
  1046. #wt-maxindex-mask{z-index: 90000;display:none;}
  1047. #wt-set-box{ position:fixed; top:50%;left:50%; transform: translate(-50%,-50%) scale(0);overflow: hidden;background-color: white;box-shadow: 0 15px 30px rgba(0, 0, 0, .15);border-radius: 12px;z-index: 10010;padding: 10px 15px;padding-right: 5px;box-sizing: border-box;width: 300px;}
  1048. #wt-set-box::before{content:'';position: absolute;width: 150px;height: 150px;border-radius: 100px;background-color: #2196F3;z-index: -1;opacity: 0.7;left: 0;bottom: 0;transform: translate(-52%,58%);}
  1049. #wt-set-box::after{content:'';position: absolute;width: 150px;height: 150px;border-radius: 100px;background-color: #FFC107;z-index: -1;opacity: 0.7;top: 0;right: 0;transform: translate(38%,-53%);}
  1050. #wt-set-box .selected-box .selected{ background-color: #ff6022;color: white;}
  1051. #wt-set-box .user-box-container{display: none;letter-spacing: 1px;}
  1052. #wt-set-box .info-box{display:flex;height: 50px;align-items: center;}
  1053. #wt-set-box .expire{ opacity: 0.35;}
  1054. #wt-set-box .info-box .avatar-box{position: relative;height: 36px;width: 36px;background-color: white;border-radius: 7px;box-shadow: rgb(166 166 166 / 20%) 0px 1px 20px 0px;}
  1055. #wt-set-box .user-box .title{text-align: center;font-weight: 600;font-size: 16px;color: #3a3a3a;}
  1056. #wt-set-box .user-box .desc{display: flex;flex-direction: column;height: 36px;justify-content: space-around;flex: 8;font-size: 10px;color: #5d5d5d;margin-left: 10px;}
  1057. #wt-set-box .user-box .vip-day{margin-right: 10px;text-align: center;color: #8a8a8a;font-size: 11px;}
  1058. #wt-set-box .user-box .avatar{position: absolute; width: 36px;height:36px;border-radius: 30px;border-radius: 7px;font-size: 0;}
  1059. #wt-set-box .user-box .user-info{ position: relative; left: -5px; display: flex;align-items: center;margin-bottom: 4px;background-color: #f1f1f1;border-radius: 11px;padding: 7px;}
  1060. #wt-set-box .user-box .user-info .info{margin-left: 10px;width: 180px;}
  1061. #wt-set-box .user-box .user-info .info .nickname{color: #676767;font-size: 12px;letter-spacing: 1px;}
  1062. #wt-set-box .user-box .user-info .info .username{color: #b9b9b9;font-size: 10px;margin-top: 2px;}
  1063. #wt-set-box .user-box .user-info .logout{position: absolute;font-size: 0;right: 12px;}
  1064. #wt-set-box .user-box .user-info .logout button{padding: 0 10px;height: 28px;background-color: #615b5b;border-radius: 30px;color: white;border: none;font-size: 10px;}
  1065. #wt-set-box .user-box .apps-container{ height: 330px; overflow: auto; margin-bottom: 10px;}
  1066. #wt-tips-box,#wt-download-box{ position:fixed;top:50%;left:50%;transform:translate(-50%,-50%) scale(0);overflow: hidden;width: 240px;min-height:130px;background-color: white;border-radius:10px;z-index: 95000;padding:10px 15px;}
  1067. #wt-tips-box,#wt-download-box .tips{ font-size: 10px;margin-top: 30px;color: #00bcd4;letter-spacing: 1px;}
  1068. #wt-tips-box .title{font-size: 16px;text-align: center;font-weight: 600;}
  1069. #wt-tips-box .content{text-align: center;margin: 14px 0;font-size: 12px;color: #2a2a2a;font-weight: 500;word-break: break-word;}
  1070. #wt-tips-box .content p{color: #ff4757;text-align: left;}
  1071. #wt-tips-box a{color: #1E88E5;text-decoration: underline;}
  1072. #wt-tips-box .btn-box{display:flex;justify-content: space-around;}
  1073. #wt-tips-box .btn-box button{min-width: 60px;height: 28px;background-color: #00bcd4;border-radius: 30px;color: white;border: none;font-size: 12px;}
  1074. #wt-tips-box .btn-box .cancel{display: none;background-color: #eee;color:#2a2a2a}
  1075. #wt-tips-box .logo{position: absolute;top: 9%;left: 1%; color: #dbdbdb; font-size: 11px;transform: rotate(-15deg);text-align: center;z-index: -10;}
  1076. #wt-tips-box .version{position: absolute;top: 9%; right: 10%;transform: rotate(-15deg);color: #dbdbdb;}
  1077. #wt-notify-box {position: fixed;top: 2%;left: 50%;transform:translate(-50%,-100%) scale(0);overflow: hidden;width: 80%;min-height: 75px;letter-spacing: 1px;background-color: white;color:#2a2a2a;border-radius: 15px;box-shadow: 0 15px 30px rgba(0, 0, 0, .15);z-index: 95000;}
  1078. #wt-notify-box::after{display:none; content:'';position: absolute;width: 250px;height: 250px;border-radius: 200px;background-color: #03A9F4;z-index: -1;opacity: 0.7;bottom: 0;left: 0;transform: translate(-42%,85%);}
  1079. #wt-notify-box .title{ text-align: center;height: 35px; line-height: 35px;font-size: 15px;font-weight: 600; color: #00bcd4;}
  1080. #wt-notify-box .content{ color: #3a3a3a;padding: 10px 15px;font-size: 12px;}
  1081. #wt-notify-box .content a{color: #1E88E5;text-decoration: underline;}
  1082. #wt-notify-box .content p{margin-bottom: 5px;}
  1083. #wt-video-container{display: none; position:absolute;top: 0;left: 0;right: 0;bottom: 0; z-index: 9998;background-color: black;}
  1084. #wt-video-container .wt-video{ position:absolute;top:50%;width:100%;transform: translateY(-50%);height: 240px; z-index: 9999;}
  1085. #wt-video-container .wt-video video{width:100%;height: 100%;}
  1086. .dplayer-controller{bottom: 30px !important;}
  1087. .dplayer.dplayer-hide-controller .dplayer-controller{ opacity: 0 !important;transform: translateY(200%) !important;}
  1088. .wt-close-btn{ font-size: 15px;position: absolute;top: 40px;left: 25px;color: white;}
  1089. #wt-download-box{ z-index: 10010;}
  1090. #wt-download-box .close{position: absolute;right: 0px;top: 0px;width: 40px;height: 40px;}
  1091. #wt-download-box .close::before,#wt-download-box .close::after{position: absolute;left: 50%;top: 50%;content: '';width: 14px;height: 2px;border-radius: 1px;background-color: #adadad;transform: translate(-50%,-50%) rotate(45deg);}
  1092. #wt-download-box .close::after,#wt-download-box .close::after{transform: translate(-50%,-50%) rotate(-45deg);}
  1093. #wt-download-box::before{display: none;content:'';position: absolute;width: 150px;height: 150px;border-radius: 100px;background-color: #00bcd4;z-index: -1;opacity: 0.7;top: 0;right: 153px;transform: translateY(-40%);}
  1094. #wt-download-box::after{display: none;content:'';position: absolute;width: 150px;height: 150px;border-radius: 100px;background-color: #FFC107;z-index: -1;opacity: 0.7;bottom: 0;right: -100px;transform: translateY(30%);}
  1095. #wt-download-box ul li{ height: 38px;line-height: 38px;font-size: 11px;text-align: center;color:#909090;font-weight: 500;background-color: white;box-shadow: rgb(166 166 166 / 20%) 0px 1px 5px 1px;margin: 18px 30px;border-radius: 40px;}
  1096. `
  1097. )
  1098. if(window.navigator.userAgent.includes('Safari')){
  1099. GM_addStyle(`
  1100. .swiper-slide{top: -50px;}
  1101. `)
  1102. }
  1103. if (_CONFIG_.isMobile) {
  1104. GM_addStyle(`
  1105. #wt-set-box {width:80%;}
  1106. `);
  1107. }
  1108. const roles = util.initAppDate(false);
  1109. $(container).append(`
  1110. <div id="wt-${_CONFIG_.vipBoxId}">
  1111. <div id="wt-my" class="item wt_my_91video">
  1112. <img src="${_CONFIG_.cdnBaseUrl + '/image/app.png'}"></img>
  1113. </div>
  1114. <div id="wt-my-set" class="item wt_my_set_91video">
  1115. <i class="iconfont">&#xe623;</i>
  1116. </div>
  1117. <div id="wt-my-down" class="item wt_my_down_91video">
  1118. <i class="iconfont">&#xe61c;</i>
  1119. </div>
  1120. <div id="wt-my-notify" class="item wt_my_notify">
  1121. <i class="iconfont">&#xe604;</i>
  1122. </div>
  1123. <div id="wt-hid-box" class="item">
  1124. <i class="iconfont">&#xe65f;</i>
  1125. </div>
  1126. </div>
  1127. <div id="wt-left-show" style="transform: translate(-60px,-50%);padding: 10px;">
  1128. <i class="iconfont">&#xe675;</i>
  1129. </div>
  1130. <div id="wt-mask-box"></div>
  1131. <div id="wt-set-box">
  1132. <div class="close"></div>
  1133. <div class="line-box" style="display:none">
  1134. </div>
  1135. <div class="user-box-container">
  1136. <div class="user-box">
  1137. <div class="title" style="margin-bottom: 10px">App</div>
  1138. <div class="user-info">
  1139. <div class="avatar" style="position: relative;">
  1140. <img src="${_CONFIG_.cdnBaseUrl + '/image/app.png'}" style="width: 100%;height: 100%;border-radius: 8px;"></img>
  1141. </div>
  1142. <div class="info">
  1143. <div class="nickname">请登录</div>
  1144. <div class="username">xxxxxxxxxx</div>
  1145. </div>
  1146. <div class="logout">
  1147. <button>退出登录</button>
  1148. </div>
  1149. </div>
  1150. <div class="apps-container"> ${roles}</div>
  1151. </div>
  1152. </div>
  1153. </div>
  1154. <div id="wt-loading-box">
  1155. <div class="loading"></div>
  1156. </div>
  1157. <div id="wt-maxindex-mask"></div>
  1158. <div id="wt-tips-box">
  1159. <div class="title">提示</div>
  1160. <div class="content"></div>
  1161. <div class="btn-box">
  1162. <button class='cancel'>取消</button>
  1163. <button class='submit'>确定</button>
  1164. </div>
  1165. <div class="logo"><p style="font-size: 10px;">@${superVip._CONFIG_.homeUrl}</p></div>
  1166. <div class="version"><p style="font-size: 10px;">v ${superVip._CONFIG_.version}</p></div>
  1167. </div>
  1168. <div id="wt-notify-box">
  1169. <div class="close"></div>
  1170. <div class="title">通知</div>
  1171. <div class="content"></div>
  1172. </div>
  1173. <div id="wt-video-container">
  1174. <div class="wt-close-btn">
  1175. <i class="van-icon van-icon-close"></i>
  1176. <span style="margin-left: 5px;">退出播放</span>
  1177. </div>
  1178. <div class="wt-video">
  1179. <video id="wt-video" controls></video>
  1180. </div>
  1181. </div>
  1182. `)
  1183. if (_CONFIG_.user && _CONFIG_.user.avatar) {
  1184. util.logined()
  1185. }
  1186. return new Promise((resolve, reject) => resolve(container));
  1187. }
  1188. bindEvent(container) {
  1189. const vipBox = $(`#wt-${_CONFIG_.vipBoxId}`)
  1190. if(GM_getValue('91video_hid_controller',null)){
  1191. vipBox.css("transform","translate(125%, -50%)")
  1192. $('#wt-left-show').css("transform","translate(0, -50%)")
  1193. }
  1194. //点击 我的
  1195. vipBox.find("#wt-my").on("click", () => {
  1196. if(_CONFIG_.user){
  1197. if(_CONFIG_.myBtnOpen) return
  1198. _CONFIG_.myBtnOpen = true
  1199. $('#wt-mask-box').css('display','block')
  1200. $("#wt-set-box .user-box-container").css('display','block')
  1201. $("#wt-set-box").removeClass('hid-set-box')
  1202. $("#wt-set-box").addClass('show-set-box')
  1203. $('#wt-set-box .user-box-container .nickname').html(_CONFIG_.user.nickname)
  1204. util.initAppDate()
  1205. }else{
  1206. util.addLogin()
  1207. $('#wt-login-mask').css('display','block')
  1208. $("#wt-login-box").removeClass('hid-set-box')
  1209. $("#wt-login-box").addClass('show-set-box')
  1210. const jsxl_login_code = GM_getValue('jsxl_login_code','')
  1211. if(jsxl_login_code){
  1212. $("#wt-login-box input")[0].value = jsxl_login_code.u;
  1213. $("#wt-login-box input")[1].value = jsxl_login_code.p;
  1214. }
  1215. }
  1216. })
  1217. // 点击 播放
  1218. vipBox.find("#wt-my-set").on("click", async() => {
  1219. try{
  1220. document.querySelector('video').pause()
  1221. }catch(e){}
  1222. if(!_CONFIG_.user){
  1223. $("#wt-my").click()
  1224. return
  1225. }
  1226. if(_CONFIG_.video.requestErrMsg){
  1227. util.showTips({ title: _CONFIG_.video.requestErrMsg})
  1228. return
  1229. }
  1230. if (!_CONFIG_.video.playerUrl) {
  1231. $('#wt-loading-box').css('display', 'block')
  1232. for (let i = 0; i < 5; i++) {
  1233. await util.sleep(1000)
  1234. if (_CONFIG_.video.playerUrl) {
  1235. $('#wt-loading-box').css('display', 'none')
  1236. break
  1237. }
  1238. }
  1239. $('#wt-loading-box').css('display', 'none')
  1240. }
  1241. $("#wt-hid-box").click()
  1242. if(_CONFIG_.video && _CONFIG_.video.playerUrl){
  1243. $('#wt-tips-box .btn-box .submit').click()
  1244. if(!_CONFIG_.video.playerUrl.includes('http') || _CONFIG_.video.playerUrl.includes('失败')){
  1245. util.showTips({ title: _CONFIG_.video.playerUrl})
  1246. return
  1247. }
  1248. $('#wt-video-container').css('display','block')
  1249. if(_CONFIG_.video?.playerType == 'mp4'){
  1250. $('.wt-video').empty()
  1251. $('.wt-video').append(`
  1252. <video controls width="100%" height="100%">
  1253. <source src="${_CONFIG_.video?.playerUrl}">
  1254. </video>
  1255. `)
  1256. return
  1257. }
  1258. if(_CONFIG_.isMobile && _CONFIG_.isMobile[0] == 'iPhone'){
  1259. $('.wt-video').empty()
  1260. $('.wt-video').append(`
  1261. <video controls width="100%" height="100%">
  1262. <source src="${_CONFIG_.video.playerUrl}" type="application/x-mpegURL">
  1263. </video>
  1264. `)
  1265. }else{
  1266. $('.wt-video').empty()
  1267. $('.wt-video').append(`<video id="wt-video" controls></video>`)
  1268. const video = document.getElementById('wt-video')
  1269. _CONFIG_.hls_dp = new Hls()
  1270. _CONFIG_.hls_dp.loadSource(_CONFIG_.video.playerUrl)
  1271. _CONFIG_.hls_dp.attachMedia(video)
  1272. _CONFIG_.hls_dp.on(Hls.Events.MANIFEST_PARSED,function() {
  1273. video.play()
  1274. })
  1275. }
  1276. }
  1277. if(!_CONFIG_.video || !_CONFIG_.video.playerUrl){
  1278. util.showTips({ title: '视频不存在'})
  1279. }
  1280. })
  1281. //阻止视频组件冒泡
  1282. $('#wt-video-container div').on('click',function(e){
  1283. e.stopPropagation()
  1284. })
  1285. $('.wt-close-btn').on('click', function() {
  1286. $('#wt-video-container').css('display', 'none')
  1287. $('.wt-video').empty()
  1288. if (_CONFIG_.hls_dp) _CONFIG_.hls_dp.destroy()
  1289. util.showAndHidTips('wt_my_set_91video', 'set', false)
  1290. })
  1291. vipBox.find("#wt-my-down").on("click", async() => {
  1292. if (!_CONFIG_.user) {
  1293. $("#wt-my").click()
  1294. return
  1295. }
  1296. if(_CONFIG_.video.downLoadUrl){
  1297. util.showDownLoadWindow();
  1298. return;
  1299. }
  1300. if(!_CONFIG_.video || !_CONFIG_.video.aes){
  1301. util.showTips({
  1302. title: '抱歉未检测到视频,需要网页视频可播放才能检测到'
  1303. })
  1304. return
  1305. }
  1306. if((_CONFIG_.video && _CONFIG_.video.aes) && !_CONFIG_.video.downLoadUrl){
  1307. if(_CONFIG_.user && _CONFIG_.user.stopDownload || (_CONFIG_.user.role.use_download_num == _CONFIG_.user.role.max_download_num) ){
  1308. util.showTips({
  1309. title: '抱歉,今日下载次数' + _CONFIG_.user.role.max_download_num + '次已经用完,请明日再下载'
  1310. })
  1311. return;
  1312. }
  1313. util.showTips({
  1314. title: '为了插件的稳定现已日限下载</br>(当前账号日限' + _CONFIG_.user.role.max_download_num +'次,' + superVip._CONFIG_.user.downloadTips +',已使用' + _CONFIG_.user.role.use_download_num +'次,每个插件每日各' + _CONFIG_.user.role.max_download_num +'次),</br>您确定要消耗一次次数来获取视频链接吗(如失败不计数)?',
  1315. doubt: true,
  1316. success: async (confirm) => {
  1317. if (confirm) {
  1318. try {
  1319. $('#wt-loading-box').css('display', 'block')
  1320. await util.sleep(300);
  1321. $.ajax({
  1322. url: superVip._CONFIG_.apiBaseUrl + '/d' + (Math.floor(Math.random() * 3) + 1) + '00/downloadByAes',
  1323. type: 'POST',
  1324. data: {
  1325. aes: _CONFIG_.video.aes,
  1326. ap: 'Y7D3PJUU2JUIxJUE0JUU1JUE0JUI0JUU2JTlEJUExk9f3w',
  1327. origin: location.origin
  1328. },
  1329. headers: {
  1330. 'luckyToken': superVip._CONFIG_.user.token
  1331. },
  1332. dataType: 'json',
  1333. success: async function(response) {
  1334. $('#wt-loading-box').css('display', 'none')
  1335. if(response.errCode != 0){
  1336. util.showTips({
  1337. title: response.errMsg || response.error.message
  1338. })
  1339. }else{
  1340. if(response.newToken) superVip._CONFIG_.user.token = response.newToken;
  1341. _CONFIG_.user.role.use_download_num = response.useDownloadNum;
  1342. _CONFIG_.video.downLoadUrl = response.data
  1343. util.showDownLoadWindow(true, response.errMsg);
  1344. GM_setValue('jsxl_user', _CONFIG_.user);
  1345. }
  1346. },
  1347. error: function(xhr, status, error) {
  1348. $('#wt-loading-box').css('display', 'none')
  1349. const msg = 'JUU4JThFJUI3JUU1JThGJTk2JUU0JUI4JThCJUU4JUJEJUJEJUU5JTkzJUJFJUU2JThFJUE1JUU1JUE0JUIxJUU4JUI0JUE1'
  1350. superVip._CONFIG_.video.requestErrMsg = error || decodeURIComponent(atob(msg))
  1351. util.showTips({ title: decodeURIComponent(atob(msg))})
  1352. }
  1353. });
  1354. } catch (e) {
  1355. $('#wt-loading-box').css('display', 'none')
  1356. util.showTips({
  1357. title: e.message +
  1358. '</br>' + location.href +
  1359. '</br>获取下载链接失败'
  1360. })
  1361. if(e.message.includes('明日再下载')){
  1362. _CONFIG_.user.stopDownload = true
  1363. _CONFIG_.user.role.use_download_num = _CONFIG_.user.role.max_download_num
  1364. GM_setValue('jsxl_user', _CONFIG_.user);
  1365. }
  1366. }
  1367. }
  1368. }
  1369. })
  1370. }
  1371. })
  1372. $("#wt-set-box .user-box .user-info").on('click', function() {
  1373. util.showTips({
  1374. title: '确定要跳转到插件官网吗?',
  1375. doubt: true,
  1376. success: (res) =>{
  1377. if(res){
  1378. location.href = superVip._CONFIG_.homeUrl
  1379. }
  1380. }
  1381. })
  1382. })
  1383. //点击 通知
  1384. vipBox.find("#wt-my-notify").on("click", () => {
  1385. if (_CONFIG_.showNotify) {
  1386. $('#wt-notify-box').click()
  1387. } else {
  1388. const notify = GM_getValue('notify', '');
  1389. if (notify) {
  1390. util.showNotify({
  1391. title: notify
  1392. })
  1393. GM_setValue('notifyShow', false);
  1394. util.showAndHidTips('wt_my_notify', 'set', false)
  1395. } else {
  1396. util.showNotify({
  1397. title: '还没有通知信息'
  1398. })
  1399. };
  1400. }
  1401. })
  1402. $('#wt-set-box .logout').on('click', function(e) {
  1403. util.showTips({
  1404. title: '您确定要退出登录吗?',
  1405. doubt: true,
  1406. success: (res) => {
  1407. if (res) {
  1408. util.logouted()
  1409. $('#wt-mask-box').click()
  1410. }
  1411. }
  1412. })
  1413. e.stopPropagation()
  1414. })
  1415. //点击 隐藏控制器
  1416. vipBox.find("#wt-hid-box").on("click", () => {
  1417. vipBox.css("transform","translate(125%, -50%)")
  1418. $('#wt-left-show').css("transform","translate(0, -50%)")
  1419. GM_setValue('91video_hid_controller',1)
  1420. })
  1421. //点击 显示控制器
  1422. $('#wt-left-show').on('click',()=>{
  1423. $('#wt-left-show').css("transform","translate(-60px, -50%)")
  1424. vipBox.css("transform","translate(0, -50%)")
  1425. GM_setValue('91video_hid_controller','')
  1426. })
  1427. //点击 设置界面遮罩
  1428. $('#wt-mask-box').on('click',()=>{
  1429. $('#wt-mask-box').css('display','none')
  1430. $("#wt-set-box").removeClass('show-set-box')
  1431. $("#wt-set-box").addClass('hid-set-box')
  1432. $("#wt-download-box").removeClass('show-set-box');
  1433. $("#wt-download-box").addClass('hid-set-box')
  1434. setTimeout(()=>{
  1435. $("#wt-set-box .line-box").css('display','none')
  1436. $("#wt-set-box .user-box-container").css('display','none')
  1437. _CONFIG_.myBtnOpen = false
  1438. },500)
  1439. })
  1440. //点击 设置/我的信息界面关闭
  1441. $("#wt-set-box .close").on("click", () => {
  1442. $('#wt-mask-box').click()
  1443. })
  1444. if (!_CONFIG_.user) {
  1445. util.addLogin()
  1446. util.findTargetElement('#wt-my').then(res => {
  1447. setTimeout(() => {
  1448. res.click()
  1449. }, 2500)
  1450. })
  1451. }
  1452. if(GM_getValue('notifyShow')){
  1453. util.showAndHidTips('wt_my_notify')
  1454. }
  1455. if(unsafeWindow.wt_91video_script > 1){
  1456. const controllerBoxId = '#wt-' + _CONFIG_.vipBoxId
  1457. $(controllerBoxId).append(`
  1458. <div class="num-error" style="position: absolute;top: 4px; left: 50%;transform: translateX(-50%);font-size: 10px;color: red;z-index: -1;">
  1459. ${unsafeWindow.wt_91video_script}
  1460. </div>
  1461. `)
  1462. }
  1463. }
  1464. }
  1465.  
  1466. return {
  1467. start: () => {
  1468. unsafeWindow.wt_91video_script = unsafeWindow.wt_91video_script? unsafeWindow.wt_91video_script ++: 1
  1469.  
  1470. _CONFIG_.user = GM_getValue('jsxl_user', '');
  1471. if(_CONFIG_.user){
  1472. if(_CONFIG_.user.login_date && (_CONFIG_.user.login_date != new Date().setHours(0,0,0,0))){
  1473. _CONFIG_.user = '';
  1474. GM_setValue('jsxl_user', '');
  1475. }
  1476. }
  1477. const targetConsumer = new BaseConsumer;
  1478. targetConsumer.parse();
  1479. },
  1480. _CONFIG_
  1481. }
  1482. })();
  1483. superVip.start();
  1484. }
  1485.  
  1486. if(!unsafeWindow.jQuery){
  1487. const script = document.createElement('script');
  1488. script.src = 'https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js';
  1489. script.onload = function() {
  1490. init(unsafeWindow.jQuery)
  1491. };
  1492. script.onerror = function(e) {
  1493. alert('jquery初始化失败')
  1494. };
  1495. document.head.appendChild(script);
  1496. }else{
  1497. init(unsafeWindow.jQuery)
  1498. }