您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
自动展开 YouTube 视频页面的所有评论和回复
当前为
- // ==UserScript==
- // @name YouTube Auto Expand Comments and Replies
- // @name:zh-CN YouTube 自动展开评论和回复
- // @name:zh-TW YouTube 自動展開評論和回覆
- // @name:ja YouTube コメントと返信を自動展開
- // @name:ko YouTube 댓글 및 답글 자동 확장
- // @name:es Expansión automática de comentarios y respuestas de YouTube
- // @name:fr Expansion automatique des commentaires et réponses YouTube
- // @name:de Automatische Erweiterung von YouTube-Kommentaren und Antworten
- // @namespace https://github.com/SuperNG6/YouTube-Comment-Script
- // @author SuperNG6
- // @version 1.3
- // @description Automatically expand all comments and replies on YouTube video pages
- // @license MIT
- // @description:zh-CN 自动展开 YouTube 视频页面的所有评论和回复
- // @description:zh-TW 自動展開 YouTube 視頻頁面的所有評論和回覆
- // @description:ja YouTube動画ページのすべてのコメントと返信を自動的に展開します
- // @description:ko YouTube 동영상 페이지의 모든 댓글과 답글을 자동으로 확장합니다
- // @description:es Expande automáticamente todos los comentarios y respuestas en las páginas de videos de YouTube
- // @description:fr Développe automatiquement tous les commentaires et réponses sur les pages vidéo YouTube
- // @description:de Erweitert automatisch alle Kommentare und Antworten auf YouTube-Videoseiten
- // @match https://www.youtube.com/watch?v=*
- // @grant none
- // ==/UserScript==
- (function() {
- 'use strict';
- // 配置参数
- const config = {
- checkInterval: 500, // 常规检查间隔
- observerTimeout: 3000, // 观察器超时时间
- maxRetries: 10, // 最大重试次数
- debug: false // 调试模式
- };
- let retryCount = 0;
- let observer = null;
- function log(...args) {
- if (config.debug) console.log('[YouTube Auto Expand]', ...args);
- }
- // 更可靠的选择器
- const selectors = {
- commentsContainer: 'ytd-comments#comments',
- commentReplies: 'ytd-comment-replies-renderer',
- viewMoreComments: 'ytd-continuation-item-renderer #button', // 主评论的"查看更多"按钮
- showRepliesButton: '#more-replies > yt-button-shape > button', // 回复按钮
- showHiddenReplies: 'ytd-comment-replies-renderer yt-button-shape' // 隐藏的回复按钮
- };
- function clickVisibleElements(selector) {
- const elements = [...document.querySelectorAll(selector)];
- return elements.filter(el => {
- if (el.offsetParent !== null && !el.disabled) {
- try {
- el.scrollIntoView({behavior: "auto", block: "center"});
- el.click();
- log('Clicked:', selector);
- return true;
- } catch (error) {
- log('Click error:', error);
- }
- }
- return false;
- }).length > 0;
- }
- function expandElements() {
- let clickedSomething = false;
- // 处理主评论的"查看更多评论"按钮
- clickedSomething |= clickVisibleElements(selectors.viewMoreComments);
- // 处理回复按钮
- clickedSomething |= clickVisibleElements(selectors.showRepliesButton);
- // 处理可能存在的隐藏回复
- clickedSomething |= clickVisibleElements(selectors.showHiddenReplies);
- return clickedSomething;
- }
- function startObservation() {
- const commentsContainer = document.querySelector(selectors.commentsContainer);
- if (!commentsContainer) {
- if (retryCount++ < config.maxRetries) {
- setTimeout(startObservation, config.checkInterval);
- log(`Retrying to find comments container (${retryCount}/${config.maxRetries})`);
- }
- return;
- }
- observer = new MutationObserver((mutations) => {
- if (expandElements()) {
- // 如果检测到变化并执行了点击,稍后再检查
- setTimeout(() => expandElements(), config.checkInterval);
- }
- });
- observer.observe(commentsContainer, {
- childList: true,
- subtree: true,
- attributes: false,
- characterData: false
- });
- // 初始执行
- setTimeout(() => {
- expandElements();
- // 处理无限滚动加载
- window.addEventListener('scroll', () => expandElements());
- }, 500);
- log('Observation started');
- }
- function init() {
- if (!document.querySelector(selectors.commentsContainer)) {
- // 如果评论区还没加载,等待直到加载完成
- const waitForComments = setInterval(() => {
- if (document.querySelector(selectors.commentsContainer)) {
- clearInterval(waitForComments);
- startObservation();
- }
- }, config.checkInterval);
- // 设置超时停止检测
- setTimeout(() => {
- clearInterval(waitForComments);
- log('Comments container not found within timeout');
- }, config.observerTimeout);
- } else {
- startObservation();
- }
- }
- // 启动脚本
- if (document.readyState === 'loading') {
- window.addEventListener('DOMContentLoaded', init);
- } else {
- setTimeout(init, 500);
- }
- })();