Vdownload

音视频下载器

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