Greasy Fork

Greasy Fork is available in English.

抖音网页直播点赞(可调节频率,可设置是否默认自动点赞)

这是一个基于抖音直播的自动点赞脚本,支持调节点赞频率,修改自别人的脚本

当前为 2025-03-25 提交的版本,查看 最新版本

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==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();
        });
})();