您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Automatically likes videos of channels you're subscribed to
当前为
// ==UserScript== // @name YouTube Auto-Liker // @name:zh YouTube自動點讚 // @name:ja YouTubeのような自動 // @namespace https://github.com/HatScripts/youtube-auto-liker // @version 1.3.0 // @description Automatically likes videos of channels you're subscribed to // @description:zh 對您訂閲的頻道視頻自動點讚 // @description:ja 購読しているチャンネルの動画が自動的に好きです // @description:ru Автоматически нравится видео каналов, на которые вы подписаны // @description:es Le gustan automáticamente los videos de los canales a los que está suscrito // @description:pt Gosta automaticamente de vídeos de canais nos quais você está inscrito // @author HatScripts // @license MIT // @icon https://raw.githubusercontent.com/HatScripts/youtube-auto-liker/master/logo.svg // @match http://*.youtube.com/* // @match https://*.youtube.com/* // @run-at document-idle // @noframes // ==/UserScript== /* global GM_info */ (() => { 'use strict' function Debugger (name, enabled) { this.debug = {} if (!window.console) { return () => {} } for (let m in console) { if (typeof console[m] === 'function') { if (enabled) { this.debug[m] = console[m].bind(window.console + ': ' + name + ': ') } else { this.debug[m] = () => {} } } } return this.debug } const DEBUG_ENABLED = GM_info.script.version === 'DEV_VERSION' const DEBUG = new Debugger(GM_info.script.name, DEBUG_ENABLED) const OPTIONS = { CHECK_FREQUENCY: 5000, WATCH_THRESHOLD: 0.5, HIDE_LIKE_NOTIFICATION: false, LIKE_IF_NOT_SUBSCRIBED: false, } const SELECTORS = { PLAYER: '#movie_player', SUBSCRIBE_BUTTON: '#subscribe-button > ytd-subscribe-button-renderer > paper-button', LIKE_BUTTON: 'ytd-video-primary-info-renderer #top-level-buttons > ytd-toggle-button-renderer:nth-child(1)', NOTIFICATION: 'ytd-popup-container', } const LIKE_BUTTON_CLICKED_CLASS = 'style-default-active' let autoLikedVideoIds = [] setTimeout(wait, OPTIONS.CHECK_FREQUENCY) function getVideoId () { let elem = document.querySelector('#page-manager > ytd-watch-flexy') if (elem && elem.hasAttribute('video-id')) { return elem.getAttribute('video-id') } else { return new URLSearchParams(window.location.search).get('v') } } function watchThresholdReached () { let player = document.querySelector(SELECTORS.PLAYER) if (player) { return player.getCurrentTime() / player.getDuration() >= OPTIONS.WATCH_THRESHOLD } return true } function isSubscribed () { DEBUG.info('Checking whether subscribed...') let subscribeButton = document.querySelector(SELECTORS.SUBSCRIBE_BUTTON) if (!subscribeButton) { throw Error('Couldn\'t find sub button') } let subscribed = subscribeButton.hasAttribute('subscribed') DEBUG.info(subscribed ? 'We are subscribed' : 'We are not subscribed') return subscribed } function wait () { if (watchThresholdReached()) { try { if (OPTIONS.LIKE_IF_NOT_SUBSCRIBED || isSubscribed()) { like() } } catch (e) { DEBUG.info(`Failed to like video: ${e}. Will try again in ${OPTIONS.CHECK_FREQUENCY} ms...`) } } setTimeout(wait, OPTIONS.CHECK_FREQUENCY) } function hideLikeNotification () { DEBUG.info('Trying to hide notification...') let notification = document.querySelector(SELECTORS.NOTIFICATION) if (notification) { DEBUG.info('Found notification. Hiding it...') notification.style.display = 'none' setTimeout(() => { DEBUG.info('Un-hiding notification') notification.style.removeProperty('display') }, 5000) } else { DEBUG.info('Couldn\'t find notification') } } function like () { DEBUG.info('Trying to like video...') let likeButton = document.querySelector(SELECTORS.LIKE_BUTTON) if (!likeButton) { throw Error('Couldn\'t find like button') } let videoId = getVideoId() if (likeButton.classList.contains(LIKE_BUTTON_CLICKED_CLASS)) { DEBUG.info('Like button has already been clicked') autoLikedVideoIds.push(videoId) } else if (autoLikedVideoIds.includes(videoId)) { DEBUG.info('Video has already been auto-liked. User must ' + 'have un-liked it, so we won\'t like it again') } else { DEBUG.info('Found like button') if (OPTIONS.HIDE_LIKE_NOTIFICATION) { hideLikeNotification() } DEBUG.info('It\'s unclicked. Clicking it...') likeButton.click() autoLikedVideoIds.push(videoId) DEBUG.info('Successfully liked video') } } })()
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址