// ==UserScript== // @name 抖音本地生活自动讲解脚本 // @namespace http://tampermonkey.net/ // @version 1.2 // @description 抖音本地生活自动讲解脚本 // @author XiaoWu // @match https://eos.douyin.com/livesite/live/current // @grant none // ==/UserScript== (function () { 'use strict'; // 全局对象用于封装模块,避免变量污染和方便管理 const DouyinScript = {}; // 定时点击功能模块 DouyinScript.clickModule = (function () { // 用于标记定时点击功能是否开启 let isRunning = false; // 定时器ID,用于后续清除定时器 let intervalId; // 当前要点击的按钮序号,初始化为1(默认对应第一个按钮,即一号链接相关按钮) let buttonIndexToClick = 1; // 查找并点击抖音直播页面指定按钮的函数,根据设定的序号点击按钮,始终点击固定序号的按钮 function clickButton() { var buttonDivs = document.querySelectorAll('.talking-btn-TFHJJi'); const indexToUse = buttonIndexToClick - 1; if (buttonDivs.length > indexToUse) { buttonDivs[indexToUse].click(); console.log("已点击对应按钮"); }}// 设置要点击的按钮序号的函数,处理输入序号相关逻辑,设置后固定点击对应序号按钮 function setButtonIndex(index) { const parsedIndex = parseInt(index, 10); buttonIndexToClick = isNaN(parsedIndex) || parsedIndex === 0? 1 : parsedIndex; DouyinScript.statusModule.updateStatus(`已设置点击按钮序号为: ${buttonIndexToClick}`); }// 启动定时点击功能的函数 function startClicking() { if (!isRunning) { isRunning = true; const interval = 3.8 * 1000; // 固定间隔时间,可根据需求调整 intervalId = setInterval(() => { clickButton(); }, interval); DouyinScript.statusModule.updateStatus('已开启'); }}// 关闭定时点击功能的函数 function stopClicking() { if (isRunning) { isRunning = false; clearInterval(intervalId); DouyinScript.statusModule.updateStatus('已关闭'); }}return { startClicking: startClicking, stopClicking: stopClicking, clickButton: clickButton, setButtonIndex: setButtonIndex }; })(); // 悬浮窗及状态显示模块 DouyinScript.statusModule = (function () { // 创建带样式和点击事件的按钮的函数,提取公共逻辑以提高可维护性 function createStyledButton(text, clickHandler) { const button = document.createElement('button'); button.textContent = text; button.style.marginBottom = '5px'; button.style.padding = '5px 10px'; button.style.border = 'none'; button.style.borderRadius = '5px'; button.style.cursor = 'pointer'; button.style.backgroundColor = text === '开启定时点击'? 'green' :'red'; button.style.color = 'white'; button.addEventListener('click', clickHandler); // 添加鼠标悬停效果 button.addEventListener('mouseenter', function () { button.style.backgroundColor = text === '开启'? 'darkgreen' : 'darkred'; button.style.boxShadow = '0 0 5px rgba(0, 0, 0, 0.3)'; }); button.addEventListener('mouseleave', function () { button.style.backgroundColor = text === '开启'? 'green' :'red'; button.style.boxShadow = 'none'; }); return button; }// 更新状态显示文本的函数 function updateStatus(statusText) { const statusDiv = document.getElementById('status'); if (statusDiv) { // 如果状态显示元素已存在,直接更新其文本内容 statusDiv.textContent = `当前功能状态:${statusText}`; }else { // 创建新的状态显示元素 const statusDiv = document.createElement('div'); statusDiv.id ='status'; // 设置状态显示元素的样式,使其悬浮在页面右上角,增加z-index提升层级,并添加一些样式优化 statusDiv.style.position = 'absolute'; statusDiv.style.top = '10px'; statusDiv.style.right = '10px'; statusDiv.style.backgroundColor = 'rgba(0, 0, 0, 0.7)'; statusDiv.style.color = 'white'; statusDiv.style.padding = '5px 10px'; statusDiv.style.borderRadius = '5px'; statusDiv.style.zIndex = '9999'; statusDiv.style.fontSize = '14px'; statusDiv.textContent = `当前功能状态:${statusText}`; document.body.appendChild(statusDiv); }}// 创建悬浮窗容器元素并添加按钮、状态显示元素等的函数 function createControlDiv() { // 创建悬浮窗的容器元素,增加z-index提升层级,并添加一些样式优化 const controlDiv = document.createElement('div'); controlDiv.style.position = 'absolute'; controlDiv.style.top = '10px'; controlDiv.style.right = '10px'; controlDiv.style.backgroundColor = 'rgba(0, 0, 0, 0.7)'; controlDiv.style.padding = '10px'; controlDiv.style.borderRadius = '5px'; controlDiv.style.display = 'flex'; controlDiv.style.flexDirection = 'column'; controlDiv.style.alignItems = 'center'; controlDiv.style.zIndex = '9999'; // 创建"开启定时点击"按钮并添加到悬浮窗容器 const startButton = createStyledButton('开启', DouyinScript.clickModule.startClicking); controlDiv.appendChild(startButton); // 创建"关闭定时点击"按钮并添加到悬浮窗容器 const stopButton = createStyledButton('关闭', DouyinScript.clickModule.stopClicking); controlDiv.appendChild(stopButton); // 创建输入框用于设置按钮序号,选择后固定点击对应序号按钮 const indexInput = document.createElement('input'); indexInput.type = 'number'; indexInput.placeholder = '输入按钮序号(从1开始,不输入或输入0等则默认点击一号链接按钮)'; indexInput.style.marginBottom = '5px'; indexInput.addEventListener('change', function () { DouyinScript.clickModule.setButtonIndex(indexInput.value); }); controlDiv.appendChild(indexInput); // 初始化状态显示元素并添加到悬浮窗容器 updateStatus(DouyinScript.clickModule.isRunning? '已开启' : '已关闭'); const statusDiv = document.getElementById('status'); controlDiv.appendChild(statusDiv); // 添加悬浮窗可拖动功能 makeDraggable(controlDiv); // 监听页面大小变化事件,简单适配不同页面宽度下悬浮窗位置 window.addEventListener('resize', function () { const windowWidth = window.innerWidth; if (windowWidth < 768) { controlDiv.style.right = '5px'; controlDiv.style.top = '5px'; }else { controlDiv.style.right = '10px'; controlDiv.style.top = '10px'; }}); return controlDiv; }return { updateStatus: updateStatus, createControlDiv: createControlDiv }; })(); // 使元素可拖动的函数 function makeDraggable(element) { let isDragging = false; let startX, startY, offsetX, offsetY; element.addEventListener('mousedown', function (e) { isDragging = true; startX = e.pageX; startY = e.pageY; offsetX = element.offsetLeft; offsetY = element.offsetTop; }); document.addEventListener('mousemove', function (e) { if (isDragging) { const x = e.pageX - startX + offsetX; const y = e.pageY - startY + offsetY; element.style.left = x + 'px'; element.style.top = y + 'px'; }}); document.addEventListener('mouseup', function () { isDragging = false; }); }window.addEventListener('load', function () { const controlDiv = DouyinScript.statusModule.createControlDiv(); document.body.appendChild(controlDiv); }); })();