您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Adds stylish control buttons for fullscreen and copy link functionality, persisting across navigation
// ==UserScript== // @name 9wkts_velki_full_screen // @namespace http://tampermonkey.net/ // @version 2.2 // @description Adds stylish control buttons for fullscreen and copy link functionality, persisting across navigation // @match https://*.9wkts.live/* // @match https://*.velkiex123.live/* // @match https://*.wickspin24.live/* // @match https://*.heppni247.live/* // @grant none // ==/UserScript== (function() { 'use strict'; // Configuration object for different sites const siteConfigs = { '9wkts.live': { iframeSelector: "#s-main-container > main > div > div > div:nth-child(1) > div.s-bg-secondary > div > div.s-video-wrapper.s-relative.s-z-0 > iframe", parentSelector: "#s-fullmarket-content > div:nth-child(1) > div.s--mx-2.s-px-2.s-flex.s-justify-between.s-items-center.s-bg-secondary.s-h-34px" }, 'velkiex123.live': { iframeSelector: '#main-container > main > div > div > div:nth-child(1) > div.bg-secondary > div > div.video-wrapper.relative.z-0 > iframe', parentSelector: '#main-container > main > div > div > div.px-2.mb-12 > div:nth-child(1) > div.-mx-2.px-2.h-34px.flex.justify-between.items-center.bg-black' }, 'wickspin24.live': { iframeSelector: '#main-container > main > div > div > div:nth-child(1) > div.bg-secondary > div > div.video-wrapper.relative.z-0 > iframe', parentSelector: '#main-container > main > div > div > div.px-2.mb-12 > div:nth-child(1) > div.-mx-2.px-2.h-34px.flex.justify-between.items-center.bg-black' }, 'heppni247.live': { iframeSelector: '#main-container > main > div > div > div:nth-child(1) > div.bg-secondary > div > div.video-wrapper.relative.z-0 > iframe', parentSelector: '#main-container > main > div > div > div.px-2.mb-12 > div:nth-child(1) > div.-mx-2.px-2.h-34px.flex.justify-between.items-center.bg-black' } }; // Get the current domain const currentDomain = window.location.hostname.replace('www.', ''); // Get the configuration for the current domain const currentConfig = siteConfigs[currentDomain]; // If no configuration is found for the current domain, exit the script if (!currentConfig) { console.log('No configuration found for this domain'); return; } // Dynamically load Font Awesome stylesheet const fontAwesomeLink = document.createElement("link"); fontAwesomeLink.rel = "stylesheet"; fontAwesomeLink.href = "https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css"; document.head.appendChild(fontAwesomeLink); // Function to create a button function createButton(iconClass, tooltip) { const button = document.createElement("button"); button.innerHTML = `<i class="${iconClass}"></i>`; button.title = tooltip; Object.assign(button.style, { backgroundColor: "rgba(28, 28, 28, 0.7)", color: "#ffffff", border: "none", borderRadius: "6px", cursor: "pointer", margin: "0 4px", padding: "6px", fontSize: "14px", transition: "all 0.3s ease", display: "flex", alignItems: "center", justifyContent: "center", width: "30px", height: "30px", boxShadow: "0 2px 5px rgba(0, 0, 0, 0.2)", }); button.addEventListener("mouseenter", () => { button.style.backgroundColor = "rgba(44, 44, 44, 0.9)"; button.style.transform = "translateY(-2px)"; button.style.boxShadow = "0 4px 8px rgba(0, 0, 0, 0.3)"; }); button.addEventListener("mouseleave", () => { button.style.backgroundColor = "rgba(28, 28, 28, 0.7)"; button.style.transform = "translateY(0)"; button.style.boxShadow = "0 2px 5px rgba(0, 0, 0, 0.2)"; }); return button; } // Function to show toast message function showToast(message) { const toast = document.createElement("div"); toast.innerText = message; Object.assign(toast.style, { position: "fixed", top: "20px", left: "50%", transform: "translateX(-50%) translateY(-100%)", backgroundColor: "rgba(0, 0, 0, 0.8)", color: "white", padding: "12px 24px", borderRadius: "8px", zIndex: "10000", transition: "transform 0.3s ease-out", fontFamily: "Arial, sans-serif", fontSize: "14px", boxShadow: "0 4px 6px rgba(0, 0, 0, 0.1)", }); document.body.appendChild(toast); setTimeout(() => { toast.style.transform = "translateX(-50%) translateY(0)"; }, 100); setTimeout(() => { toast.style.transform = "translateX(-50%) translateY(-100%)"; setTimeout(() => document.body.removeChild(toast), 300); }, 3000); } // Fullscreen button handler function fullscreenButtonHandler() { const iframeEl = document.querySelector(currentConfig.iframeSelector); if (iframeEl) { const requestFullScreen = iframeEl.requestFullscreen || iframeEl.webkitRequestFullscreen || iframeEl.msRequestFullscreen; if (requestFullScreen) { requestFullScreen.call(iframeEl).catch(err => { showToast("Failed to enter fullscreen mode"); }); } else { showToast("Fullscreen not supported"); } } else { showToast("Video element not found"); } } // Copy button handler function copyButtonHandler() { const iframeEl = document.querySelector(currentConfig.iframeSelector); if (iframeEl) { const src = iframeEl.src; navigator.clipboard.writeText(src).then(() => { showToast("Streaming link copied to clipboard"); }).catch(err => { showToast("Failed to copy to clipboard"); }); } else { showToast("Video element not found"); } } // Create the copy button const copyButton = createButton("fas fa-copy", "Copy stream link"); copyButton.addEventListener("click", copyButtonHandler); // Create the fullscreen button const fullscreenButton = createButton("fas fa-expand", "Fullscreen"); fullscreenButton.addEventListener("click", fullscreenButtonHandler); // Container for buttons const buttonContainer = document.createElement("div"); buttonContainer.id = "customButtonContainer"; Object.assign(buttonContainer.style, { display: "flex", alignItems: "center", justifyContent: "center", backgroundColor: "rgba(18, 18, 18, 0.6)", borderRadius: "8px", padding: "4px 8px", }); // Append buttons to the container buttonContainer.appendChild(copyButton); buttonContainer.appendChild(fullscreenButton); // Function to append the button container to the target element function appendButtonContainer() { const targetElement = document.querySelector(currentConfig.parentSelector); if (targetElement && !targetElement.querySelector("#customButtonContainer")) { // Create a wrapper div to center the buttons const centerWrapper = document.createElement("div"); Object.assign(centerWrapper.style, { display: "flex", alignItems: "center", justifyContent: "center", height: "100%", }); centerWrapper.appendChild(buttonContainer); // Ensure the target element uses flexbox for proper centering targetElement.style.display = "flex"; targetElement.style.justifyContent = "space-between"; targetElement.style.alignItems = "center"; // Insert the centerWrapper as the second child (in the middle) if (targetElement.childNodes.length >= 2) { targetElement.insertBefore(centerWrapper, targetElement.childNodes[1]); } else { targetElement.appendChild(centerWrapper); } } } // Function to continuously check for the target element and append buttons function checkAndAppendButtons() { appendButtonContainer(); requestAnimationFrame(checkAndAppendButtons); } // Start the continuous checking checkAndAppendButtons(); // Listen for page changes (for single-page applications) const observer = new MutationObserver((mutations) => { for (const mutation of mutations) { if (mutation.type === 'childList') { appendButtonContainer(); } } }); observer.observe(document.body, { childList: true, subtree: true }); })();
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址