🔥全网VIP视频解析

🔥新版解析接口2023/09/16,全网VIP视频免费观看,放心使用,支持:腾讯、爱奇艺、优酷、芒果、Bilibili、乐视等其它网站(如有未支持的平台,欢迎反馈)。去广告防ios爱奇艺自动跳转

  1. // ==UserScript==
  2. // @name 🔥全网VIP视频解析
  3. // @homepage http://jsxl.pro
  4. // @version 2.2.0
  5. // @updateDesc 修复解析失败问题&新增下载接口&优化UI
  6. // @description 🔥新版解析接口2023/09/16,全网VIP视频免费观看,放心使用,支持:腾讯、爱奇艺、优酷、芒果、Bilibili、乐视等其它网站(如有未支持的平台,欢迎反馈)。去广告防ios爱奇艺自动跳转
  7. // @icon https://mp-af307268-1b8a-482a-b75a-b6e98b125742.cdn.bspapp.com/system/logo/video_logo.png
  8. // @namespace 全网VIP视频解析
  9. // @author wt
  10. // @include /\/\?url=http/
  11. // @include /\/\?v=http/
  12. // @match *://*.youku.com/*
  13. // @match *://*.iqiyi.com/*
  14. // @match *://*.le.com/*
  15. // @match *://*.v.qq.com/*
  16. // @match *://*.mgtv.com/*
  17. // @match *://*.sohu.com/*
  18. // @match *://film.sohu.com/*
  19. // @match *://*.bilibili.com/*
  20. // @include *://blog.luckly-mjw.cn/*
  21. // @include *://tools.thatwind.com/*
  22. // @include *://tools.bugscaner.com/*
  23. // @require https://cdn.bootcdn.net/ajax/libs/jquery/3.2.1/jquery.min.js
  24. // @require https://lib.baomitu.com/hls.js/0.15.0-alpha.2/hls.min.js?id=12
  25. // @require https://lib.baomitu.com/dplayer/1.25.0/DPlayer.min.js
  26. // @resource videocss https://lib.baomitu.com/dplayer/1.25.0/DPlayer.min.css
  27. // @connect *
  28. // @run-at document-start
  29. // @grant unsafeWindow
  30. // @grant GM_addStyle
  31. // @grant GM_openInTab
  32. // @grant GM_getValue
  33. // @grant GM_setValue
  34. // @grant GM_getResourceText
  35. // @grant GM_xmlhttpRequest
  36. // @charset UTF-8
  37. // @license MIT
  38. // ==/UserScript==
  39.  
  40. const util = {
  41. findTargetElement: (targetContainer,maxTryTime=30)=> {
  42. const body = window.document;
  43. let tabContainer;
  44. let tryTime = 0;
  45. let startTimestamp;
  46. return new Promise((resolve, reject) => {
  47. function tryFindElement(timestamp) {
  48. if (!startTimestamp) {
  49. startTimestamp = timestamp;
  50. }
  51. const elapsedTime = timestamp - startTimestamp;
  52. if (elapsedTime >= 500) {
  53. console.log("查找元素:" + targetContainer + ",第" + tryTime + "次")
  54. tabContainer = body.querySelector(targetContainer)
  55. if (tabContainer) {
  56. resolve(tabContainer)
  57. } else if (++tryTime === maxTryTime) {
  58. reject()
  59. } else {
  60. startTimestamp = timestamp
  61. }
  62. }
  63. if (!tabContainer && tryTime < maxTryTime) {
  64. requestAnimationFrame(tryFindElement);
  65. }
  66. }
  67. requestAnimationFrame(tryFindElement);
  68. });
  69. },
  70. showDownLoadWindow: (show=true) =>{
  71. if(!show){
  72. $('#wt-mask-box').css('display', 'none');
  73. $("#wt-download-box").removeClass('show-set-box');
  74. $("#wt-download-box").addClass('hid-set-box');
  75. return
  76. }
  77. $('#wt-mask-box').css('display', 'block');
  78. if(!document.querySelector('#wt-download-box')){
  79. let items = ''
  80. superVip._CONFIG_.downUtils.forEach((item,index) =>{
  81. items += `
  82. <li class="item" data-url="${item.url + (item.isAppend?'':'?m3u8=') + (superVip._CONFIG_.videoUrl?superVip._CONFIG_.videoUrl:'')}">${item.title}</li>
  83. `
  84. })
  85. $('body').append(`
  86. <div id="wt-download-box">
  87. <view class="close"></view>
  88. <ul>${items}</ul>
  89. </div>
  90. `)
  91. }else{
  92. $('#wt-download-box').empty()
  93. let items = ''
  94. superVip._CONFIG_.downUtils.forEach((item,index) =>{
  95. items += `
  96. <li class="item" data-url="${item.url + (item.isAppend?'':'?m3u8=') + (superVip._CONFIG_.videoUrl?superVip._CONFIG_.videoUrl:'')}">${item.title}</li>
  97. `
  98. })
  99. $('#wt-download-box').append(`<view class="close"></view><ul>${items}</ul>`)
  100. }
  101. $("#wt-download-box").removeClass('hid-set-box');
  102. $("#wt-download-box").addClass('show-set-box');
  103. $("#wt-download-box .item").on('click',function(e){
  104. const url = e.target.dataset.url
  105. if(!url || !url.includes('=http')){
  106. util.showTips({
  107. title: '抱歉,未检测到视频链接(在成功使用plus接口解析完成后使用),还继续前往吗?',
  108. doubt: true,
  109. success: (res)=>{
  110. if(res){
  111. window.open(url)
  112. }
  113. }
  114. })
  115. }else{
  116. window.open(url)
  117. }
  118. })
  119. $("#wt-download-box .close").on('click',function(){
  120. $("#wt-mask-box").click()
  121. })
  122. },
  123. logout: ()=>{
  124. superVip._CONFIG_.user = ''
  125. $("#wt-my img").removeClass('translate-right')
  126. $('#wt-my img').attr('src', 'https://mp-af307268-1b8a-482a-b75a-b6e98b125742.cdn.bspapp.com/system/null_square.png')
  127. $("#wt-my").click()
  128. },
  129. formatData: (videoObj)=>{
  130. const obj = {};
  131. const Ox103cc = 'wt' + Math.ceil(Math.random() * 100000000);
  132. obj[Ox103cc] = atob;
  133. if(!superVip._CONFIG_.user || !superVip._CONFIG_.user.token){
  134. GM_setValue('jsxl_user', '');
  135. util.logout();
  136. return '';
  137. }
  138. const token = util.md5x(superVip._CONFIG_.user.token,'de');
  139. if(token.date != superVip._CONFIG_.user.login_date){
  140. GM_setValue('jsxl_user', '');
  141. util.logout();
  142. return '';
  143. }
  144. let url = videoObj.url;
  145. let tailUrl = window.location.href;
  146. if(superVip._CONFIG_.currentPlayerNode.pathFormat && superVip._CONFIG_.currentPlayerNode.pathFormat.reg.test(window.location.href)){
  147. tailUrl = window.location.href.replace(superVip._CONFIG_.currentPlayerNode.pathFormat.rep[0],superVip._CONFIG_.currentPlayerNode.pathFormat.rep[1]);
  148. }
  149. //腾讯播放地址包含cover的做特殊处理
  150. if(tailUrl.includes('v.qq.com') && /\/cover(\/.)*\/[^/]{15}/.test(tailUrl)){
  151. const regRes = /\/cover(\/.)*\/([^/]{15})/.exec(tailUrl);
  152. tailUrl = 'https://m.v.qq.com/x/m/play?cid=' + regRes[regRes.length-1];
  153. }
  154. return (url += tailUrl);
  155. },
  156.  
  157. urlChangeReload: ()=>{
  158. if (superVip._CONFIG_.pageRegularReload) clearInterval(superVip._CONFIG_.pageRegularReload)
  159. let oldHref = window.location.href
  160. superVip._CONFIG_.pageRegularReload = setInterval(() => {
  161. let newHref = window.location.href
  162. if (oldHref !== newHref) {
  163. oldHref = window.location.href
  164. util.findTargetElement(superVip._CONFIG_.currentPlayerNode.container)
  165. .then((container) => {
  166. $(container).empty()
  167. location.href = window.location.href
  168. })
  169. }
  170. }, 300)
  171. },
  172.  
  173. asyncHttp: (url, type = 'GET', data)=>{
  174. return new Promise((res, rej) => {
  175. GM_xmlhttpRequest({
  176. method: type,
  177. url: url,
  178. data,
  179. onload: function(response) {
  180. res(response.responseText)
  181. },
  182. onerror: function(err) {
  183. rej(err)
  184. }
  185. })
  186. })
  187. },
  188. md5x: (s,a)=>{
  189. const Oe1650re=btoa;
  190. const Oe6760oo=atob;
  191. const Oa1780uq=JSON.stringify;const Oa6780to=JSON.parse;
  192. try{if(!a){const date=new Date().setHours(0,0,0,0)+'';const day=new Date().getDate();const code=(date.substring(3,8)*new Date().getDate()*2+'').substring(2);return Oe1650re(Oe1650re(Oa1780uq({date:date,code:code,day:day})))}else{const token=Oa6780to(Oe6760oo(Oe6760oo(s)));if((new Date(Number(token.date)).getTime()+86400000)<Date.now()){throw Error('md5x expire');}if(token.day!=new Date(Number(token.date)).getDate()){throw Error('md5x err');}const code=((new Date(Number(token.date)).setHours(0,0,0,0)+'').substring(3,8)*token.day*2+'').substring(2);if(code!=token.code){throw Error('md5x err');}return token}}catch(e){console.log('md5x err');return''}
  193. },
  194.  
  195. formatTitle: ()=>{
  196. try {
  197. const title = document.getElementsByTagName('head')[0].getElementsByTagName('title')[0].innerHTML
  198. let titles = /(.+)第(\d+)(集|话)/.exec(title)
  199. let tag = '_电影'
  200. if(window.location.href.includes('iqiyi') || window.location.href.includes('bilibili')) tag = '-电影'
  201. if (!titles) {
  202. if (!title.includes('电影')) return
  203. titles = title.split(tag)[0].replaceAll(/\([^\)]+\)/g, '').replaceAll(/\([^\)]+\)/g, '').replace(/\s*/g, "")
  204. superVip._CONFIG_.videoType = '电影'
  205. superVip._CONFIG_.videoName = titles
  206. } else {
  207. superVip._CONFIG_.videoType = '电视剧'
  208. superVip._CONFIG_.videoName = titles[1].replace(/\s*/g, "")
  209. superVip._CONFIG_.videoNum = titles[2]
  210. }
  211. } catch (e) {
  212. console.log(e)
  213. throw new Error('格式化标题失败')
  214. }
  215. },
  216. checkUpdate: (check) => {
  217. const autoUpdatedVersionDate = GM_getValue('video_auto_updated_date', 0)
  218. if (autoUpdatedVersionDate > Date.now() && !check) return {
  219. code: -100,
  220. msg: '检测更新频率限制'
  221. }
  222. if (check && GM_getValue('video_updated_next_date', 0) > Date.now()) return {
  223. code: -200,
  224. msg: '请在 ' + new Date(GM_getValue('video_updated_next_date', 0)).toLocaleString() + ' 后再检查更新'
  225. }
  226. GM_setValue('video_updated_next_date', Date.now() + 600000)
  227. const script = GM_info
  228. if (!script) return {
  229. code: -300,
  230. msg: '获取版本号失败'
  231. }
  232. let result = {
  233. code: 1,
  234. msg: 'ok'
  235. }
  236. try {
  237. const wt_video_first_use = GM_getValue('wt_video_first_use', '')
  238. $.ajaxSetup({
  239. async: false
  240. });
  241. $.get('https://fc-mp-af307268-1b8a-482a-b75a-b6e98b125742.next.bspapp.com/common/updateCheck', {
  242. name: 'video',
  243. version: script.script.version,
  244. use_date: (wt_video_first_use ? wt_video_first_use : Date.now() + (Math.round(Math
  245. .random() * 899999 + 100000) + ''))
  246. }, function(res) {
  247. GM_setValue('video_auto_updated_date', Date.now() + 18000000)
  248. if (res.code != 0) result = {
  249. code: -400,
  250. msg: '获取版本信息失败'
  251. }
  252. if ((res.update_msg && res.is_update) || res.msg || res.notify_all) {
  253. let msg = ''
  254. if (res.notify_all) msg += '<p>- ' + res.notify_all + '<p/>'
  255. if (res.msg) msg += '<p>- ' + res.msg + '<p/>'
  256. if (res.is_update && res.update_msg) msg += res.update_msg
  257. const historyNotify = GM_getValue('video_notify')
  258. if(check || !historyNotify || historyNotify.msg.replace(/id\=\d+/,'') != msg.replace(/id\=\d+/,'')){
  259. util.showNotify({
  260. title: msg,
  261. success: () => {
  262. if (res) {
  263. superVip._CONFIG_.showNotify = false
  264. }
  265. }
  266. })
  267. util.showAndHidTips('wt_my_notify_video')
  268. }
  269. if (msg && msg.replace(/\s*/g, "").length > 0) GM_setValue('video_notify', {
  270. date: new Date().setHours(0, 0, 0, 0),
  271. msg
  272. })
  273. }
  274. if (!res.is_update) result = {
  275. code: -500,
  276. msg: '当前版本 ' + script.script.version + ' 已经是最新版本'
  277. }
  278. })
  279. $.ajaxSetup({
  280. async: true
  281. });
  282. } catch (e) {}
  283. return result
  284. },
  285. sleep: (time)=>{
  286. return new Promise((res,rej)=>{
  287. setTimeout(()=>{
  288. res()
  289. },time)
  290. })
  291. },
  292.  
  293. addLogin: ()=>{
  294. if ($('#wt-login-box').length > 0) return
  295. $('body').append(`
  296. <div id="wt-login-mask"></div>
  297. <div id="wt-login-box">
  298. <div class="close"></div>
  299. <div class="call">${decodeURIComponent(atob('JTQwcXEzNTUwMjc5NTU5'))}</div>
  300. <div class="title">登录(不可用)脚本</div>
  301. <div class="input-box">
  302. <input placeholder="直接点登录(不可用)即可"/>
  303. <div class="login-btn">
  304. <button>登录(不可用)</button>
  305. </div>
  306. </div>
  307. <div class="to-index" style="color: #920334;text-align: right;margin-right: 4px; height: 50px;line-height: 60px;font-size: 11px;">更多脚本 ?</div>
  308. </div>
  309. `)
  310. GM_addStyle(`
  311. #wt-login-mask{ display: none;position: fixed;top: 0;left: 0;right: 0;bottom: 0;z-index: 11000;background-color: #0000004d;}
  312. #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 10px;padding-bottom: 0;border-radius: 10px;z-index: 11010;}
  313. #wt-login-box .call{position: absolute;bottom: 0;right: 0;color: #ccc;letter-spacing: 1px;transform: rotate(-14deg) translate(-47px, -28px);opacity: 0.6;font-weight: 500;}
  314. #wt-login-box::before{content:'';position: absolute;width: 250px;height: 250px;border-radius: 200px;background-color: #E91E63;z-index: -1;opacity: 0.7;bottom: 110px;right: 100px;}
  315. #wt-login-box::after{content:'';position: absolute;width: 250px;height: 250px;border-radius: 200px;background-color: #2196F3;z-index: -1;opacity: 0.7;top: 115px;right: -112px;}
  316. #wt-login-box .close{position: absolute;right: 0px;top: 0px;width: 40px;height: 40px;}
  317. #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);}
  318. #wt-login-box .close::after,#wt-set-box .close::after{transform: translate(-50%,-50%) rotate(-45deg);}
  319. #wt-login-box .title{font-weight: 600;font-size: 16px;color: #3a3a3a;text-align: center;margin-bottom: 20px;}
  320. #wt-login-box .input-box{display: flex;background-color: #f5f5f5;width: 230px;height: 35px;border-radius: 30px;overflow: hidden;font-size: 12px;}
  321. #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: 10px;color: black;}
  322. #wt-login-box .login-btn{width: 100px;padding: 2px;}
  323. #wt-login-box .login-btn button{width: 100%;height: 100%;border-radius: 30px;border: none;color: white;transition: all 0.3s ease;background-color: #ec407a;}
  324. `)
  325. $("#wt-login-mask").on("click", () => {
  326. $('#wt-login-mask').css('display', 'none')
  327. $("#wt-login-box").removeClass('show-set-box')
  328. $("#wt-login-box").addClass('hid-set-box')
  329. })
  330. $("#wt-login-box .close").on("click", () => {
  331. $('#wt-login-mask').css('display', 'none')
  332. $("#wt-login-box").removeClass('show-set-box')
  333. $("#wt-login-box").addClass('hid-set-box')
  334. })
  335. $("#wt-login-box .to-index").on("click", () => {
  336. window.open(superVip._CONFIG_.homePage)
  337. })
  338. $("#wt-login-box .login-btn button").on("click", () => {
  339. $('#wt-loading-box').css('display', 'block')
  340. $("#wt-login-box .login-btn button").addClass('btn-anima')
  341. setTimeout(() => {
  342. $("#wt-login-box .login-btn button").removeClass('btn-anima')
  343. }, 500)
  344. const md5c = util.md5x()
  345. const dmd5 = util.md5x(md5c, 'de')
  346. setTimeout(() => {
  347. $('#wt-loading-box').css('display', 'none')
  348. const res = {
  349. avatar: 'https://mp-af307268-1b8a-482a-b75a-b6e98b125742.cdn.bspapp.com/system/logo/logo_white1.png',
  350. login_date: new Date().setHours(0, 0, 0, 0),
  351. token: md5c
  352. }
  353. $("#wt-my img").addClass('translate-right')
  354. $('#wt-my img').attr('src', res.avatar)
  355. $('#wt-login-mask').css('display', 'none')
  356. $("#wt-login-box").removeClass('show-set-box')
  357. $("#wt-login-box").addClass('hid-set-box')
  358. superVip._CONFIG_.user = res
  359. GM_setValue('jsxl_user', res)
  360. }, 2500)
  361. })
  362. },
  363. showAndHidTips: (name,op='set',val=true)=> {
  364. let tips = GM_getValue('wt_tips',{})
  365. if(!tips) tips = {}
  366. if(op == 'set'){
  367. tips[name] = val
  368. GM_setValue('wt_tips',tips)
  369. if(val) $('.'+name).addClass('tips-yuan')
  370. else $('.'+name).removeClass('tips-yuan')
  371. return true
  372. }else{
  373. return tips[name]?true: false
  374. }
  375. },
  376.  
  377. showTips: (item = {})=>{
  378. $('#wt-maxindex-mask').css('display', 'block')
  379. $("#wt-tips-box").removeClass('hid-set-box')
  380. $("#wt-tips-box").addClass('show-set-box')
  381. $('#wt-tips-box .btn-box').empty()
  382. $('#wt-tips-box .btn-box').append(`
  383. <button class='cancel'>取消</button>
  384. <button class='submit'>确定</button>
  385. `)
  386. if (item.title) $('#wt-tips-box .content').html(item.title)
  387. if (item.doubt) $('#wt-tips-box .btn-box .cancel').css('display', 'block')
  388. if (item.confirm) $('#wt-tips-box .btn-box .submit').html(item.confirm)
  389. $('#wt-tips-box .btn-box .submit').on('click', () => {
  390. $('#wt-maxindex-mask').css('display', 'none')
  391. $("#wt-tips-box").removeClass('show-set-box')
  392. $("#wt-tips-box").addClass('hid-set-box')
  393. if (item.success) item.success(true)
  394. })
  395. $('#wt-tips-box .btn-box .cancel').on('click', () => {
  396. $('#wt-maxindex-mask').css('display', 'none')
  397. $("#wt-tips-box").removeClass('show-set-box')
  398. $("#wt-tips-box").addClass('hid-set-box')
  399. if (item.success) item.success(false)
  400. })
  401. },
  402. showNotify: (item = {}) => {
  403. $("#wt-notify-box").removeClass('hid-notify-box')
  404. $("#wt-notify-box").addClass('show-notify-box')
  405. let version = GM_info
  406. version = version ? version.script.version : ''
  407. const v = /当前脚本版本 (\d\.\d\.\d\.{0,1}\d{0,2})/.exec(item.title)
  408. if (v) item.title = item.title.replaceAll(v[1], version)
  409. if (item.title) $('#wt-notify-box .content').html(item.title + (version ?
  410. '<div style="text-align: right;color: #ccc;font-size: 10px;margin-top: 10px;">v ' +
  411. version + '</div>' : ''))
  412. superVip._CONFIG_.showNotify = true
  413. $('#wt-notify-box a').on('click', (e) => {
  414. e.stopPropagation()
  415. })
  416. $('#wt-notify-box').on('click', () => {
  417. $("#wt-notify-box").removeClass('show-notify-box')
  418. $("#wt-notify-box").addClass('hid-notify-box')
  419. superVip._CONFIG_.showNotify = false
  420. if (item.success) item.success(true)
  421. })
  422. }
  423. }
  424.  
  425.  
  426. const superVip = (function() {
  427.  
  428. const _CONFIG_ = {
  429. isMobile: navigator.userAgent.match(
  430. /(Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini)/i),
  431. currentPlayerNode: null,
  432. vipBoxId: 'wt-vip-jx-box' + Math.ceil(Math.random() * 100000000),
  433. initFailMsg: '抱歉,初始化失败,请尝试刷新页面或检查版本是否是最新版本,点击控制条喇叭查看当前版本号',
  434. homePage: decodeURIComponent(atob('aHR0cCUzQSUyRiUyRmpzeGwucHJv')),
  435. selectedPlayerName: "",
  436. endName: 'anM=',
  437. scripts: [
  438. // {
  439. // icon: 'https://mp-af307268-1b8a-482a-b75a-b6e98b125742.cdn.bspapp.com/system/logo/watermark_logo.png',
  440. // desc: '各大短视频平台视频/图集免费去水印下载,禁止下载的也能下载'
  441. // },
  442. {
  443. icon: 'https://mp-af307268-1b8a-482a-b75a-b6e98b125742.cdn.bspapp.com/system/logo/video_logo.png',
  444. desc: '各大视频平台VIP视频免费看',
  445. url: 'https://reset-zff.oss-cn-chengdu.aliyuncs.com/js/release/video.user'
  446. },
  447. {
  448. icon: 'https://be.uxdkel.com/static/images/index/dmdlog2.png',
  449. desc: '免费看付费短视频,网站内容可能引起不适,请谨慎使用。',
  450. url: 'https://reset-zff.oss-cn-chengdu.aliyuncs.com/js/release/91video.user'
  451. },
  452. {
  453. icon: 'https://mp-af307268-1b8a-482a-b75a-b6e98b125742.cdn.bspapp.com/system/logo/haijiao.png',
  454. desc: '免费看付费视频及图集,网站内容可能引起不适,请谨慎使用。',
  455. url: 'https://reset-zff.oss-cn-chengdu.aliyuncs.com/js/release/haijiao.user'
  456. },
  457. {
  458. icon: 'https://mp-af307268-1b8a-482a-b75a-b6e98b125742.cdn.bspapp.com/system/logo_transparent.png',
  459. desc: '前往及时行乐获取最新脚本链接',
  460. url: 'jsxl.pro'
  461. }],
  462. downUtils:[
  463. {title: '下载接口工具 1',url:'http://tools.bugscaner.com/m3u8.html',isAppend: false},
  464. {title: '下载接口工具 2',url:'https://tools.thatwind.com/tool/m3u8downloader#m3u8=',isAppend: true},
  465. {title: '下载接口工具 3',url:'https://blog.luckly-mjw.cn/tool-show/m3u8-downloader/index.html?source=',isAppend: true}
  466. ],
  467. supportApps: [{
  468. name: '腾讯视频',
  469. mobile: 'https://m.v.qq.com/',
  470. pc: 'https://v.qq.com/'
  471. },
  472. {
  473. name: '爱奇艺',
  474. mobile: 'https://m.iqiyi.com/',
  475. pc: 'https://www.iqiyi.com/'
  476. },
  477. {
  478. name: '优酷视频',
  479. mobile: 'https://www.youku.com/',
  480. pc: 'https://www.youku.com/'
  481. },
  482. {
  483. name: '哔哩哔哩',
  484. mobile: 'https://m.bilibili.com/',
  485. pc: 'https://www.bilibili.com/'
  486. },
  487. {
  488. name: '乐视视频',
  489. mobile: 'https://m.le.com/',
  490. pc: 'https://www.le.com/'
  491. },
  492. {
  493. name: '芒果视频',
  494. mobile: 'https://m.mgtv.com/home',
  495. pc: 'https://w.mgtv.com/'
  496. },
  497. {
  498. name: '搜狐视频',
  499. mobile: 'https://m.tv.sohu.com/',
  500. pc: 'https://film.sohu.com/'
  501. },
  502. ],
  503. videoParseList: [{
  504. name: "虎牙",
  505. type: "2",
  506. url: "https://www.huyaapi.com/api.php/provide/vod/from/hym3u8?ac=detail&"
  507. },
  508. {
  509. name: "红牛",
  510. type: "2",
  511. url: "https://www.hongniuzy2.com/api.php/provide/vod/from/hnm3u8?ac=detail&"
  512. },
  513. {
  514. name: "天空",
  515. type: "2",
  516. url: "https://api.tiankongapi.com/api.php/provide/vod/from/tkm3u8?ac=detail&"
  517. },
  518. {
  519. name: "新浪",
  520. type: "2",
  521. url: "https://api.xinlangapi.com/xinlangapi.php/provide/vod/from/xlm3u8?ac=detail&"
  522. },
  523. {
  524. name: "卧龙",
  525. type: "2",
  526. url: "https://collect.wolongzyw.com/api.php/provide/vod/from/wolong?ac=detail&"
  527. },
  528. {
  529. name: "光速",
  530. type: "2",
  531. url: "https://api.guangsuapi.com/api.php/provide/vod/from/gsm3u8?ac=detail&"
  532. },
  533. {
  534. name: "飞速",
  535. type: "2",
  536. url: "https://www.feisuzyapi.com/api.php/provide/vod/from/fsm3u8?ac=detail&"
  537. },
  538. {
  539. name: "飞语",
  540. type: "2",
  541. url: "http://film.feiyu.vin/api.php/provide/vod/from/xlm3u8?ac=detail&"
  542. },
  543. {
  544. name: "墨子",
  545. type: "2",
  546. url: "https://cj.lziapi.com/api.php/provide/vod?ac=detail&",
  547. result: "iframe"
  548. },
  549. // {
  550. // name: "高清",
  551. // type: "2",
  552. // url: "https://api.1080zyku.com/inc/apijson.php?ac=detail&",
  553. // msg: "播放超时"
  554. // },
  555. {
  556. name: "ikun",
  557. type: "2",
  558. url: "https://ikunzyapi.com/api.php/provide/vod/from/ikm3u8/at/json?ac=detail&"
  559. },
  560. {
  561. name: "非凡",
  562. type: "2",
  563. url: "http://cj.ffzyapi.com/api.php/provide/vod/from/ffm3u8?ac=detail&"
  564. },
  565. {
  566. name: "闪电",
  567. type: "2",
  568. url: "https://sdzyapi.com/api.php/provide/vod?ac=detail&"
  569. },
  570. {name: "综合",type: "1","url": "https://jx.jsonplayer.com/player/?url="},
  571. // {name: "简易",type: "1",url: "https://player.we-vip.com:2083/?url="},
  572. {name: "阳途",type: "1",url: "https://jx.yangtu.top/?url=",ads: '#adv_wrap_hh'},
  573. {name: "久凌", type: "1", url: "https://www.8090g.cn/?url=",ads: '#adv_wrap_hh'},
  574. {name: "檬幽", type: "1", url: "https://jx.m3u8.tv/jx/jx.php?url="},
  575. {name: "雨蒙", type: "1", url: "https://www.8090.la/8090/?url="},
  576. {name: "小麦", type: "1", url: "https://jx.xmflv.com/?url="},
  577. {name: "盘古", type: "1", url: "https://www.pangujiexi.com/jiexi/?url="},
  578. {name: "盗梦", type: "1", url: "https://dmjx.m3u8.tv/?url="},
  579. {name: "柏林", type: "1", url: "https://vip.bljiex.com/?v="},
  580. {name: "子午", type: "1", url: "https://www.playm3u8.cn/jiexi.php?url="},
  581. {name: "夜幕", type: "1", url: "https://www.yemu.xyz/?url="},
  582. {name: "player", type: "1", url: "https://jx.playerjy.com/?url="},
  583. {name: "we", type: "1", url: "https://jx.we-vip.com/?url="},
  584. // {name: "爱豆",type: "1","url": "https://jx.aidouer.net/?url="},
  585. {name: "创客", type: 1, url: "https://www.ckplayer.vip/jiexi/?url="},
  586. // {name: "1717", type: 1, url: "https://www.1717yun.com/jx/ty.php?url="}, 0
  587. // {name: "ivito", type: 1, url: "https://jx.ivito.cn/?url="} 0
  588. ],
  589. playerContainers: [{
  590. hostReg: /m.v.qq.com/,
  591. container: ".mod_player,.player",
  592. pathFormat: {
  593. reg: /&vid=.+/,
  594. rep: ['&vid=', '/']
  595. },
  596. playerPageReg: /m.v.qq.com\/x\/m\/play|v.qq.com\/cover\//,
  597. hidAds: '.open-app,.at-app-banner,#ad_m-site'
  598. },
  599. {
  600. hostReg: /(?<!m\.)v.qq.com/,
  601. container: "#player-container",
  602. playerPageReg: /v.qq.com\/x\/cover|v.qq.com\/x\/cover\//,
  603. stubbornPlayerProperty: {key: 'playsinline',val: 'isiPhoneShowPlaysinline'},
  604. hidAds: '.panel-tip-pay-video'
  605. },
  606. {
  607. hostReg: /iqiyi.com/,
  608. container: ".m-video-player-wrap,#flashbox",
  609. playerPageReg: /iqiyi.com\/v/,
  610. hidAds: '.m-iqyGuide-layer,.ChannelHomeBanner_hbd_eiF93,.m-iqylink-guide'
  611. },
  612. {
  613. hostReg: /youku.com/,
  614. container: "#player,.h5-detail-player",
  615. playerPageReg: /m.youku.com\/alipay_video|v.youku.com\/v_show|m.youku.com\/video\/id_/,
  616. hidAds: '.wtad'
  617. },
  618. {
  619. hostReg: /mgtv.com/,
  620. container: ".video-area,#mgtv-player-wrap",
  621. playerPageReg: /mgtv.com\/b/,
  622. hidAds: '.wtad'
  623. },
  624. {
  625. hostReg: /bilibili.com/,
  626. container: ".player-wrapper,.bpx-player-video-area",
  627. playerPageReg: /bilibili.com\/bangumi\/play/,
  628. hidAds: '.wtad'
  629. },
  630. {
  631. hostReg: /le.com/,
  632. container: ".playB,#fla_box",
  633. playerPageReg: /le.com\/(ptv\/)*vplay/,
  634. hidAds: '.wtad'
  635. },
  636. {
  637. hostReg: /sohu.com/,
  638. container: "#player,.x-player",
  639. playerPageReg: /sohu.com\/v/,
  640. hidAds: '.wtad'
  641. }
  642. ]
  643. };
  644.  
  645. class BaseConsumer {
  646. constructor(body) {
  647. this.parse = () => {
  648. try {
  649. if(window.location.href.includes('iqiyi')){
  650. Object.defineProperty(navigator, 'userAgent', {
  651. get: () =>
  652. "Mozilla/5.0 (Linux; Android 8.1.0; Pixel Build/OPM4.171019.021.D1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.109 Mobile Safari/537.36 EdgA/42.0.0.2057"
  653. })
  654. }
  655. } catch (e) {
  656. console.log(e)
  657. }
  658. util.findTargetElement('body').then((container) => this.generateElement(container)).then((
  659. container) => {
  660. //检测更新
  661. setTimeout(() => { util.checkUpdate()}, 1500)
  662. this.bindEvent(container)
  663. })
  664. }
  665. }
  666.  
  667. generateElement(container) {
  668. GM_addStyle(`
  669. @font-face {
  670. font-family: 'iconfont'; /* Project id 3913561 */
  671. src: url('//at.alicdn.com/t/c/font_3913561_cpe13fwca8.woff2?t=1696210493672') format('woff2'),
  672. url('//at.alicdn.com/t/c/font_3913561_cpe13fwca8.woff?t=1696210493672') format('woff'),
  673. url('//at.alicdn.com/t/c/font_3913561_cpe13fwca8.ttf?t=1696210493672') format('truetype');
  674. }
  675. .iconfont {
  676. font-family: "iconfont" !important;
  677. font-size: 16px;
  678. font-style: normal;
  679. font-weight: 400 !important;
  680. -webkit-font-smoothing: antialiased;
  681. -moz-osx-font-smoothing: grayscale;
  682. }
  683. @keyframes showSetBox {
  684. 0% {
  685. transform: translate(-50%,-50%) scale(0);
  686. }
  687. 80% {
  688. transform: translate(-50%,-50%) scale(1.1);
  689. }
  690. 100% {
  691. transform: translate(-50%,-50%) scale(1);
  692. }
  693. }
  694. @keyframes hidSetBox {
  695. 0% {
  696. transform: translate(-50%,-50%) scale(1);
  697. }
  698. 80% {
  699. transform: translate(-50%,-50%) scale(1.1);
  700. }
  701. 100% {
  702. transform: translate(-50%,-50%) scale(0);
  703. }
  704. }
  705. @keyframes showNotifyBox {
  706. 0% {
  707. transform: translate(-50%,-100%) scale(0);
  708. }
  709. 80% {
  710. transform: translate(-50%,35px) scale(1.1);
  711. }
  712. 100% {
  713. transform: translate(-50%,35px) scale(1);
  714. }
  715. }
  716. @keyframes hidNotifyBox {
  717. 0% {
  718. transform: translate(-50%,35px) scale(1.1);
  719. }
  720. 80% {
  721. transform: translate(-50%,35px) scale(1);
  722. }
  723. 100% {
  724. transform: translate(-50%,-100%) scale(0);
  725. }
  726. }
  727. @keyframes colorAnima {
  728. 0%{
  729. background-color: #f0f0f0;
  730. color: #5d5d5d;
  731. transform: scale(1);
  732. }
  733. 50%{
  734. transform: scale(1.1);
  735. }
  736. 100%{
  737. background-color: #ff6022;;
  738. color: white;
  739. transform: scale(1);
  740. }
  741. }
  742. @keyframes scale {
  743. 0%{
  744. transform: scale(1);
  745. }
  746. 50%{
  747. transform: scale(1.1);
  748. }
  749. 100%{
  750. transform: scale(1);
  751. }
  752. }
  753. @keyframes circletokLeft {
  754. 0%,100% {
  755. left: 0px;
  756. width: 12px;
  757. height: 12px;
  758. z-index: 0;
  759. }
  760. 25% {
  761. height: 15px;
  762. width: 15px;
  763. z-index: 1;
  764. left: 8px;
  765. transform: scale(1)
  766. }
  767. 50% {
  768. width: 12px;
  769. height: 12px;
  770. left: 22px;
  771. }
  772. 75% {
  773. width: 10px;
  774. height: 10px;
  775. left: 8px;
  776. transform: scale(1)
  777. }
  778. }
  779. @keyframes circletokRight {
  780. 0%,100% {
  781. top: 3px;
  782. left: 22px;
  783. width: 12px;
  784. height: 12px;
  785. z-index: 0
  786. }
  787. 25% {
  788. height: 15px;
  789. width: 15px;
  790. z-index: 1;
  791. left: 24px;
  792. transform: scale(1)
  793. }
  794. 50% {
  795. width: 12px;
  796. height: 12px;
  797. left: 0px
  798. }
  799. 75% {
  800. width: 10px;
  801. height: 10px;
  802. left: 24px;
  803. transform: scale(1)
  804. }
  805. }
  806. .color-anima{
  807. animation: colorAnima .3s ease 1 forwards;
  808. }
  809. .btn-anima{
  810. animation: scale .3s ease 1 forwards;
  811. }
  812. .video-desc{ margin-top: 45px;}
  813. ${_CONFIG_.currentPlayerNode.hidAds}{display: none!important;height: 0!important;width: 0!important;}
  814. .translate-right{ transform: translateX(-2px) !important;}
  815. .show-set-box{ animation: showSetBox 0.3s ease 1 forwards;}
  816. .hid-set-box{ animation: hidSetBox 0.3s ease 1 forwards;}
  817. .show-notify-box{ animation: showNotifyBox 0.3s ease 1 forwards;}
  818. .hid-notify-box{ animation: hidNotifyBox 0.3s ease 1 forwards;}
  819. #wt-loading-box{display: none;position: fixed;top: 0;left: 0;right: 0;bottom: 0;z-index: 100000;background-color: #0000004d;}
  820. #wt-loading-box .loading{position: absolute;width: 35px;height: 17px;top: 50%;left: 50%;transform: translate(-50%,-50%);}
  821. #wt-loading-box .loading::before,
  822. #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;}
  823. #wt-loading-box .loading::after{animation: circletokRight 1.2s linear infinite;background-color: #4de8f4;}
  824. #wt-left-show{ position: fixed;left: 20px;top: 50%;transform: translateY(-50%);z-index: 9999;transition: all 0.3s ease;}
  825. #wt-left-show i {color: #5f5b5b;font-size: 24px;color: #E91E63;text-shadow: #E91E63 2px 2px 12px;font-size: 25px;margin-left: -1px;}
  826. #wt-${_CONFIG_.vipBoxId}{
  827. position: fixed;
  828. top: 50%;
  829. transform: translate(0, -50%);
  830. right: 10px;
  831. width: 46px;
  832. border-radius: 30px;
  833. background: rgb(64 64 64 / 81%);
  834. box-shadow: 1px 1px 8px 1px rgb(98 99 99 / 34%);
  835. z-index: 9999;
  836. transition: all 0.3s ease;
  837. }
  838. .tips-yuan::before{ position: absolute; content: '';top: 12px; right: 6px;width: 8px;height: 8px; border-radius: 10px; background-color: #ff4757;}
  839. #wt-login-box .close,#wt-set-box .close,#wt-notify-box .close{position: absolute;right: 0;top: 0px;width: 40px;height: 40px;z-index: 10;}
  840. #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;}
  841. #wt-login-box .close::after,#wt-set-box .close::after,#wt-notify-box .close::after{transform: translate(-50%,-50%) rotate(-45deg);}
  842. #wt-${_CONFIG_.vipBoxId} .item{ position: relative;}
  843. #wt-${_CONFIG_.vipBoxId} .absolute-center{ position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%);}
  844. #wt-${_CONFIG_.vipBoxId} #wt-my img{ width: 28px;height: 28px;border-radius: 30px;transform: translateX(2px);transtion: all 0.3s ease;}
  845. #wt-${_CONFIG_.vipBoxId} #play div{ position: relative;width:24px;height:24px;border-radius:30px;border:2px solid #ffffff;margin: 0 auto;box-shadow: 1px 1px 8px 1px rgb(228 240 234 / 50%);transform: translateX(-2px);}
  846. #wt-${_CONFIG_.vipBoxId} #play i {color: white;font-size: 12px;text-shadow: 2px 2px 15px #ffffff;}
  847. #wt-${_CONFIG_.vipBoxId} #wt-my-set i, #wt-my-down i,#wt-my-play i{color: white;font-size: 24px;text-shadow: 2px 2px 15px #ffffff;}
  848. #wt-${_CONFIG_.vipBoxId} #wt-my-notify i {color: white;font-size: 23px;padding: 10px 1px;text-shadow: 2px 2px 15px #ffffff;}
  849. #wt-${_CONFIG_.vipBoxId} #wt-hid-box i {color: white;font-size: 24px;text-shadow: 2px 2px 15px #ffffff;font-size: 25px;margin-left: -1px;}
  850. #wt-mask-box,#wt-maxindex-mask{display:none; position: fixed; top: 0; left: 0; right: 0; bottom: 0; z-index: 10000; background-color: #0000004d;}
  851. #wt-maxindex-mask{z-index: 90000;display:none;}
  852. #wt-set-box{ position:fixed; top:50%;left:50%; transform: translate(-50%,-50%) scale(0);min-height: 285px;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;overflow: hidden;}
  853. #wt-set-box::before{content:'';position: absolute;width: 150px;height: 150px;border-radius: 100px;background-color: #2196F3;z-index: -1;opacity: 0.7;right: 200px;bottom: 0;transform: translateY(58%);}
  854. #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;left: 174px;transform: translateY(-53%);}
  855. #wt-set-box .call{position: absolute;bottom: 25px;right: 10px;color: #ccc;letter-spacing: 1px;transform: rotate(-14deg);opacity: 0.6;font-weight: 500;}
  856. #wt-set-box .scr-box{position: absolute;top:0;left:0;right:0;bottom:0;overflow-y: auto;box-sizing: border-box;margin: 10px 15px;margin-right: 5px;margin-bottom: 5px;}
  857. #wt-set-box .line-box .title{font-size: 13px;color: #000000; font-weight: 600;margin-top: 10px;margin-bottom: 12px;}
  858. #wt-set-box .line-box .item-box{padding-left: 10rpx;color: #5d5d5d}
  859. #wt-set-box ul{ display:flex;flex-wrap: wrap;}
  860. #wt-set-box ul li{ position: relative;vertical-align: top;background-color: #f0f0f0;margin-right: 10px;padding: 6px 12px;border-radius: 9px;margin-top: 2px;margin-bottom: 7px;color: #5d5d5d;font-size: 12px;transtion: all 0.3s ease;line-height: initial;font-family: 'iconfont';cursor: pointer;list-style-type:none}
  861. #wt-set-box ul .plus::after{ position: absolute;top: -6px;right: -5px;content: 'plus';color: #f53375;font-size: 8px;font-weight: 600;}
  862. #wt-set-box .selected-box .selected{ background-color: #ff6022;color: white;}
  863. #wt-set-box .user-box-container{display: none;letter-spacing: 1px;}
  864. #wt-set-box .user-box-container .update{position: absolute;bottom: 0;right: 0;text-align: right;font-size: 10px;margin-right: 10px;height: 30px;line-height: 30px;color: #2196F3;}
  865. #wt-set-box .info-box{display:flex;height: 50px;align-items: center;}
  866. #wt-set-box .info-box .avatar-box{background-color: white;border-radius: 7px;box-shadow: rgb(166 166 166 / 20%) 0px 1px 20px 0px;}
  867. #wt-set-box .user-box .title{text-align: center;font-weight: 600;font-size: 16px;color: #3a3a3a;}
  868. #wt-set-box .user-box .desc{font-size: 10px;color: #5d5d5d;margin: 0 10px;}
  869. #wt-set-box .user-box .avatar{ width: 36px;height:36px;border-radius: 30px;border-radius: 7px;}
  870. #wt-set-box .support-box li{ text-decoration: underline;color: #1e88e5;}
  871. #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;}
  872. #wt-tips-box .title{font-size: 16px;text-align: center;font-weight: 600;}
  873. #wt-tips-box .content{text-align: center;margin: 14px 0;font-size: 12px;color: #2a2a2a;font-weight: 500;}
  874. #wt-tips-box .content p{color: #ff4757;text-align: left;}
  875. #wt-tips-box .btn-box{display:flex;justify-content: space-around;}
  876. #wt-tips-box .btn-box button{min-width: 60px;height: 28px;background-color: #ec407a;border-radius: 30px;color: white;border: none;}
  877. #wt-tips-box .btn-box .cancel{display: none;background-color: #eee;color:#2a2a2a}
  878. #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;}
  879. #wt-notify-box::after{ content:'';position: absolute;width: 250px;height: 250px;border-radius: 200px;background-color: #03A9F4;z-index: -1;opacity: 0.7;bottom: 0;right: 166px;transform: translateY(85%);}
  880. #wt-notify-box .title{ text-align: center;height: 35px; line-height: 35px;font-size: 15px;font-weight: 600; color: #E91E63;}
  881. #wt-notify-box .content{ color: #3a3a3a;padding: 10px 15px;font-size: 12px;}
  882. #wt-notify-box .content a{color: #1E88E5;text-decoration: underline;}
  883. #wt-notify-box .content p{margin-bottom: 5px;}
  884. #wt-download-box{ z-index: 10010;}
  885. #wt-download-box .close{position: absolute;right: 0px;top: 0px;width: 40px;height: 40px;}
  886. #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);}
  887. #wt-download-box .close::after,#wt-download-box .close::after{transform: translate(-50%,-50%) rotate(-45deg);}
  888. #wt-download-box::before{content:'';position: absolute;width: 150px;height: 150px;border-radius: 100px;background-color: #e91e63;z-index: -1;opacity: 0.7;top: 0;right: 153px;transform: translateY(-40%);}
  889. #wt-download-box::after{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%);}
  890. #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 45px;border-radius: 40px;}
  891. `)
  892. if (_CONFIG_.isMobile) {
  893. GM_addStyle(`
  894. .m-video-player-wrap{padding-top: 0 !important;}
  895. #wt-set-box {width:72%;}
  896. `);
  897. }
  898.  
  899. let contents = "";
  900. _CONFIG_.videoParseList.forEach((item, index) => {
  901. contents += `<li class="item ` + (item.name == _CONFIG_.selectedPlayerName ?'color-anima ' : '') + (item.type == 2?'plus' : '') +
  902. `" data-index="${index}" data-name="${item.name}">${item.name}</li>`;
  903. })
  904. let supports = "";
  905. _CONFIG_.supportApps.forEach((item, index) => {
  906. supports +=
  907. `<li class="item" data-index="${index}" data-name="${item.name}">${item.name}</li>`;
  908. })
  909. let scripts = '';
  910. _CONFIG_.scripts.forEach((item, index) => {
  911. scripts += `
  912. <div class="info-box" data-index="${index}">
  913. <div class="avatar-box">
  914. <img class="avatar" src="${item.icon}"/>
  915. </div>
  916. <div class="desc">
  917. <text>${item.desc}</text>
  918. </div>
  919. </div>
  920. `;
  921. })
  922.  
  923. $(container).append(`
  924. <div id="wt-${_CONFIG_.vipBoxId}">
  925. <div id="wt-my" class="item wt_my_video" style="padding: 8px 11px;padding-top: 14px;">
  926. <img src="https://mp-af307268-1b8a-482a-b75a-b6e98b125742.cdn.bspapp.com/system/null_square.png"></img>
  927. </div>
  928. <div style="width:24px;height:2px;background-color:#fff;margin: 6px auto"></div>
  929. <div id="wt-my-play" class="item wt_my_play_video" style="padding: 7px 11px;">
  930. <i class="iconfont">&#xec05;</i>
  931. </div>
  932. <div style="width:24px;height:2px;background-color:#fff;margin: 6px auto"></div>
  933. <div id="wt-my-set" class="item wt_my_set_video" style="padding: 7px 11px;">
  934. <i class="iconfont">&#xe65b;</i>
  935. </div>
  936. <div style="width:24px;height:2px;background-color:#fff;margin: 6px auto"></div>
  937. <div id="wt-my-down" class="item wt_my_down_video" style="padding: 7px 11px;">
  938. <i class="iconfont">&#xec09;</i>
  939. </div>
  940. <div style="width:24px;height:2px;background-color:#fff;margin: 6px auto"></div>
  941. <div id="wt-my-notify" class="item wt_my_notify_video" style="padding: 7px 11px;">
  942. <i class="iconfont">&#xec08;</i>
  943. </div>
  944. <div style="width:24px;height:2px;background-color:#fff;margin: 6px auto"></div>
  945.  
  946. <div id="wt-hid-box" class="item" style="padding: 7px 12px;">
  947. <i class="iconfont">&#xec06;</i>
  948. </div>
  949. </div>
  950. <div id="wt-left-show" style="transform: translate(-60px,-50%);padding: 10px;">
  951. <i class="iconfont">&#xe704;</i>
  952. </div>
  953. <div id="wt-mask-box"></div>
  954. <div id="wt-set-box">
  955. <div class="close"></div>
  956. <div class="call">${decodeURIComponent(atob('JTQwcXEzNTUwMjc5NTU5'))}</div>
  957. <view class="scr-box">
  958. <div class="line-box" style="display:none">
  959. <div class="title">说明</div>
  960. <div class="item-box" style="padding-right: 10px;color: #e82f2f;font-size: 10px;">
  961. <div 如解析失败,请多次切换解析接口再试</div>
  962. <div 如解析完成的视频时长没有原视频的时长多,请多次切换解析接口再试</div>
  963. <div 如页面加载完成控制台或红眼没有显示,请多次刷新页面再试</div>
  964. </div>
  965. <div class="title">选择解析接口</div>
  966. <div class="item-box selected-box">
  967. <ul>
  968. ${contents}
  969. </ul>
  970. </div>
  971. <div class="title">目前支持平台(欢迎补充)</div>
  972. <div class="item-box support-box">
  973. <ul>
  974. ${supports}
  975. </ul>
  976. </div>
  977. </div>
  978. <div class="user-box-container">
  979. <div class="user-box">
  980. <div class="title" style="margin-bottom: 10px">及时行乐工具库</div>
  981. ${scripts}
  982. <div class="update">检查更新</div>
  983. </div>
  984. </div>
  985. </view>
  986. </div>
  987. <div id="wt-loading-box">
  988. <div class="loading"></div>
  989. </div>
  990. <div id="wt-maxindex-mask"></div>
  991. <div id="wt-tips-box">
  992. <div class="title">提示</div>
  993. <div class="content"></div>
  994. <div class="btn-box">
  995. <button class='cancel'>取消</button>
  996. <button class='submit'>确定</button>
  997. </div>
  998. </div>
  999. <div id="wt-notify-box">
  1000. <div class="close"></div>
  1001. <div class="title">通知</div>
  1002. <div class="content"></div>
  1003. </div>
  1004. `)
  1005. GM_addStyle(GM_getResourceText('videocss'))
  1006. if (_CONFIG_.user && _CONFIG_.user.avatar) {
  1007. $("#wt-my img").addClass('translate-right')
  1008. $('#wt-my img').attr('src', _CONFIG_.user.avatar)
  1009. }
  1010. if (!_CONFIG_.user) {
  1011. util.addLogin()
  1012. }
  1013. return new Promise((resolve, reject) => resolve(container));
  1014. }
  1015.  
  1016. bindEvent(container) {
  1017. const vipBox = $(`#wt-${_CONFIG_.vipBoxId}`)
  1018. if (GM_getValue('video_hid_controller', null)) {
  1019. vipBox.css("transform", "translate(125%, -50%)")
  1020. $('#wt-left-show').css("transform", "translate(0, -50%)")
  1021. }
  1022. //点击 我的
  1023. vipBox.find("#wt-my").on("click", () => {
  1024. if (_CONFIG_.user) {
  1025. if(_CONFIG_.myBtnOpen) return
  1026. _CONFIG_.myBtnOpen = true
  1027. $('#wt-mask-box').css('display', 'block')
  1028. $("#wt-set-box .user-box-container").css('display', 'block')
  1029. $("#wt-set-box").removeClass('hid-set-box')
  1030. $("#wt-set-box").addClass('show-set-box')
  1031. $('#wt-set-box .user-box-container .nickname').html(_CONFIG_.user.nickname)
  1032. util.showAndHidTips('wt_my_video','set',false)
  1033. } else {
  1034. util.addLogin();
  1035. $('#wt-login-mask').css('display', 'block')
  1036. $("#wt-login-box").removeClass('hid-set-box');
  1037. $("#wt-login-box").addClass('show-set-box')
  1038. $("#wt-login-box input").val('http://jsxl.pro')
  1039. }
  1040. })
  1041. $(".user-box-container .update").on("click", () => {
  1042. $.ajaxSetup({ async: false});
  1043. $('#wt-loading-box').css('display', 'block')
  1044. const res = util.checkUpdate(true)
  1045. $.ajaxSetup({ async: true});
  1046. if (res.code < 0) {
  1047. util.showTips({ title: res.msg})
  1048. }
  1049. $('#wt-loading-box').css('display', 'none')
  1050. })
  1051. vipBox.find("#wt-my-down").on("click",async () => {
  1052. if (!_CONFIG_.user) {
  1053. $("#wt-my").click()
  1054. return
  1055. }
  1056. util.showAndHidTips('wt_my_down_video', 'set', false)
  1057. util.showDownLoadWindow()
  1058. })
  1059. vipBox.find("#wt-my-play").on("click", (e) => {
  1060. if (!_CONFIG_.currentPlayerNode.playerPageReg.test(window.location
  1061. .href)) {
  1062. util.showTips({ title: '请在播放视频页面使用'})
  1063. return
  1064. }
  1065. const checkExistsNames = _CONFIG_.selectedPlayerName ? _CONFIG_.videoParseList.filter(item => item.name == _CONFIG_.selectedPlayerName) : []
  1066. if (checkExistsNames.length > 0) {
  1067. this.showPlayerWindow(checkExistsNames[0])
  1068. } else {
  1069. $('#wt-mask-box').css('display', 'block')
  1070. $("#wt-set-box .line-box").css('display', 'block')
  1071. $("#wt-set-box").removeClass('hid-set-box')
  1072. $("#wt-set-box").addClass('show-set-box')
  1073. }
  1074. util.showAndHidTips('wt_my_play_video','set',false)
  1075. })
  1076.  
  1077. // 点击 设置
  1078. vipBox.find("#wt-my-set").on("click", () => {
  1079. if(_CONFIG_.setBtnOpen) return
  1080. _CONFIG_.setBtnOpen = true
  1081. $('#wt-mask-box').css('display', 'block')
  1082. $("#wt-set-box .line-box").css('display', 'block')
  1083. $("#wt-set-box").css('padding-bottom', '10px')
  1084. $("#wt-set-box").removeClass('hid-set-box')
  1085. $("#wt-set-box").addClass('show-set-box')
  1086. $("#wt-set-box").css('min-height','370px')
  1087. util.showAndHidTips('wt_my_set_video','set',false)
  1088. })
  1089.  
  1090. //点击 通知
  1091. vipBox.find("#wt-my-notify").on("click", () => {
  1092. if (_CONFIG_.showNotify) {
  1093. $('#wt-notify-box').click()
  1094. } else {
  1095. const notify = GM_getValue('video_notify', '');
  1096. if (notify && (notify.date == new Date().setHours(0, 0, 0, 0))) {
  1097. util.showNotify({
  1098. title: notify.msg
  1099. })
  1100. } else {
  1101. util.showNotify({
  1102. title: '还没有通知信息'
  1103. })
  1104. };
  1105. util.showAndHidTips('wt_my_notify_video', 'set', false)
  1106. }
  1107. })
  1108.  
  1109. //点击 隐藏控制器
  1110. vipBox.find("#wt-hid-box").on("click", () => {
  1111. vipBox.css("transform", "translate(125%, -50%)")
  1112. $('#wt-left-show').css("transform", "translate(0, -50%)")
  1113. GM_setValue('video_hid_controller', 1)
  1114. })
  1115.  
  1116. //点击 显示控制器
  1117. $('#wt-left-show').on('click', () => {
  1118. $('#wt-left-show').css("transform", "translate(-60px, -50%)")
  1119. vipBox.css("transform", "translate(0, -50%)")
  1120. GM_setValue('video_hid_controller', '')
  1121. })
  1122.  
  1123. //点击 设置界面遮罩
  1124. $('#wt-mask-box').on('click', () => {
  1125. $('#wt-mask-box').css('display', 'none')
  1126. $("#wt-set-box").removeClass('show-set-box')
  1127. $("#wt-set-box").addClass('hid-set-box')
  1128. $("#wt-download-box").removeClass('show-set-box');
  1129. $("#wt-download-box").addClass('hid-set-box')
  1130. setTimeout(() => {
  1131. $("#wt-set-box .line-box").css('display', 'none')
  1132. $("#wt-set-box .user-box-container").css('display', 'none')
  1133. $("#wt-set-box").css('min-height','285px')
  1134. _CONFIG_.setBtnOpen = false
  1135. _CONFIG_.myBtnOpen = false
  1136. }, 500)
  1137. })
  1138.  
  1139. //点击 设置/我的信息界面关闭
  1140. $("#wt-set-box .close").on("click", () => {
  1141. $('#wt-mask-box').click()
  1142. })
  1143.  
  1144. //点击了支持平台
  1145. $('#wt-set-box').find(".support-box .item").each((liIndex, item) => {
  1146. item.addEventListener("click", () => {
  1147. const index = $(item).attr("data-index")
  1148. if (_CONFIG_.isMobile) {
  1149. console.log('opopop')
  1150. window.location.href = _CONFIG_.supportApps[index].mobile
  1151. } else {
  1152. window.location.href = _CONFIG_.supportApps[index].pc
  1153. }
  1154. })
  1155. })
  1156.  
  1157. //点击了 解析商
  1158. let _this = this;
  1159. $('#wt-set-box').find(".selected-box .item").each((liIndex, item) => {
  1160. item.addEventListener("click", () => {
  1161. _CONFIG_.selectedPlayerName = $(item).attr("data-name")
  1162. GM_setValue('selectedPlayerName', $(item).attr("data-name"))
  1163. if (_CONFIG_.currentPlayerNode.playerPageReg.test(window.location
  1164. .href)) {
  1165. const index = parseInt($(item).attr("data-index"))
  1166. _this.showPlayerWindow(_CONFIG_.videoParseList[index])
  1167. }
  1168. $('#wt-set-box').find(".selected-box .item").removeClass("color-anima")
  1169. $(item).addClass("color-anima")
  1170. $('#wt-mask-box').click()
  1171. })
  1172. })
  1173.  
  1174. //点击了推广app
  1175. $('#wt-set-box .user-box-container .user-box .info-box').on('click', function(e) {
  1176. let index = ''
  1177. try {
  1178. index = Number(e.currentTarget.attributes['data-index'].value)
  1179. } catch (e) {}
  1180. if (_CONFIG_.scripts[index].msg) {
  1181. util.showTips({
  1182. title: _CONFIG_.scripts[index].msg
  1183. })
  1184. return
  1185. };
  1186. if (index != (_CONFIG_.scripts.length - 1)) {
  1187. window.location.href = _CONFIG_.scripts[index].url + '.' + atob(_CONFIG_
  1188. .endName)
  1189. } else {
  1190. window.location.href = 'http://'+_CONFIG_.scripts[index].url
  1191. }
  1192. })
  1193. let tips = GM_getValue('wt_tips')
  1194. if(!tips) tips = {}
  1195. for(let i in tips){
  1196. if(tips[i]) $('.' + i).addClass('tips-yuan')
  1197. }
  1198. if(!('wt_my_video' in tips)) util.showAndHidTips('wt_my_video')
  1199. if(!('wt_my_set_video' in tips)) util.showAndHidTips('wt_my_set')
  1200. if(!('wt_my_down_video' in tips)) util.showAndHidTips('wt_my_down_video')
  1201. if(!('wt_my_play_video' in tips)) util.showAndHidTips('wt_my_play_video')
  1202. }
  1203.  
  1204. showPlayerWindow(v,re = {}) {
  1205. util.findTargetElement(_CONFIG_.currentPlayerNode.container)
  1206. .then(async (container) => {
  1207. if (!_CONFIG_.user) {
  1208. $("#wt-my").click();
  1209. return;
  1210. }
  1211. let u = re.u?re.u:''
  1212. const t = re.type?re.type: v.type
  1213. $('#wt-loading-box').css('display', 'block')
  1214. if (t == 2 && !u) {
  1215. try {
  1216. util.formatTitle()
  1217. let vi = ''
  1218. let r = ''
  1219. try{
  1220. r = await util.asyncHttp(v.url + 'wd=' + encodeURIComponent(_CONFIG_.videoName), 'GET')
  1221. }catch(e){ r=''}
  1222. try{
  1223. r = JSON.parse(r.replaceAll('<p>', '').replaceAll('</p>','').replace(/\s*/g, ""))
  1224. }catch(e){ r = ''}
  1225. if (!r || !r.list || r.list.length < 1){
  1226. console.log(' jx_error')
  1227. for(let i = 0; i < _CONFIG_.videoParseList.length; i++){
  1228. if(_CONFIG_.videoParseList[i].name == _CONFIG_.currentPlayerNode.selectedPlayerName || _CONFIG_.videoParseList[i].type != 2) continue
  1229. try{
  1230. r = await util.asyncHttp(_CONFIG_.videoParseList[i].url + 'wd=' + encodeURIComponent(_CONFIG_.videoName), 'GET')
  1231. if(r && r.length > 6) r = JSON.parse(r.replaceAll('<p>', '').replaceAll('</p>','').replace(/\s*/g, ""))
  1232. }catch(e){console.log(e);continue;}
  1233. if(r && r.list && r.list.length > 0){
  1234. const re = r.list.filter(item => {
  1235. return _CONFIG_.videoName == item.vod_name
  1236. })
  1237. if(re && re.length > 0){
  1238. vi = re[0]
  1239. _CONFIG_.selectedPlayerName = _CONFIG_.videoParseList[i].name
  1240. try{
  1241. const els = document.getElementById('wt-set-box').getElementsByClassName('plus')
  1242. for(let index = 0;index < els.length; index++){
  1243. if(i == index){
  1244. els[index].classList.add('color-anima')
  1245. }else{
  1246. els[index].classList.remove('color-anima')
  1247. }
  1248. }
  1249. }catch(e){}
  1250. GM_setValue('selectedPlayerName',_CONFIG_.videoParseList[i].name)
  1251. break
  1252. }
  1253. }
  1254. }
  1255. }else{
  1256. const re = r.list.filter(item => {
  1257. return _CONFIG_.videoName == item.vod_name
  1258. })
  1259. if(re && re.length > 0){
  1260. vi = re[0]
  1261. }else{
  1262. for(let i = 0; i < _CONFIG_.videoParseList.length; i++){
  1263. if(_CONFIG_.videoParseList[i].name == _CONFIG_.currentPlayerNode.selectedPlayerName || _CONFIG_.videoParseList[i].type != 2) continue
  1264. try{
  1265. r = await util.asyncHttp(_CONFIG_.videoParseList[i].url + 'wd=' + encodeURIComponent(_CONFIG_.videoName), 'GET')
  1266. if(r) r = JSON.parse(r.replaceAll('<p>', '').replaceAll('</p>','').replace(/\s*/g, ""))
  1267. }catch(e){console.log(e); continue;}
  1268. if(r && r.list && r.list.length > 0){
  1269. const re = r.list.filter(item => {
  1270. return _CONFIG_.videoName == item.vod_name
  1271. })
  1272. if(re && re.length > 0){
  1273. vi = re[0]
  1274. _CONFIG_.selectedPlayerName = _CONFIG_.videoParseList[i].name
  1275. try{
  1276. const els = document.getElementById('wt-set-box').getElementsByClassName('plus')
  1277. for(let index = 0;index < els.length; index++){
  1278. if(i == index){
  1279. els[index].classList.add('color-anima')
  1280. }else{
  1281. els[index].classList.remove('color-anima')
  1282. }
  1283. }
  1284. }catch(e){}
  1285. GM_setValue('selectedPlayerName',_CONFIG_.videoParseList[i].name)
  1286. break
  1287. }
  1288. }
  1289. }
  1290. }
  1291. }
  1292. if (!vi) throw new Error('解析失败1')
  1293. const p = vi.vod_play_url.split('#')
  1294. if (_CONFIG_.videoType == '电视剧') {
  1295. u = _CONFIG_.videoNum ? p[Number(_CONFIG_.videoNum)-1].split('$')[1] : p[0].split('$')[1]
  1296. } else {
  1297. u = p[0].split('$')[1]
  1298. }
  1299. for(let i = 0;i< _CONFIG_.videoParseList.length;i++){
  1300. if(_CONFIG_.selectedPlayerName == _CONFIG_.videoParseList[i].name){
  1301. if(_CONFIG_.videoParseList[i].result == 'iframe'){
  1302. superVip.showPlayerWindow(v,{u,type: 1})
  1303. return
  1304. }else{
  1305. _CONFIG_.videoUrl = u
  1306. }
  1307. }
  1308. }
  1309. } catch (e) {
  1310. console.log(e)
  1311. $('#wt-loading-box').css('display', 'none')
  1312. util.showTips({ title: '抱歉解析失败,请尝试更换普通解析路线再试'})
  1313. return
  1314. }
  1315. }
  1316. if(t != 2 && !u) u = util.formatData(v)
  1317. $('#wt-loading-box').css('display', 'none')
  1318. $(container).empty()
  1319. if (t == 1) {
  1320. let i = "position: relative;width:100%;height:100%;z-index:9998;"
  1321. if (_CONFIG_.isMobile) {
  1322. i =
  1323. "position: relative;width:100%;height:211px;z-index:9998;"
  1324. } else if (_CONFIG_.isMobile && window.location.href.indexOf(
  1325. "iqiyi.com") !== -1) {
  1326. i =
  1327. "position: relative;width:100%;height:211px;z-index:9998;margin-top:-56.25%;background-color: #000";
  1328. } else {
  1329. $(container).css("height", "500px")
  1330. }
  1331. $(container).append(
  1332. `<div style="${i}">
  1333. <div id="wt-iframe-loading" style="position: absolute;top: 0;left: 0;right: 0;bottom: 0;z-index:999999;">
  1334. <img src="https://mp-af307268-1b8a-482a-b75a-b6e98b125742.cdn.bspapp.com/system/image/loading-black.gif" style="width: 100%;height: 100%;"></img>
  1335. </div>
  1336. <iframe id="iframe-player-4a5b6c" src="${u+'&wt_video_iframe=1'}" style="position: relative;z-index:999;border:none;" allowfullscreen="true" width="100%" height="100%"></iframe>
  1337. </div>`
  1338. );
  1339. unsafeWindow.addEventListener('message', e => {
  1340. if (e.data.video === 'find') {
  1341. $('#wt-iframe-loading').css('z-index','-100')
  1342. }
  1343. if(e.data.video === 'not_find'){
  1344. util.showTips({ title: '抱歉,解析失败,请更换解析接口再试'})
  1345. }
  1346. });
  1347. } else if (t == 2) {
  1348. const videoid = 'videoid' + Math.ceil(Math.random() * 100000000)
  1349. $(container).append(`
  1350. <div style="position: relative;width: 100%;height: 100%;">
  1351. <div id="wt-iframe-loading" style="position: absolute;top: 0;left: 0;right: 0;bottom: 0;z-index:999999;">
  1352. <img src="https://mp-af307268-1b8a-482a-b75a-b6e98b125742.cdn.bspapp.com/system/image/loading-black.gif" style="width: 100%;height: 100%;"></img>
  1353. </div>
  1354. <div id="${videoid}" style="width: 100%;height: 100%;"></div>
  1355. </div>
  1356. `)
  1357. const dp = new DPlayer({
  1358. container: document.getElementById(videoid),
  1359. screenshot: true,
  1360. video: {
  1361. url: u,
  1362. }
  1363. })
  1364. dp.on('canplay', function () {
  1365. $('#wt-iframe-loading').css('z-index','-100')
  1366. });
  1367. dp.play()
  1368. } else {
  1369. GM_openInTab(u, {
  1370. active: true,
  1371. insert: true,
  1372. setParent: true
  1373. })
  1374. }
  1375. util.urlChangeReload()
  1376. })
  1377. }
  1378. }
  1379. return {
  1380. start: () => {
  1381. const wt_video_first_use = GM_getValue('wt_video_first_use', '')
  1382. if (!wt_video_first_use) GM_setValue('wt_video_first_use', Date.now() + (Math.round(Math
  1383. .random() * 899999 + 100000) + ''))
  1384. let playerNode = _CONFIG_.playerContainers.filter(value => value.hostReg.test(window.location
  1385. .href))
  1386. if (playerNode === null || playerNode.length <= 0) {
  1387. util.showTips({
  1388. title: '该网站暂未适配此脚本,请联系作者'
  1389. })
  1390. return
  1391. }
  1392. _CONFIG_.user = GM_getValue('jsxl_user', '')
  1393. _CONFIG_.selectedPlayerName = GM_getValue('selectedPlayerName', _CONFIG_.videoParseList[0].name)
  1394. _CONFIG_.currentPlayerNode = playerNode[0]
  1395. const targetConsumer = new BaseConsumer
  1396. targetConsumer.parse()
  1397. },
  1398. showPlayerWindow: (videoObj,url) => {
  1399. const baseConsumer = new BaseConsumer
  1400. baseConsumer.showPlayerWindow(videoObj,url)
  1401. },
  1402. _CONFIG_
  1403. }
  1404. })();
  1405.  
  1406. (function() {
  1407. if(location.href.includes('tools.bugscaner.com')){
  1408. util.findTargetElement('.input-group input').then(res =>{
  1409. const url = location.search.replace('?m3u8=','').replace(/\s*/g,"")
  1410. if(url && url.startsWith('http')){
  1411. $(res).val(url)
  1412. }
  1413. })
  1414. return
  1415. }
  1416. if(location.href.includes('tools.thatwind.com')){
  1417. GM_addStyle(`.top-ad{display: none !important;}`)
  1418. util.findTargetElement('.bx--text-input__field-outer-wrapper input',10).then(res =>{
  1419. $(res).val(Date.now())
  1420. res.dispatchEvent(new Event("input"))
  1421. })
  1422. return
  1423. }
  1424. if(location.href.includes('blog.luckly-mjw.cn')){
  1425. GM_addStyle(`
  1426. #m-app a,.m-p-temp-url,.m-p-cross,.m-p-input-container div:nth-of-type(1){display: none !important;}
  1427. .m-p-input-container{ display: block;}
  1428. .m-p-input-container input{ width: 100%;font-size: 12px;margin-bottom: 5px;}
  1429. .m-p-input-container div{ height: 45px;line-height: 45px;font-size: 15px;margin-top: 3px;}
  1430. .m-p-stream{line-height: normal;font-size: 12px;}
  1431. `)
  1432. return
  1433. }
  1434. if (location.href.includes('/?url=http') || location.href.includes('/?v=http')) {
  1435. superVip._CONFIG_.videoParseList.forEach(item =>{
  1436. if(item.type == 1 && location.href.includes(item.url) && item.ads){
  1437. GM_addStyle(`
  1438. ${item.ads}{ display: none!important;height: 0!important;}
  1439. `)
  1440. }
  1441. })
  1442. util.findTargetElement('video',15).then(res=>{
  1443. document.getElementsByTagName('video')[0].autoplay = true
  1444. let oncanplay = false
  1445. document.getElementsByTagName('video')[0].oncanplay=function(){
  1446. document.getElementsByTagName('video')[0].play()
  1447. console.log('video load success')
  1448. window.top.postMessage({ video: 'find'}, '*');
  1449. oncanplay = true
  1450. }
  1451. setTimeout(()=>{
  1452. if(!oncanplay) window.top.postMessage({ video: 'not_find'}, '*');
  1453. },15000)
  1454. }).catch(err =>{
  1455. if(document.getElementsByTagName('iframe').length < 1) window.top.postMessage({ video: 'not_find'}, '*');
  1456. })
  1457. return
  1458. }
  1459. unsafeWindow.wt_video_script = true
  1460. superVip.start();
  1461. })();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址