YouTube Auto-Liker

Automatically likes videos of channels you're subscribed to

目前为 2020-09-10 提交的版本。查看 最新版本

// ==UserScript==
// @name           YouTube Auto-Liker
// @name:zh        YouTube自動點讚
// @name:ja        YouTubeのような自動
// @namespace      https://github.com/HatScripts/youtube-auto-liker
// @version        1.2.6
// @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,
  }
  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 {
      let queryString = window.location.search
      return queryString.substr(queryString.indexOf('v=') + 2, 11)
    }
  }

  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')
    }
    return subscribeButton.hasAttribute('subscribed')
  }

  function wait () {
    if (watchThresholdReached()) {
      try {
        if (isSubscribed()) {
          DEBUG.info('We are subscribed')
          like()
        } else {
          DEBUG.info('We are not subscribed')
        }
      } catch (e) {
        DEBUG.info('Failed to like video: ' + e + '. Will try again in 5 seconds...')
      }
    }
    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或关注我们的公众号极客氢云获取最新地址