抖音本地生活自动讲解脚本
// ==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);
});
})();