Twitter Bookmarks Auto Scroller

Automatically scrolls down the Twitter(X) bookmarks page. Recommended for use with the 'Twitter Web Exporter' script.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         Twitter Bookmarks Auto Scroller
// @name:zh-CN   推特(X)收藏夹页面自动划屏
// @namespace    http://tampermonkey.net/
// @version      0.4
// @description  Automatically scrolls down the Twitter(X) bookmarks page. Recommended for use with the 'Twitter Web Exporter' script.
// @description:zh-CN 推特(X)收藏夹页面自动划屏(建议搭配 https://greasyfork.org/zh-CN/scripts/492218-twitter-web-exporter 食用)
// @author       Mashiro Shiina
// @license      MIT
// @match        *://twitter.com/i/bookmarks*
// @match        *://x.com/i/bookmarks*
// @match        *://mobile.x.com/i/bookmarks*
// @grant        GM_addStyle
// @icon         https://www.google.com/s2/favicons?sz=64&domain=twitter.com
// ==/UserScript==

(function() {
    'use strict';

    // --- 配置项 ---
    // 滚动时间间隔(毫秒)。网络慢可适当调大,如 5000。不建议设置太小,容易触发API风控。
    const scrollInterval = 3000;

    // --- 脚本内部变量 ---
    let autoScrollInterval = null; // 用于存储定时器ID
    let isScrolling = false;       // 标记当前是否正在滚动

    // --- 创建控制按钮 ---
    const controlButton = document.createElement('button');
    controlButton.textContent = '开始自动滚动';
    document.body.appendChild(controlButton);

    // --- 按钮点击事件 ---
    controlButton.addEventListener('click', toggleScrolling);

    // --- 功能函数 ---
    function startScrolling() {
        if (isScrolling) return; // 如果已经在滚动,则不执行任何操作
        isScrolling = true;
        controlButton.textContent = '停止自动滚动';
        controlButton.style.backgroundColor = '#dc3545'; // 红色,表示正在运行

        console.log('Auto-scrolling started.');

        // 先立即执行一次滚动
        window.scrollTo(0, document.body.scrollHeight);

        // 设置定时器,周期性滚动
        autoScrollInterval = setInterval(() => {
            let lastHeight = document.body.scrollHeight;
            window.scrollTo(0, document.body.scrollHeight);
            console.log('Auto-scrolling down...');

            // 检查是否已到达底部
            // 在滚动后等待一小段时间,检查页面高度是否不再变化
            setTimeout(() => {
                if (document.body.scrollHeight === lastHeight && isScrolling) {
                    console.log('Reached the bottom.');
                    stopScrolling(); // 停止滚动
                    alert('已到达收藏夹底部,自动滚动已停止。');
                }
            }, 1000);

        }, scrollInterval);
    }

    function stopScrolling() {
        if (!isScrolling) return; // 如果已停止,则不执行任何操作
        isScrolling = false;
        controlButton.textContent = '开始自动滚动';
        controlButton.style.backgroundColor = '#28a745'; // 绿色,表示已停止
        clearInterval(autoScrollInterval);
        autoScrollInterval = null;
        console.log('Auto-scrolling stopped by user.');
    }

    function toggleScrolling() {
        if (isScrolling) {
            stopScrolling();
        } else {
            startScrolling();
        }
    }

    // --- 按钮样式 ---
    // 使用 GM_addStyle 来添加CSS样式,确保按钮美观且位置固定
    GM_addStyle(`
        #${controlButton.id = 'scroll-control-button'} {
            position: fixed;
            bottom: 25px;
            right: 25px;
            z-index: 9999;
            padding: 10px 18px;
            font-size: 16px;
            color: white;
            background-color: #28a745; /* 初始为绿色 */
            border: none;
            border-radius: 8px;
            cursor: pointer;
            box-shadow: 0 4px 8px rgba(0,0,0,0.2);
            transition: background-color 0.3s, transform 0.1s;
        }
        #scroll-control-button:hover {
            opacity: 0.9;
        }
        #scroll-control-button:active {
            transform: scale(0.95);
        }
    `);

})();