取消微博互相关注以外的关注者

把微博互相关注以外的关注者取消关注

// ==UserScript==
// @name         取消微博互相关注以外的关注者
// @namespace    http://tampermonkey.net/
// @version      2025-04-29
// @description  把微博互相关注以外的关注者取消关注
// @author       RaspberrYanagi
// @match        https://weibo.com/u/page/follow/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=weibo.com
// @grant        none
// @license      GPL-3.0-or-later
// ==/UserScript==

(function() {
    'use strict';
    const link = document.createElement('a');
    link.href = 'javascript:void(0);';
    link.className = 'x_follow';
    link.textContent = '取消互相关注以外的关注';
    Object.assign(link.style, {
        position: 'fixed',
        right: '1%',
        bottom: '10%'
    });

    link.addEventListener('click', async (event) => {
        event.preventDefault();
        console.log('执行取消非互相关注操作');
        await loadFullList({ interval: 1500, maxRetries: 30 });
        const loadedFullList = document.querySelector('main').querySelector('[class^="ListTitle_tit_"],[class*=" ListTitle_tit_"]').parentElement.querySelector('.vue-recycle-scroller').__vue__.items;
        window.scrollTo({
            top: 0,
            behavior: 'instant'
        });
        document.querySelector('main').querySelector('button[class^="FollowContent_stbtn"],button[class*=" FollowContent_stbtn"]').click();
        let groupChecklist = document.querySelector('main').querySelector('[class^="ListTitle_tit_"],[class*=" ListTitle_tit_"]').parentElement.parentElement.__vue__.groupCheckedList;
        for ( const i of loadedFullList) {
            const {idstr, follow_me} = i.item;
            if (groupChecklist.length >= 20 ) {
                await submitUnfollow();
                groupChecklist = [];
                groupChecklist = document.querySelector('main').querySelector('[class^="ListTitle_tit_"],[class*=" ListTitle_tit_"]').parentElement.parentElement.__vue__.groupCheckedList;
            } else {
                if (!follow_me) {
                    groupChecklist.push(idstr);
                }
            }
        }

        console.log("循环执行完了");
        console.log(groupChecklist);
        await delay(3000);
        if (groupChecklist.length > 0) {
            await submitUnfollow();
        }

    });

    document.documentElement.insertBefore(link, document.body);


})();

const submitUnfollow = async () => {
    document.querySelector('main').querySelector('div[class^="FollowContent_stbtn"],div[class*=" FollowContent_stbtn"]').querySelector('button').click();
    await delay(1000);
    document.querySelector('.woo-modal-main').querySelector('.woo-button-primary').click();
    await delay(5000);
}

const delay = (ms) => new Promise(resolve => setTimeout(resolve, ms));

async function loadFullList(options = {}) {
    const {
        maxRetries = 5,
        interval = 1000,
    } = options;

    let lastItemCount = 0;
    let retries = 0;

    const load = async () => {
        const currentItems = document.querySelector('main').querySelector('[class^="ListTitle_tit_"],[class*=" ListTitle_tit_"]').parentElement.querySelector('.vue-recycle-scroller').__vue__.items.length

        if (currentItems === lastItemCount) {
            if (retries++ > maxRetries) {
                console.log('列表已完全加载');
                return true;
            }
        } else {
            retries = 0;
            lastItemCount = currentItems;
        }

        window.scroll({
            top: document.body.scrollHeight - window.innerHeight - 96 * 5,
            behavior: 'smooth'
        });
        window.dispatchEvent(new Event('scroll'));

        await delay(1000)

        window.scrollTo({
            top: document.body.scrollHeight,
            behavior: 'smooth'
        });
        window.dispatchEvent(new Event('scroll'));

        await new Promise(r => setTimeout(r, interval));
        return load();
    };

    return load();
}

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址