dy

抖音网页视频链接下载!

  1. // ==UserScript==
  2. // @name dy
  3. // @namespace http://tampermonkey.net/
  4. // @version 0.2.8
  5. // @description 抖音网页视频链接下载!
  6. // @author jk小帅
  7. // @match https://www.douyin.com/*
  8. // @grant none
  9. // @license GPL
  10. // ==/UserScript==
  11.  
  12. // 如果失败可以先点赞在点赞页面下载
  13. /*
  14. 已测试支持的界面
  15. + 关注
  16. + 推荐
  17. + 搜索
  18. + 喜欢
  19. + 视频主个人主页
  20. */
  21.  
  22. // 抖音视频下载
  23. (function () {
  24. "use strict";
  25.  
  26. const button1 = document.createElement('button')
  27. button1.setAttribute('id', 'dy0')
  28. button1.setAttribute('style', 'cursor: pointer;padding:0.3rem 0.5rem;background-color:#161722;color:#ffff;outline:none;position: fixed;left:2rem;bottom:9.5rem;z-index:99999')
  29. button1.innerText = '视频下载'
  30.  
  31. const button2 = document.createElement('button')
  32. button2.setAttribute('id', 'dy1')
  33. button2.setAttribute('style', 'cursor: pointer;padding:0.3rem 0.5rem;background-color:#161722;color:#ffff;outline:none;position: fixed;left:2rem;bottom:6rem;z-index:99999')
  34. button2.innerText = '图片下载\n(需开启弹出式权限)'
  35.  
  36. window.onload = () => {
  37.  
  38. const body = document.querySelector('body')
  39. body.appendChild(button1)
  40. body.appendChild(button2)
  41.  
  42. const dy0 = document.querySelector("#dy0")
  43. const dy1 = document.querySelector('#dy1')
  44.  
  45. dy0.addEventListener('click', function () {
  46. const videos = document.querySelectorAll('video')
  47. const len = videos.length
  48. let video;
  49. switch (len) {
  50. case 1: {
  51. video = videos[0];
  52. break;
  53. }
  54. case 2: {
  55. video = videos[0];
  56. break;
  57. }
  58. case 3: {
  59. video = videos[1];
  60. break;
  61. }
  62. case 4: {
  63. video = videos[3]
  64. break;
  65. }
  66. }
  67. let src = video.firstChild.src;
  68. if (!src) {
  69. alert('获取url地址失败')
  70. } else {
  71. video.pause();
  72. const date = new Date()
  73. let filename = `${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()}_${date.getHours()}_${date.getMinutes()}_${date.getSeconds()}`
  74. fetch(src)
  75. .then(res => res.blob())
  76. .then(blob => {
  77. const a = document.createElement("a");
  78. const objectUrl = window.URL.createObjectURL(blob);
  79. a.download = filename;
  80. a.href = objectUrl;
  81. a.click();
  82. window.URL.revokeObjectURL(objectUrl);
  83. a.remove();
  84. })
  85. }
  86. })
  87.  
  88.  
  89. dy1.addEventListener('click', function () {
  90. const videos = document.querySelectorAll('video')
  91. const len = videos.length
  92. let video;
  93. let index = 1
  94. switch (len) {
  95. case 1: {
  96. video = videos[0];
  97. index = 0
  98. break;
  99. }
  100. case 2: {
  101. video = videos[0];
  102. index = 0
  103. break;
  104. }
  105. case 3: {
  106. video = videos[1];
  107. index = 1
  108. break;
  109. }
  110. case 4: {
  111. video = videos[3]
  112. index = 3
  113. break;
  114. }
  115. }
  116. video.pause()
  117. let imgs;
  118. if (location.href.indexOf("user") !== -1) {
  119. imgs = document.querySelectorAll('.dySwiperSlide img')
  120. } else {
  121. try {
  122. imgs = document.querySelectorAll(".playerContainer .focusPanel")
  123. switch (imgs.length) {
  124. case 1: {
  125. imgs = imgs[0].getElementsByTagName('img')
  126. break;
  127. }
  128. case 2: {
  129. imgs = imgs[1].getElementsByTagName('img')
  130. break;
  131. }
  132. default:
  133. imgs = imgs = video.parentElement.parentElement.getElementsByTagName('img')
  134. break;
  135. }
  136. } catch {
  137. alert('没有图片')
  138. return;
  139. }
  140. }
  141. let set = new Set()
  142. imgs = Array.from(imgs)
  143. imgs.forEach((item) => {
  144. set.add(item.src)
  145. })
  146. // console.log(set);
  147. if (set.size === 0) {
  148. alert("获取图片失败")
  149. return;
  150. } else {
  151. set.forEach((img) => {
  152. window.open(img)
  153. })
  154. }
  155. })
  156. }
  157. })()

QingJ © 2025

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