Initial commit
This commit is contained in:
91
抖音/抖音直播自动下翻.js
Normal file
91
抖音/抖音直播自动下翻.js
Normal file
@@ -0,0 +1,91 @@
|
||||
// ==UserScript==
|
||||
// @name 抖音直播自动下翻 (可见性检测版)
|
||||
// @namespace http://tampermonkey.net/
|
||||
// @version 1.4
|
||||
// @description 只有当“直播中”标签在屏幕上可见时,才触发自动翻页
|
||||
// @author Gemini
|
||||
// @match *://*.douyin.com/*
|
||||
// @grant none
|
||||
// ==/UserScript==
|
||||
|
||||
(function() {
|
||||
'use strict';
|
||||
|
||||
// --- 1. 创建 UI 指示器 ---
|
||||
const container = document.createElement('div');
|
||||
container.style.cssText = 'position:fixed; bottom:60px; left:30px; display:flex; align-items:center; z-index:10001; pointer-events:none; font-family:sans-serif;';
|
||||
|
||||
const dot = document.createElement('div');
|
||||
dot.style.cssText = 'width:12px; height:12px; background-color:#00ff00; border-radius:50%; box-shadow:0 0 10px #00ff00; transition:all 0.3s;';
|
||||
|
||||
const label = document.createElement('div');
|
||||
label.innerText = '当前是直播间';
|
||||
label.style.cssText = 'margin-left:10px; background:rgba(0,0,0,0.7); color:#00ff00; padding:4px 12px; border-radius:4px; font-size:12px; opacity:0; transition:0.3s; border:1px solid #00ff00;';
|
||||
|
||||
container.appendChild(dot);
|
||||
container.appendChild(label);
|
||||
document.body.appendChild(container);
|
||||
|
||||
let hasTriggeredForThisVideo = false;
|
||||
|
||||
// --- 2. 核心逻辑:判断元素是否真正可见 ---
|
||||
const isElementVisible = (el) => {
|
||||
if (!el) return false;
|
||||
const rect = el.getBoundingClientRect();
|
||||
// 1. 检查是否在视口范围内
|
||||
// 2. 检查元素大小是否大于0(排除 display:none)
|
||||
return (
|
||||
rect.top >= 0 &&
|
||||
rect.left >= 0 &&
|
||||
rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&
|
||||
rect.right <= (window.innerWidth || document.documentElement.clientWidth) &&
|
||||
rect.width > 0 &&
|
||||
rect.height > 0
|
||||
);
|
||||
};
|
||||
|
||||
const pressArrowDown = () => {
|
||||
hasTriggeredForThisVideo = false;
|
||||
const options = { key: 'ArrowDown', keyCode: 40, code: 'ArrowDown', which: 40, bubbles: true };
|
||||
window.dispatchEvent(new KeyboardEvent('keydown', options));
|
||||
document.dispatchEvent(new KeyboardEvent('keydown', options));
|
||||
console.log('🚀 元素已可见,执行翻页');
|
||||
};
|
||||
|
||||
const runDetection = () => {
|
||||
// 使用 XPath 寻找目标元素
|
||||
const xpath = "//div[contains(@class, 'semi-tag-content') and text()='直播中']";
|
||||
const element = document.evaluate(xpath, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
|
||||
|
||||
// 如果元素存在 且 真正出现在屏幕上
|
||||
if (element && isElementVisible(element)) {
|
||||
// UI 变色并显示文字
|
||||
label.style.opacity = '1';
|
||||
dot.style.backgroundColor = '#ff4d4f';
|
||||
dot.style.boxShadow = '0 0 15px #ff4d4f';
|
||||
|
||||
if (!hasTriggeredForThisVideo) {
|
||||
hasTriggeredForThisVideo = true;
|
||||
console.log( "检测到直播,执行按键翻页" );
|
||||
// 发现可见直播,延迟 800ms 翻页,给人一点反应时间
|
||||
setTimeout(pressArrowDown, 100);
|
||||
}
|
||||
} else {
|
||||
// 恢复 UI 状态
|
||||
label.style.opacity = '0';
|
||||
dot.style.backgroundColor = '#00ff00';
|
||||
dot.style.boxShadow = '0 0 10px #00ff00';
|
||||
|
||||
// 如果连元素都没了,说明已经翻过去了,重置触发开关
|
||||
if (!element) {
|
||||
hasTriggeredForThisVideo = false;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// --- 3. 监听 ---
|
||||
// 抖音滑动比较快,我们结合 MutationObserver 和 高频轮询 确保不漏掉任何瞬间
|
||||
setInterval(runDetection, 300); // 每 300ms 检查一次可见性
|
||||
|
||||
console.log('抖音直播可见性检测脚本注入成功');
|
||||
})();
|
||||
Reference in New Issue
Block a user