// ==UserScript==
// @name 抖音网页直播点赞(可调节频率,可设置是否默认自动点赞)
// @namespace http://tampermonkey.net/
// @version 4.0
// @description 这是一个基于抖音直播的自动点赞脚本,支持调节点赞频率,修改自别人的脚本
// @author 余某人
// @match *://live.douyin.com/*
// @grant none
// @license MIT
// ==/UserScript==
(function() {
'use strict';
let page = document.getElementsByTagName('body')[0];
// 首先添加全局样式
function addGlobalStyle(css) {
var head, style;
head = document.getElementsByTagName('head')[0];
if (!head) { return; }
style = document.createElement('style');
style.type = 'text/css';
style.innerHTML = css;
head.appendChild(style);
}
// 添加所有需要的样式
addGlobalStyle(`
.kolento {
content: '';
font-size: 14px;
position: relative;
z-index: 500;
cursor: pointer;
background: linear-gradient(90deg,#f4c8c7 0,#0c61bb 45%,#0c61bb 55%,#fcc6c6)!important;
border-radius: 50%;
color: #fff;
display: block;
width: 46px;height: 46px;
line-height: 16px;
text-align: center;
display: flex;
align-items: center;
justify-content: center;
transition: all ease 0.3s;
}
.kolento:hover {
background-color: #4abf8a;
transform: rotate(360deg);
opacity:1;
}
.total {
font-size: 14px;
position: relative;
z-index: 500;
background: linear-gradient(90deg,#f4c8c7 0,#0c61bb 45%,#0c61bb 55%,#fcc6c6)!important;
color: #fff;
text-align: center;
display: flex;
align-items: center;
justify-content: center;
transition: all ease 0.3s;
padding: 5px 8px;
border-radius: 20px;
margin-left: 10px;
}
.total p {
color:#fff;
}
.freq-adjuster {
position: absolute;
top: 50px;
right: 0;
z-index: 500;
background: linear-gradient(90deg,#f4c8c7 0,#0c61bb 45%,#0c61bb 55%,#fcc6c6)!important;
color: #fff;
padding: 8px;
border-radius: 20px;
display: none;
flex-direction: column;
gap: 8px;
opacity:0.8;
width: 180px;
}
.freq-adjuster > div {
display: flex;
align-items: center;
gap: 5px;
}
.freq-input {
width: 100px;
border: none;
border-radius: 10px;
padding: 2px 5px;
text-align: center;
font-size: 14px;
}
.freq-label {
font-size: 12px;
white-space: nowrap;
}
.auto-like-option {
display: flex;
align-items: center;
gap: 5px;
font-size: 12px;
cursor: pointer;
}
.auto-like-checkbox {
cursor: pointer;
}
/* 新增样式 */
.like-container {
position: fixed;
top: 70px;
right: 30px;
z-index: 500;
display: flex;
flex-direction: column;
align-items: flex-end;
cursor: move;
transition: opacity 0.3s ease;
}
.toggle-button {
font-size: 14px;
background: linear-gradient(90deg,#f4c8c7 0,#0c61bb 45%,#0c61bb 55%,#fcc6c6)!important;
border-radius: 50%;
color: #fff;
width: 30px;
height: 30px;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
transition: all ease 0.3s;
}
.toggle-button:hover {
opacity: 1;
}
.like-content {
margin-top: 10px;
display: flex;
flex-direction: column;
gap: 10px;
position: relative;
}
.hidden {
display: none !important;
}
.controls-row {
display: flex;
align-items: center;
justify-content: flex-end;
}
.opacity-slider-container {
position: absolute;
top: -40px;
right: 0;
background: linear-gradient(90deg,#f4c8c7 0,#0c61bb 45%,#0c61bb 55%,#fcc6c6)!important;
padding: 5px 10px;
border-radius: 20px;
display: none;
align-items: center;
gap: 5px;
z-index: 501;
}
.opacity-slider {
width: 100px;
cursor: pointer;
}
.opacity-label {
color: white;
font-size: 12px;
white-space: nowrap;
}
`);
// 创建容器元素
let likeContainer = document.createElement("div");
likeContainer.className = "like-container";
page.append(likeContainer);
// 创建切换按钮
let toggleButton = document.createElement("div");
toggleButton.className = "toggle-button";
toggleButton.innerHTML = "▼";
likeContainer.append(toggleButton);
// 创建内容容器
let likeContent = document.createElement("div");
likeContent.className = "like-content";
likeContainer.append(likeContent);
// 创建控件行容器
let controlsRow = document.createElement("div");
controlsRow.className = "controls-row";
likeContent.append(controlsRow);
// 创建点赞按钮
let kolento = document.createElement("p");
kolento.className = "kolento";
kolento.innerHTML = '开始<br/>点赞';
controlsRow.append(kolento);
// 创建点击数显示
let total = document.createElement("div");
total.className = "total";
total.innerHTML = '<p class="text">点击数:</p><p class="kolento-all">0</p>';
controlsRow.append(total);
// 创建频率调整器
let freqAdjuster = document.createElement("div");
freqAdjuster.className = "freq-adjuster";
freqAdjuster.innerHTML = `
<div>
<span class="freq-label">点赞频率(ms):</span>
<input type="number" class="freq-input" value="120000" min="1" max="120000">
</div>
<div>
<span class="opacity-label">透明度:</span>
<input type="range" class="opacity-slider" min="10" max="100" value="40">
</div>
<label class="auto-like-option">
<input type="checkbox" class="auto-like-checkbox">
<span>默认自动点赞</span>
</label>
`;
likeContent.append(freqAdjuster);
// 实现拖拽功能
let isDragging = false;
let offsetX, offsetY;
let dragStartTime = 0;
const DRAG_THRESHOLD = 200; // 拖动时间阈值,单位毫秒
likeContainer.addEventListener('mousedown', function(e) {
// 如果点击的是toggle-button,不启动拖拽,直接处理点击事件
if (e.target === toggleButton) {
toggleLikeContent();
e.stopPropagation();
return;
}
// 只有点击容器本身时才启动拖拽
if (e.target === likeContainer) {
isDragging = true;
dragStartTime = Date.now();
offsetX = e.clientX - likeContainer.getBoundingClientRect().left;
offsetY = e.clientY - likeContainer.getBoundingClientRect().top;
// 防止拖拽时选中文本
e.preventDefault();
}
});
document.addEventListener('mousemove', function(e) {
if (!isDragging) return;
let left = e.clientX - offsetX;
let top = e.clientY - offsetY;
// 确保不超出屏幕边界
left = Math.max(0, Math.min(left, window.innerWidth - likeContainer.offsetWidth));
top = Math.max(0, Math.min(top, window.innerHeight - likeContainer.offsetHeight));
likeContainer.style.left = left + 'px';
likeContainer.style.top = top + 'px';
likeContainer.style.right = 'auto';
});
document.addEventListener('mouseup', function(e) {
if (isDragging) {
isDragging = false;
}
});
// 添加一个专门的切换函数
function toggleLikeContent() {
if (likeContent.classList.contains('hidden')) {
likeContent.classList.remove('hidden');
toggleButton.innerHTML = "▼";
} else {
likeContent.classList.add('hidden');
toggleButton.innerHTML = "▲";
}
// 保存显示状态
localStorage.setItem('likeContentHidden', likeContent.classList.contains('hidden'));
}
// 从localStorage获取显示状态
const isContentHidden = localStorage.getItem('likeContentHidden') === 'true';
if (isContentHidden) {
likeContent.classList.add('hidden');
toggleButton.innerHTML = "▲";
}
var timeBox;
let totalNum = 0;
let likeFrequency = 120000; // 从50改为100
let num = document.getElementsByClassName('kolento-all')[0];
console.log('num',num);
num.innerHTML=totalNum;
let target = document.getElementsByClassName('LO5TGkc0')
// 修改hover事件监听,使用更可靠的方式
let freqAdjusterVisible = false;
let freqAdjusterTimeout;
// 修改为hover整个容器时显示频率调节器
likeContainer.addEventListener('mouseenter', function() {
clearTimeout(freqAdjusterTimeout);
freqAdjuster.style.display = 'flex';
freqAdjusterVisible = true;
});
likeContainer.addEventListener('mouseleave', function() {
freqAdjusterTimeout = setTimeout(() => {
if (!freqAdjuster.matches(':hover')) {
freqAdjuster.style.display = 'none';
freqAdjusterVisible = false;
}
}, 300);
});
freqAdjuster.addEventListener('mouseenter', function() {
clearTimeout(freqAdjusterTimeout);
freqAdjuster.style.display = 'flex';
freqAdjusterVisible = true;
});
freqAdjuster.addEventListener('mouseleave', function() {
freqAdjusterTimeout = setTimeout(() => {
if (!likeContainer.matches(':hover')) {
freqAdjuster.style.display = 'none';
freqAdjusterVisible = false;
}
}, 300);
});
// 透明度滑块事件
const opacitySlider = document.querySelector('.opacity-slider');
opacitySlider.addEventListener('input', function(e) {
const opacity = e.target.value / 100;
likeContainer.style.opacity = opacity;
localStorage.setItem('likeContainerOpacity', opacity);
});
// 从localStorage获取透明度设置
const savedOpacity = localStorage.getItem('likeContainerOpacity');
if (savedOpacity) {
likeContainer.style.opacity = savedOpacity;
opacitySlider.value = savedOpacity * 100;
} else {
likeContainer.style.opacity = 0.4;
opacitySlider.value = 40;
}
// 修改点击事件,添加防止拖动触发的判断
let clickStartTime = 0;
let isClickDragging = false;
kolento.addEventListener('mousedown', function(e) {
clickStartTime = Date.now();
isClickDragging = false;
e.stopPropagation(); // 防止事件冒泡到容器
});
kolento.addEventListener('mousemove', function() {
if (Date.now() - clickStartTime > 100) { // 如果移动超过100ms,认为是拖动
isClickDragging = true;
}
});
kolento.addEventListener('mouseup', function(e) {
if (!isClickDragging) {
// 执行点赞逻辑
if(kolento.innerHTML.indexOf('开始')>-1){
console.log('执行点赞脚本')
kolento.innerHTML='停止<br/>点赞'
timeBox = setInterval(()=>{
totalNum++;
num.innerHTML=totalNum;
target[0].click();
}, likeFrequency);
}else{
console.log('停止点赞');
clearInterval(timeBox);
kolento.innerHTML='开始<br/>点赞'
}
}
e.stopPropagation(); // 防止事件冒泡到容器
});
// 获取频率输入框并添加事件监听
const freqInput = document.querySelector('.freq-input');
freqInput.addEventListener('change', function(e) {
likeFrequency = parseInt(e.target.value, 10) || 120000;
localStorage.setItem('likeFrequency', likeFrequency);
// 如果正在点赞,重新设置定时器
if(kolento.innerHTML.indexOf('停止') > -1) {
clearInterval(timeBox);
timeBox = setInterval(() => {
totalNum++;
num.innerHTML = totalNum;
target[0].click();
}, likeFrequency);
}
});
// 从localStorage获取频率设置
const savedFrequency = localStorage.getItem('likeFrequency');
if (savedFrequency) {
likeFrequency = parseInt(savedFrequency, 10);
freqInput.value = likeFrequency;
}
// 获取复选框元素
const autoLikeCheckbox = document.querySelector('.auto-like-checkbox');
// 从localStorage获取设置,如果没有则默认为false
const autoLikeEnabled = localStorage.getItem('autoLikeEnabled');
const shouldAutoLike = autoLikeEnabled === null ? false : autoLikeEnabled === 'true';
// 设置复选框初始状态
autoLikeCheckbox.checked = shouldAutoLike;
// 如果启用了自动点赞,自动开始点赞
if (shouldAutoLike) {
kolento.innerHTML = '停止<br/>点赞';
timeBox = setInterval(() => {
totalNum++;
num.innerHTML = totalNum;
target[0].click();
}, likeFrequency);
}
// 监听复选框变化
autoLikeCheckbox.addEventListener('change', function(e) {
localStorage.setItem('autoLikeEnabled', e.target.checked);
});
// 防止输入框事件冒泡
freqInput.addEventListener('mousedown', function(e) {
e.stopPropagation();
});
autoLikeCheckbox.addEventListener('mousedown', function(e) {
e.stopPropagation();
});
opacitySlider.addEventListener('mousedown', function(e) {
e.stopPropagation();
});
})();