您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Ajoute un bouton de téléchargement en haut à droite des images sur vos sites web favoris :p
// ==UserScript== // @name Img Downloader // @namespace https://gf.qytechs.cn/users/1429467 // @version 1.0 // @description Ajoute un bouton de téléchargement en haut à droite des images sur vos sites web favoris :p // @author Lakfu Sama // @match *://*.youtube.com/* // @match *://*.instagram.com/* // @match *://*.twitter.com/* // @match *://*.tiktok.com/* // @match *://*/* // @grant none // ==/UserScript== (function() { 'use strict'; let autoShowButtons = true; // Par défaut, les boutons DL sont visibles // Fonction pour créer un bouton de téléchargement function createDownloadButton(url) { let button = document.createElement("button"); button.innerText = "DL"; button.style.position = "absolute"; button.style.top = "5px"; button.style.right = "5px"; button.style.backgroundColor = "rgba(0, 0, 0, 0.7)"; button.style.color = "white"; button.style.border = "none"; button.style.padding = "5px 10px"; button.style.borderRadius = "5px"; button.style.cursor = "pointer"; button.style.fontSize = "12px"; button.style.zIndex = "1000"; button.style.opacity = "0.8"; button.style.transition = "opacity 0.2s"; button.style.display = autoShowButtons ? "block" : "none"; // Effet de survol pour rendre le bouton plus visible button.onmouseover = () => button.style.opacity = "1"; button.onmouseout = () => button.style.opacity = "0.8"; // Action du bouton pour télécharger la vidéo ou l'image button.onclick = () => { // Si l'URL est une ressource blob, cela peut être problématique (à contourner) if (url.startsWith("blob:")) { alert("Le téléchargement de vidéos blob n'est pas supporté directement. Utilisez un outil de téléchargement adapté."); } else { // Utilisation d'un proxy pour contourner le blocage direct des ressources let proxyUrl = "https://api.allorigins.win/raw?url="; // Utilisation d'un proxy CORS alternatif let finalUrl = proxyUrl + encodeURIComponent(url); // Encode l'URL pour éviter tout problème let a = document.createElement("a"); a.href = finalUrl; a.download = "file"; // Nom générique pour le fichier document.body.appendChild(a); a.click(); document.body.removeChild(a); } }; return button; } // Fonction pour ajouter le bouton de téléchargement uniquement pour les vidéos et images valides function addDownloadButtons() { console.log("Recherche de vidéos et images..."); // Vérification des vidéos dans les balises <video> document.querySelectorAll("video").forEach(video => { if (!video.dataset.hasDownloadButton && video.src) { console.log("Vidéo trouvée: ", video.src); let button = createDownloadButton(video.src); video.style.position = "relative"; video.parentNode.appendChild(button); video.dataset.hasDownloadButton = "true"; } }); // Vérification des vidéos dans les tweets Twitter (balises <div> avec des liens de vidéo) document.querySelectorAll("div[data-testid='tweet']").forEach(tweet => { const video = tweet.querySelector("video"); // Cherche la vidéo dans le tweet if (video && !video.dataset.hasDownloadButton && video.src) { console.log("Vidéo Twitter trouvée: ", video.src); let button = createDownloadButton(video.src); video.style.position = "relative"; video.parentNode.appendChild(button); video.dataset.hasDownloadButton = "true"; } }); // Vérification des vidéos intégrées dans les <iframe> (ex. YouTube) document.querySelectorAll("iframe").forEach(iframe => { if (!iframe.dataset.hasDownloadButton && iframe.src && iframe.src !== "about:blank") { console.log("Iframe trouvée: ", iframe.src); if (iframe.src.includes("youtube.com/embed/") || iframe.src.includes("vimeo.com")) { let videoUrl = iframe.src; let button = createDownloadButton(videoUrl); iframe.style.position = "relative"; iframe.parentNode.appendChild(button); iframe.dataset.hasDownloadButton = "true"; } } }); // Vérification des vidéos dans des <object> ou <embed> (cas plus anciens) document.querySelectorAll("object, embed").forEach(element => { if (!element.dataset.hasDownloadButton && element.data) { console.log("Vidéo object/embed trouvée: ", element.data); let button = createDownloadButton(element.data); element.style.position = "relative"; element.parentNode.appendChild(button); element.dataset.hasDownloadButton = "true"; } }); // Vérification des images (mais pas les petites) document.querySelectorAll("img").forEach(img => { if (!img.dataset.hasDownloadButton && img.src) { // Exclure les petites images (taille < 100x100) let imgWidth = img.naturalWidth; let imgHeight = img.naturalHeight; if (imgWidth > 100 && imgHeight > 100) { console.log("Image trouvée: ", img.src); let button = createDownloadButton(img.src); img.style.position = "relative"; img.parentNode.appendChild(button); img.dataset.hasDownloadButton = "true"; } } }); } // Observer pour les vidéos et images chargées dynamiquement (scroll infini) const observer = new MutationObserver(addDownloadButtons); observer.observe(document.body, { childList: true, subtree: true }); // Touche "D" pour afficher/cacher les boutons DL document.addEventListener('keydown', function(event) { if (event.key.toLowerCase() === 'd') { autoShowButtons = !autoShowButtons; document.querySelectorAll("button").forEach(button => { if (button.innerText === "DL") { button.style.display = autoShowButtons ? "block" : "none"; } }); } }); console.log("Script DL activé :\n[D] Afficher/Cacher les boutons de téléchargement"); // Appel immédiat pour initialiser le script addDownloadButtons(); })();
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址