Vdownload

音视频下载器

目前为 2022-08-02 提交的版本。查看 最新版本

  1. // ==UserScript==
  2. // @name Vdownload
  3. // @name:zh-CN 下载器(个人使用)
  4. // @namespace http://tampermonkey.net/
  5. // @version 0.412
  6. // @description 音视频下载器
  7. // @author 浣熊
  8. // @match *://*/*
  9. // @icon data:image/png;base64,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
  10. // @grant none
  11. // @run-at document-start
  12. // @require https://cdn.bootcdn.net/ajax/libs/jquery/2.2.2/jquery.min.js
  13. // @license https://github.com/1024Vip/Vdownload/blob/main/LICENSE
  14. // ==/UserScript==
  15.  
  16. (function () {
  17. window.autoDownload = 0;
  18. window.isComplete = 0;
  19. window.audio = [];
  20. window.video = [];
  21. window.downloadAll = 0;
  22. window.quickPlay = 1.0;
  23. var isDelTabPage = 0; //1关闭;
  24. var downloadName = document.title;
  25. var isVideo = 0;//1存在视频
  26. var loadTrue = false;
  27. function Insertstyle(css, ref) {
  28. var insertAt, head, style;
  29. void 0 === ref && (ref = {}), insertAt = ref.insertAt, css && "undefined" != typeof document && (head = document.head || document.getElementsByTagName("head")[0],
  30. (style = document.createElement("style")).type = "text/css", "top" === insertAt && head.firstChild ? head.insertBefore(style, head.firstChild) : head.appendChild(style),
  31. style.styleSheet ? style.styleSheet.cssText = css : style.appendChild(document.createTextNode(css)));
  32. }
  33. function XF() {
  34. let parentID = 'VdownLoad-nav';
  35. //鼠标移动
  36. var scrollMove = function () {
  37. window.onscroll = window.onload = function () {
  38. var scrollsidebar = document.getElementById(parentID);
  39. var scrolltop = document.body.scrollTop || document.documentElement.scrollTop;
  40. startMove(
  41. parseInt(
  42. (document.documentElement.clientHeight -
  43. scrollsidebar.offsetHeight) / 2 + scrolltop
  44. )
  45. );
  46. };
  47. };
  48. //获取元素
  49. var dv = document.getElementById(parentID);
  50. var x = 0;
  51. var y = 0;
  52. var l = 0;
  53. var t = 0;
  54. var isDown = false;
  55. //鼠标按下事件
  56. dv.onmousedown = function (e) {
  57. //获取x坐标和y坐标
  58. x = e.clientX;
  59. y = e.clientY;
  60.  
  61. //获取左部和顶部的偏移量
  62. l = dv.offsetLeft;
  63. t = dv.offsetTop;
  64. //开关打开
  65. isDown = true;
  66. //设置样式
  67. dv.style.cursor = 'move';
  68. }
  69. //鼠标移动
  70. dv.onmousemove = function (e) {
  71. if (isDown == false) {
  72. return;
  73. }
  74. //获取x和y
  75. var nx = e.clientX;
  76. var ny = e.clientY;
  77. //计算移动后的左偏移量和顶部的偏移量
  78. var nl = nx - (x - l);
  79. var nt = ny - (y - t);
  80.  
  81. dv.style.left = nl + 'px';
  82. dv.style.top = nt + 'px';
  83. }
  84. //鼠标抬起事件
  85. dv.onmouseup = function () {
  86. //开关关闭
  87. isDown = false;
  88. dv.style.cursor = 'default';
  89. }
  90. };
  91. const SetplaybackRate = (e) => {
  92. var pageX = e.pageX,
  93. pageY = e.pageY;
  94. let ID = 'div_play';
  95. if ($('#' + ID).length > 0) {
  96. $('#' + ID).remove();
  97. }
  98. let SD = 1;
  99. if (document.querySelector('video') !== null)
  100. SD = document.querySelector('video').playbackRate;
  101. $('body').prepend(`
  102. <div id="${ID}" class="div_play" style="display:none">
  103. <input type="number" min="0" max="16" value="${SD}" id="numPlay">
  104. <input type="button" value="取消" onclick="$('#${ID}').fadeOut(()=>$(this).parent().remove())">
  105. <input type="button" value="确定" id="playSDSure"">
  106. </div>
  107. `)
  108. $(document).on('click', '#playSDSure', () => { playSDSure('numPlay') })
  109. // onclick="playSDSure('numPlay')
  110. let py = document.getElementById(ID);
  111. $(py).fadeIn();
  112. py.style.left = pageX + 'px';
  113. py.style.top = pageY + 'px';
  114. }
  115. const playSDSure = (id) => {
  116. let val = parseFloat($('#' + id).val());
  117. val = val === 0 ? 1 : val;
  118. if (document.querySelector('video') !== null)
  119. document.querySelector('video').playbackRate = val;
  120. console.log(val);
  121. $('#' + id).parent().fadeOut(() => { $(this).remove() });
  122. }
  123. const Vdown = (isDel) => {
  124. isDelTabPage = isDel;
  125. window.autoDownload = 1;
  126. }
  127.  
  128. const XFrun = () => {
  129. var css_asd1 = `
  130. .div_play {
  131. background-color: #98cad9;
  132. opacity: .8;
  133. padding: 10px;
  134. border-radius: 10px;
  135. position: fixed;
  136. z-index: 999999;
  137. }
  138. html .hxaside-nav {
  139. -ms-text-size-adjust: 100%;
  140. -webkit-text-size-adjust: 100%;
  141. -webkit-font-smoothing: antialiased;
  142. font-size: 62.5%
  143. }
  144.  
  145. body .hxaside-nav {
  146. font-family: "Helvetica Neue", Helvetica, "Microsoft YaHei", Arial, sans-serif;
  147. margin: 0;
  148. font-size: 1.6rem;
  149. color: #4e546b
  150. }
  151.  
  152. .hxaside-nav {
  153. position: fixed;
  154. bottom: 0;
  155. left: -47px;
  156. width: 260px;
  157. height: 260px;
  158. -webkit-filter: url(#goo);
  159. filter: url(#goo);
  160. -ms-user-select: none;
  161. -moz-user-select: none;
  162. -webkit-user-select: none;
  163. user-select: none;
  164. opacity: .75;
  165. z-index: 999998
  166. }
  167.  
  168. .hxaside-nav.no-filter {
  169. -webkit-filter: none;
  170. filter: none
  171. }
  172.  
  173. .hxaside-nav .hxaside-menu {
  174. position: absolute;
  175. width: 70px;
  176. height: 70px;
  177. -webkit-border-radius: 50%;
  178. border-radius: 50%;
  179. background: #65c5da;
  180. left: -95px;
  181. top: 0;
  182. right: 0;
  183. bottom: 0;
  184. margin: auto;
  185. text-align: center;
  186. line-height: 70px;
  187. color: #fff;
  188. font-size: 20px;
  189. z-index: 1;
  190. cursor: move
  191. }
  192.  
  193. .hxaside-nav .hxmenu-item {
  194. position: absolute;
  195. width: 60px;
  196. height: 60px;
  197. background-color: #e6b451;
  198. left: -95px;
  199. top: 0;
  200. right: 0;
  201. bottom: 0;
  202. margin: auto;
  203. line-height: 60px;
  204. text-align: center;
  205. -webkit-border-radius: 50%;
  206. border-radius: 50%;
  207. text-decoration: none;
  208. color: #fff;
  209. -webkit-transition: background .5s, -webkit-transform .6s;
  210. transition: background .5s, -webkit-transform .6s;
  211. -moz-transition: transform .6s, background .5s, -moz-transform .6s;
  212. transition: transform .6s, background .5s;
  213. transition: transform .6s, background .5s, -webkit-transform .6s, -moz-transform .6s;
  214. font-size: 14px;
  215. -webkit-box-sizing: border-box;
  216. -moz-box-sizing: border-box;
  217. box-sizing: border-box
  218. }
  219.  
  220. .hxaside-nav .hxmenu-item:hover {
  221. background: #a9c734
  222. }
  223.  
  224. .hxaside-nav .hxmenu-line {
  225. line-height: 20px;
  226. padding-top: 10px
  227. }
  228.  
  229. .hxaside-nav:hover {
  230. opacity: 1
  231. }
  232.  
  233. .hxaside-nav:hover .hxaside-menu {
  234. -webkit-animation: jello 1s;
  235. -moz-animation: jello 1s;
  236. animation: jello 1s
  237. }
  238.  
  239. .hxaside-nav:hover .hxmenu-first {
  240. -webkit-transform: translate3d(0, -135%, 0);
  241. -moz-transform: translate3d(0, -135%, 0);
  242. transform: translate3d(0, -135%, 0)
  243. }
  244.  
  245. .hxaside-nav:hover .hxmenu-second {
  246. -webkit-transform: translate3d(120%, -70%, 0);
  247. -moz-transform: translate3d(120%, -70%, 0);
  248. transform: translate3d(120%, -70%, 0)
  249. }
  250.  
  251. .hxaside-nav:hover .hxmenu-third {
  252. -webkit-transform: translate3d(120%, 70%, 0);
  253. -moz-transform: translate3d(120%, 70%, 0);
  254. transform: translate3d(120%, 70%, 0)
  255. }
  256.  
  257. .hxaside-nav:hover .hxmenu-fourth {
  258. -webkit-transform: translate3d(0, 135%, 0);
  259. -moz-transform: translate3d(0, 135%, 0);
  260. transform: translate3d(0, 135%, 0)
  261. }
  262.  
  263. @-webkit-keyframes jello {
  264.  
  265. from,
  266. 11.1%,
  267. to {
  268. -webkit-transform: none;
  269. transform: none
  270. }
  271.  
  272. 22.2% {
  273. -webkit-transform: skewX(-12.5deg) skewY(-12.5deg);
  274. transform: skewX(-12.5deg) skewY(-12.5deg)
  275. }
  276.  
  277. 33.3% {
  278. -webkit-transform: skewX(6.25deg) skewY(6.25deg);
  279. transform: skewX(6.25deg) skewY(6.25deg)
  280. }
  281.  
  282. 44.4% {
  283. -webkit-transform: skewX(-3.125deg) skewY(-3.125deg);
  284. transform: skewX(-3.125deg) skewY(-3.125deg)
  285. }
  286.  
  287. 55.5% {
  288. -webkit-transform: skewX(1.5625deg) skewY(1.5625deg);
  289. transform: skewX(1.5625deg) skewY(1.5625deg)
  290. }
  291.  
  292. 66.6% {
  293. -webkit-transform: skewX(-.78125deg) skewY(-.78125deg);
  294. transform: skewX(-.78125deg) skewY(-.78125deg)
  295. }
  296.  
  297. 77.7% {
  298. -webkit-transform: skewX(0.390625deg) skewY(0.390625deg);
  299. transform: skewX(0.390625deg) skewY(0.390625deg)
  300. }
  301.  
  302. 88.8% {
  303. -webkit-transform: skewX(-.1953125deg) skewY(-.1953125deg);
  304. transform: skewX(-.1953125deg) skewY(-.1953125deg)
  305. }
  306. }
  307.  
  308. @-moz-keyframes jello {
  309.  
  310. from,
  311. 11.1%,
  312. to {
  313. -moz-transform: none;
  314. transform: none
  315. }
  316.  
  317. 22.2% {
  318. -moz-transform: skewX(-12.5deg) skewY(-12.5deg);
  319. transform: skewX(-12.5deg) skewY(-12.5deg)
  320. }
  321.  
  322. 33.3% {
  323. -moz-transform: skewX(6.25deg) skewY(6.25deg);
  324. transform: skewX(6.25deg) skewY(6.25deg)
  325. }
  326.  
  327. 44.4% {
  328. -moz-transform: skewX(-3.125deg) skewY(-3.125deg);
  329. transform: skewX(-3.125deg) skewY(-3.125deg)
  330. }
  331.  
  332. 55.5% {
  333. -moz-transform: skewX(1.5625deg) skewY(1.5625deg);
  334. transform: skewX(1.5625deg) skewY(1.5625deg)
  335. }
  336.  
  337. 66.6% {
  338. -moz-transform: skewX(-.78125deg) skewY(-.78125deg);
  339. transform: skewX(-.78125deg) skewY(-.78125deg)
  340. }
  341.  
  342. 77.7% {
  343. -moz-transform: skewX(0.390625deg) skewY(0.390625deg);
  344. transform: skewX(0.390625deg) skewY(0.390625deg)
  345. }
  346.  
  347. 88.8% {
  348. -moz-transform: skewX(-.1953125deg) skewY(-.1953125deg);
  349. transform: skewX(-.1953125deg) skewY(-.1953125deg)
  350. }
  351. }
  352.  
  353. @keyframes jello {
  354.  
  355. from,
  356. 11.1%,
  357. to {
  358. -webkit-transform: none;
  359. -moz-transform: none;
  360. transform: none
  361. }
  362.  
  363. 22.2% {
  364. -webkit-transform: skewX(-12.5deg) skewY(-12.5deg);
  365. -moz-transform: skewX(-12.5deg) skewY(-12.5deg);
  366. transform: skewX(-12.5deg) skewY(-12.5deg)
  367. }
  368.  
  369. 33.3% {
  370. -webkit-transform: skewX(6.25deg) skewY(6.25deg);
  371. -moz-transform: skewX(6.25deg) skewY(6.25deg);
  372. transform: skewX(6.25deg) skewY(6.25deg)
  373. }
  374.  
  375. 44.4% {
  376. -webkit-transform: skewX(-3.125deg) skewY(-3.125deg);
  377. -moz-transform: skewX(-3.125deg) skewY(-3.125deg);
  378. transform: skewX(-3.125deg) skewY(-3.125deg)
  379. }
  380.  
  381. 55.5% {
  382. -webkit-transform: skewX(1.5625deg) skewY(1.5625deg);
  383. -moz-transform: skewX(1.5625deg) skewY(1.5625deg);
  384. transform: skewX(1.5625deg) skewY(1.5625deg)
  385. }
  386.  
  387. 66.6% {
  388. -webkit-transform: skewX(-.78125deg) skewY(-.78125deg);
  389. -moz-transform: skewX(-.78125deg) skewY(-.78125deg);
  390. transform: skewX(-.78125deg) skewY(-.78125deg)
  391. }
  392.  
  393. 77.7% {
  394. -webkit-transform: skewX(0.390625deg) skewY(0.390625deg);
  395. -moz-transform: skewX(0.390625deg) skewY(0.390625deg);
  396. transform: skewX(0.390625deg) skewY(0.390625deg)
  397. }
  398.  
  399. 88.8% {
  400. -webkit-transform: skewX(-.1953125deg) skewY(-.1953125deg);
  401. -moz-transform: skewX(-.1953125deg) skewY(-.1953125deg);
  402. transform: skewX(-.1953125deg) skewY(-.1953125deg)
  403. }
  404. }
  405.  
  406. .animated {
  407. -webkit-animation-duration: 1s;
  408. -moz-animation-duration: 1s;
  409. animation-duration: 1s;
  410. -webkit-animation-fill-mode: both;
  411. -moz-animation-fill-mode: both;
  412. animation-fill-mode: both
  413. }
  414.  
  415. @-webkit-keyframes divhxUp {
  416.  
  417. from,
  418. 60%,
  419. 75%,
  420. 90%,
  421. to {
  422. -webkit-animation-timing-function: cubic-bezier(0.215, .61, .355, 1);
  423. animation-timing-function: cubic-bezier(0.215, .61, .355, 1)
  424. }
  425.  
  426. from {
  427. opacity: 0;
  428. -webkit-transform: translate3d(0, 800px, 0);
  429. transform: translate3d(0, 800px, 0)
  430. }
  431.  
  432. 60% {
  433. opacity: 1;
  434. -webkit-transform: translate3d(0, -20px, 0);
  435. transform: translate3d(0, -20px, 0)
  436. }
  437.  
  438. 75% {
  439. -webkit-transform: translate3d(0, 10px, 0);
  440. transform: translate3d(0, 10px, 0)
  441. }
  442.  
  443. 90% {
  444. -webkit-transform: translate3d(0, -10px, 0);
  445. transform: translate3d(0, -10px, 0)
  446. }
  447.  
  448. to {
  449. -webkit-transform: translate3d(0, 0, 0);
  450. transform: translate3d(0, 0, 0)
  451. }
  452. }
  453.  
  454. @-moz-keyframes divhxUp {
  455.  
  456. from,
  457. 60%,
  458. 75%,
  459. 90%,
  460. to {
  461. -moz-animation-timing-function: cubic-bezier(0.215, .61, .355, 1);
  462. animation-timing-function: cubic-bezier(0.215, .61, .355, 1)
  463. }
  464.  
  465. from {
  466. opacity: 0;
  467. -moz-transform: translate3d(0, 800px, 0);
  468. transform: translate3d(0, 800px, 0)
  469. }
  470.  
  471. 60% {
  472. opacity: 1;
  473. -moz-transform: translate3d(0, -20px, 0);
  474. transform: translate3d(0, -20px, 0)
  475. }
  476.  
  477. 75% {
  478. -moz-transform: translate3d(0, 10px, 0);
  479. transform: translate3d(0, 10px, 0)
  480. }
  481.  
  482. 90% {
  483. -moz-transform: translate3d(0, -5px, 0);
  484. transform: translate3d(0, -5px, 0)
  485. }
  486.  
  487. to {
  488. -moz-transform: translate3d(0, 0, 0);
  489. transform: translate3d(0, 0, 0)
  490. }
  491. }
  492.  
  493. @keyframes divhxUp {
  494.  
  495. from,
  496. 60%,
  497. 75%,
  498. 90%,
  499. to {
  500. -webkit-animation-timing-function: cubic-bezier(0.215, .61, .355, 1);
  501. -moz-animation-timing-function: cubic-bezier(0.215, .61, .355, 1);
  502. animation-timing-function: cubic-bezier(0.215, .61, .355, 1)
  503. }
  504.  
  505. from {
  506. opacity: 0;
  507. -webkit-transform: translate3d(0, 800px, 0);
  508. -moz-transform: translate3d(0, 800px, 0);
  509. transform: translate3d(0, 800px, 0)
  510. }
  511.  
  512. 60% {
  513. opacity: 1;
  514. -webkit-transform: translate3d(0, -20px, 0);
  515. -moz-transform: translate3d(0, -20px, 0);
  516. transform: translate3d(0, -20px, 0)
  517. }
  518.  
  519. 75% {
  520. -webkit-transform: translate3d(0, 10px, 0);
  521. -moz-transform: translate3d(0, 10px, 0);
  522. transform: translate3d(0, 10px, 0)
  523. }
  524.  
  525. 90% {
  526. -webkit-transform: translate3d(0, -5px, 0);
  527. -moz-transform: translate3d(0, -5px, 0);
  528. transform: translate3d(0, -5px, 0)
  529. }
  530.  
  531. to {
  532. -webkit-transform: translate3d(0, 0, 0);
  533. -moz-transform: translate3d(0, 0, 0);
  534. transform: translate3d(0, 0, 0)
  535. }
  536. }
  537.  
  538. .divhxUp {
  539. -webkit-animation-name: divhxUp;
  540. -moz-animation-name: divhxUp;
  541. animation-name: divhxUp;
  542. -webkit-animation-delay: 1s;
  543. -moz-animation-delay: 1s;
  544. animation-delay: 1s
  545. }
  546. .MsgQB{
  547. position: fixed;
  548. border-radius: 10px;
  549. padding:10px;
  550. opacity:.8;
  551. left:-1px;
  552. bottom: 80%;
  553. // animation:pf 5s;
  554. z-index: 999999;
  555. }
  556. @keyframes pf{
  557. 0% {bottom:0;}
  558. 10% {bottom:80%;}
  559. 80% {bottom:80%;opacity: .8;}
  560. 88% {opacity: .5;}
  561. 100% {opacity: 0;bottom:100%;}
  562. }
  563. @keyframes pfhide{
  564. 0% {}
  565. 20% {opacity: .8;}
  566. 40% {opacity: .6;}
  567. 60% {opacity: .4;}
  568. 80% {opacity: .2;}
  569. 100% {opacity: 0;bottom:100%;}
  570. }`;
  571. Insertstyle(css_asd1);
  572. if (loadTrue) {
  573. return;
  574. }
  575. if (isVideo !== 1)
  576. return;
  577. Msg('开始缓存啦');
  578. if (location.href.indexOf('51moot') > 0) {
  579. window.onblur = null;
  580. downloadName = $('.vedio-play-nav ul li').last().get(0).innerText
  581. //document.querySelector('video').playbackRate = 16.0;
  582. }
  583. $('body').prepend(`
  584. <div class="hxaside-nav divhxUp animated no-filter" id="VdownLoad-nav">
  585. <label for="" class="hxaside-menu" title="按住拖动">Videos</label>
  586. <a href="javascript:void(0)" title="本次关闭" id="XFclose"
  587. class="hxmenu-item hxmenu-line hxmenu-first">本次<br>关闭</a>
  588. <a href="javascript:void(0)" id="vdown0" title="缓存进度条完成时,自动下载视频"
  589. class="hxmenu-item hxmenu-line hxmenu-second">下载<br>视频</a>
  590. <a href="javascript:void(0)" id="vdown1" title="缓存进度条完成时,自动下载视频,并自动关闭当前页"
  591. class="hxmenu-item hxmenu-line hxmenu-third">下载后<br>关闭</a>
  592. <a href="javascript:void(0)" title="设置播放速度" id="SetplaybackRate"
  593. class="hxmenu-item hxmenu-line hxmenu-fourth">设置<br>速度</a>
  594. </div>
  595. `)
  596. $(document).on('click', '#XFclose', () => { let $nav = $('#VdownLoad-nav'); $nav.fadeOut(() => { loadTrue = false; $nav.remove() }) })
  597. $(document).on('click', '#SetplaybackRate', () => { SetplaybackRate(event) })
  598. $(document).on('click', '#vdown0', () => { Vdown(0) })
  599. $(document).on('click', '#vdown1', () => { Vdown(1) })
  600. XF();
  601. }
  602.  
  603. XFrun();
  604. //----------------------------分割线----------------------------------------------
  605.  
  606.  
  607.  
  608. const _endOfStream = window.MediaSource.prototype.endOfStream
  609. window.MediaSource.prototype.endOfStream = function () {
  610. window.isComplete = 1;
  611. return _endOfStream.apply(this, arguments)
  612. }
  613. window.MediaSource.prototype.endOfStream.toString = function () {
  614. // console.log('endOfStream hook is detecting!');
  615. return _endOfStream.toString();
  616. }
  617.  
  618. const _addSourceBuffer = window.MediaSource.prototype.addSourceBuffer
  619. window.MediaSource.prototype.addSourceBuffer = function (mime) {
  620. // console.log("MediaSource.addSourceBuffer ", mime)
  621. if (mime.toString().indexOf('audio') !== -1) {
  622. window.audio = [];
  623. // console.log('audio array cleared.');
  624. } else if (mime.toString().indexOf('video') !== -1) {
  625. window.video = [];
  626. // console.log('video array cleared.');
  627. }
  628. let sourceBuffer = _addSourceBuffer.call(this, mime)
  629. const _append = sourceBuffer.appendBuffer
  630. sourceBuffer.appendBuffer = function (buffer) {
  631. // console.log(mime, buffer);
  632. if (mime.toString().indexOf('audio') !== -1) {
  633. window.audio.push(buffer);
  634. } else if (mime.toString().indexOf('video') !== -1) {
  635. window.video.push(buffer)
  636. }
  637. _append.call(this, buffer)
  638. }
  639.  
  640. sourceBuffer.appendBuffer.toString = function () {
  641. // console.log('appendSourceBuffer hook is detecting!');
  642. return _append.toString();
  643. }
  644. isVideo = 1;
  645. downloadName = document.title;
  646. XFrun();
  647. loadTrue = true;
  648. return sourceBuffer
  649. }
  650.  
  651. window.MediaSource.prototype.addSourceBuffer.toString = function () {
  652. // console.log('addSourceBuffer hook is detecting!');
  653. return _addSourceBuffer.toString();
  654. }
  655.  
  656. function download() {
  657. if (location.href.indexOf('51moot') > 0) {
  658. downloadName = $('.vedio-play-nav ul li').last().get(0).innerText
  659. }
  660. let a = document.createElement('a');
  661. a.href = window.URL.createObjectURL(new Blob(window.audio));
  662. a.download = 'audio_' + downloadName + '.mp4';
  663. a.click();
  664. a.href = window.URL.createObjectURL(new Blob(window.video));
  665. a.download = 'video_' + downloadName + '.mp4';
  666. a.click();
  667. Msg(downloadName+' ,下载成功啦');
  668. setTimeout(()=>{Msg(downloadName+' ,下载成功啦')},1000)
  669. window.downloadAll = 0;
  670. window.isComplete = 0;
  671. window.autoDownload = 0;
  672. if (isDelTabPage === 1) {
  673. closePage();
  674. }
  675. }
  676. function closePage() {
  677. if (navigator.userAgent.indexOf("Firefox") != -1 || navigator.userAgent.indexOf("Chrome") != -1) {
  678. window.location.href = "about:blank";
  679. window.close();
  680. } else {
  681. window.opener = null;
  682. window.open("", "_self");
  683. window.close();
  684. }
  685. }
  686. // setInterval(() => {
  687. // if (window.downloadAll === 1) {
  688. // download();
  689. // }
  690. // }, 2000);
  691.  
  692. let autoDownInterval = setInterval(() => {
  693. if (window.isComplete === 1 && window.autoDownload === 1) {
  694. download();
  695. }
  696. }, 2000);
  697.  
  698. (function (that) {
  699. let removeSandboxInterval = setInterval(() => {
  700. if (that.document.querySelectorAll('iframe')[0] !== undefined) {
  701. that.document.querySelectorAll('iframe').forEach((v, i, a) => {
  702. let ifr = v;
  703. ifr.removeAttribute('sandbox');
  704. const parentElem = that.document.querySelectorAll('iframe')[i].parentElement;
  705. a[i].remove();
  706. parentElem.appendChild(ifr);
  707. });
  708. clearInterval(removeSandboxInterval);
  709. }
  710. }, 1000);
  711. })(window);
  712. })();
  713.  
  714. const ColorReverse = (OldColorValue) => {
  715. OldColorValue = "0x" + OldColorValue.replace(/#/g, "");
  716. var str = "000000" + (0xFFFFFF - OldColorValue).toString(16);
  717. return '#' + str.substring(str.length - 6, str.length);
  718. }
  719. const guid = () => {
  720. return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
  721. var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
  722. return v.toString(16);
  723. });
  724. }
  725. const Msg = (msgtxt) => {
  726. let id = guid();
  727. var vbo = "80%";
  728. $('.MsgQB').each((i, e) => {
  729. let bo = $(e).css("bottom").replace('px', '');
  730. bo = parseInt(bo) - 50;
  731. vbo = bo.toString() + 'px';
  732. })
  733. $('body').append('<div id="' + id + '" class="MsgQB" style="display:none;bottom:' + vbo + '">' + msgtxt + ' ヾ(•ω•`)o</div>');
  734. let randomColor = Math.floor(Math.random() * 16777215).toString(16);
  735. let $el = $('#'+id);
  736. $el.fadeIn().animate({"left":"10px"});
  737. $el.css('background', ColorReverse(randomColor)).css('color', ColorReverse(ColorReverse(randomColor))).css('box-shadow',' 0 0 5px 2px '+ColorReverse(ColorReverse(randomColor)));
  738. $el.get(0).addEventListener('animationend', () => {
  739. $el.remove();
  740. })
  741. setTimeout(() => { $el.css('animation', 'pfhide 1s') }, 4.5 * 1000)
  742. $el.get(0).addEventListener('animationstart', () => {
  743. $('.MsgQB').each((i, e) => {
  744. let bo = $(e).css("bottom").replace('px', '');
  745. bo = parseInt(bo) + 50;
  746. $(e).animate({ "bottom": bo.toString() + 'px' })
  747. })
  748. })
  749. }