您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Remove any tracking parameters from the YouTube share feature
// ==UserScript== // @name YTShareAntiTrack // @namespace https://github.com/Xenorio/YTShareAntiTrack // @version 1.2.1 // @license AGPL-3.0-or-later // @description Remove any tracking parameters from the YouTube share feature // @author xenorio // @match https://www.youtube.com/* // @match https://m.youtube.com/* // @match https://music.youtube.com/* // @grant GM.getValue // @grant GM.setValue // @grant GM.openInTab // ==/UserScript== // Copyright (C) 2023 Marcus Huber (xenorio) <[email protected]> // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as // published by the Free Software Foundation, either version 3 of the // License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. (function () { // How fast we should check for element changes (ms) const updateInterval = 50 // Parameters which are allowed to stay in the URL const allowedParams = [ "t", // start time "list", // playlist ID "v" // video ID ] // Identifiers for all elements to target const elementIdentifiers = { id: [ 'share-url' // Input field on desktop ], class: [ 'unified-share-url-input' // Input field on mobile ] } // Element has been found, update URL function handleTargetElement(targetElement) { // Set up a copy of the current URL to work on let url = new URL(targetElement.value) let params = url.searchParams // Remove all parameters that are not allowed for (let param of params.keys()) { if (!allowedParams.includes(param)) { params.delete(param) } } url.search = params let newValue = url.toString() // Abort if everything is already correct if (targetElement.value == newValue) return; console.log('[YTShareAntiTrack] Changing share url from ' + targetElement.value + ' to ' + newValue) // Update element targetElement.value = newValue } // Repeatedly look for the element, and if it's there, change it setInterval(() => { // Gather all elements which should be modified based on their ID for (let identifier of elementIdentifiers.id) { const element = document.getElementById(identifier) if (element) { handleTargetElement(element) } } // Gather all elements which should be modified based on their class for (let identifier of elementIdentifiers.class) { const elements = document.getElementsByClassName(identifier) if (elements) { for (let element of elements) { handleTargetElement(element) } } } }, updateInterval) // Handle opening the notice page for transitioning to the TubeTweaks extension try { // Check if the notice has been opened already GM.getValue("transitionPageVisited") .then(hasVisited => { if (hasVisited) return; // Remember that the notice has already been opened // We do this first to prevent race conditions which would open tons of tabs GM.setValue("transitionPageVisited", true) .then(() => { // Open the notice page, and focus it GM.openInTab("https://extensions.xenorio.xyz/tubetweaks-migration", { active: true }) }) }) } catch (error) { // GreaseMonkey API not supported console.log('Goshdarn get a better userscript manager') } })();