Sleazy Fork is available in English.

含羞草(完全免费)

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

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