Greasy Fork

来自缓存

Greasy Fork is available in English.

微博增强-添加悄悄关注

在m.weibo.cn和weibo.com域名下运行的自定义脚本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         微博增强-添加悄悄关注
// @namespace    https://github.com/ozingi
// @version      2.0.02
// @description  在m.weibo.cn和weibo.com域名下运行的自定义脚本
// @author       ozingi
// @match        https://m.weibo.cn/*
// @match        https://weibo.com/*
// @match        https://weibo.com/set/*
// @match        https://m.weibo.cn/u/*
// @match        https://m.weibo.cn/setting*
// @grant        GM_xmlhttpRequest
// @connect      weibo.cn
// @license      版权所有 (C) 2024 [email protected]。允许修改和再分发,但必须保留此版权声明。商业使用需联系作者获得授权。

// ==/UserScript==
(function() {
    'use strict';

    // 获取当前页面的cookie
    var cookies = document.cookie;
    // 记录当前页面的URL
    let lastUrl = window.location.href;
    // 添加自定义样式
    var style = document.createElement('style');
    style.type = 'text/css';
    style.innerHTML = `
        .custom-setting-span:active {
            background-color: orange;
        }
        .custom-setting-div {
            display: none; /* 默认不显示 */
            width: 200px;
            height: 300px;
            border: 1px solid black;
            position: absolute;
            top:10%;
            right: 5%;
            z-index:1;
            background:white;
            padding: 10px;
            box-sizing: border-box;
        }
        .custom-setting-div input,
        .custom-setting-div button {
            margin-top: 10px;
            width: 100%;
        }
    `;
    document.head.appendChild(style);
    function setQuietfollow(uid) {
        // 执行后台访问
        GM_xmlhttpRequest({
            method: 'GET',
            url: 'https://weibo.cn/'+uid+'/operation?rl=0',
            headers:{
                "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/jxl,image/webp,*/*;q=0.8",
                "Accept-Encoding": "gzip, deflate, br, zstd",
                "Accept-Language": "zh-CN,zh-HK;q=0.5",
                "Connection":"keep-alive",
                "Cookie": cookies,
                "Host": "weibo.cn",
                "Priority": "u=1",
                "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 Edg/118.0.0.0"
            },
            onload: function(response) {
                // 这里可以根据返回的内容进行相应的处理
                //console.log('请求成功,返回的数据:', response.responseText);
                //console.log(typeof(response.responseText));
                // 使用正则表达式匹配St内容
                var regexSt = /rl=0&st=(.*?)">/;
                var matchResult = response.responseText.match(regexSt);
                var matchesSt = matchResult ? matchResult[1] : false;
                //console.log("查找st",matchesSt);
                if(matchesSt!=false){
                    GM_xmlhttpRequest({
                        method: 'GET',
                        url: 'https://weibo.cn/attention/addPrivate?uid='+uid+'&rl=0&st='+matchesSt+'',
                        headers:{
                            "Host": "weibo.cn",
                            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 Edg/118.0.0.0",
                            "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/jxl,image/webp,*/*;q=0.8",
                            "Accept-Language": "zh-CN,zh-HK;q=0.5",
                            "Accept-Encoding": "gzip, deflate, br, zstd",
                            "Connection": "keep-alive",
                            "Referer": 'https://weibo.cn/'+uid+'/operation?rl=0&rand=6608&p=r',
                            "Cookie": cookies,
                            "Upgrade-Insecure-Requests": "1",
                            "Sec-Fetch-Dest": "document",
                            "Sec-Fetch-Mode": "navigate",
                            "Sec-Fetch-Site": "same-origin",
                            "Sec-Fetch-User": "?1",
                            "sec-ch-ua-platform": "Windows",
                            "sec-ch-ua": '"Edge";v="118", "Chromium";v="118", "Not=A?Brand";v="24"',
                            'sec-ch-ua-mobile': '?0',
                            'Priority': 'u=1',
                            'TE': 'trailers'
                        },
                        onload: function(response) {
                            // 这里可以根据返回的内容进行相应的处理
                            //console.log('请求成功,返回的数据:', response.responseText);
                            //console.log(typeof(response.responseText));
                            // 使用正则表达式匹配<div class="me">标签及其内容
                            var regexMe = /<div class="me">(.*?)<\/div>/;
                            var matchesMe = response.responseText.match(regexMe);
                            var regexPs = /<div class="ps">(.*?)<\/div>/;
                            var matchesPs = response.responseText.match(regexPs);
                            var matches;
                            matches=matchesMe?matchesMe:matchesPs;
                            //console.log(matchesMe);
                            if(matches){
                                matches = matches[1];
                                // 使用Toast函数
                                console.log(matches);
                                showToast(matches, 3000); // 显示3秒钟
                            }

                        },
                        onerror: function(error) {
                            // 请求失败时的处理
                            console.error('请求失败:', error);
                        }});}else{
                        showToast("请求用户信息失败", 3000); // 显示3秒钟
                    }}
        });
    }
    // 使用MutationObserver监听DOM变化
    var observer = new MutationObserver(function() {
        const url = window.location.href;
        // 使用正则表达式匹配执行url内容
        var regexUrl = /^https:\/\/m\.weibo\.cn\/(u\/\w+|setting|profile)/;
        var regexUrl2 = /^https:\/\/weibo\.com\/(set\/\w+|u)/;
        var matchUrl2 = url.match(regexUrl2);
        var matchUrl = url.match(regexUrl);

        //console.log('浏览器地址变化:', matchUrl2);
        if (matchUrl||matchUrl2) {
            if(typeof elements() === 'undefined'){

            }

        }

    });
    // 获取所有class为m-diy-btn m-box-col m-box-center m-box-center-a和div.bar-btn:nth-child(2)的元素
    var elements = ()=>{
        var element = document.querySelector('.m-diy-btn.m-box-col.m-box-center.m-box-center-a');
        var element2 = document.querySelector('.m-diy-btn.m-box-col.m-box-center.m-box-center-a.quiet-follow');
        //资料页
        var element3 = document.querySelector('div.bar-btn:nth-child(2)');
        var element4 = document.querySelector('.bar-btn.m-box-col.quiet-follow');
        //pc
        var element5 = document.querySelector('a.ALink_default_2ibt1:nth-child(6)');
        var element6 = document.querySelector('.router-link-exact-active.router-link-active.ALink_default_2ibt1.quiet-follow');

        var element7 = document.querySelector('div.woo-pop-wrap:nth-child(3)');
        var element8 = document.querySelector('.woo-pop-wrap.quiet-follow');
        //console.log("搜索个人页",element4)
        if (element&& (element2==null)) {
            // 创建新的div元素
            var newDiv = document.createElement('div');
            newDiv.className = 'm-diy-btn m-box-col m-box-center m-box-center-a quiet-follow'; // 添加自定义类名
            newDiv.innerHTML = '<div data-v-5552d90b="" callback="follow()" class="m-add-box m-followBtn"><span class="m-add-box"><h5>悄悄关注</h5></span></div>';
            // 将新的div标签添加到找到的div标签后面
            element.parentNode.insertBefore(newDiv, element.nextSibling);
            // 执行完毕后断开观察者
            //observer.disconnect();
            // 添加点击事件监听器
            newDiv.addEventListener('click', function() {
                var currentUrl = window.location.href;
                // 使用正则表达式匹配St内容
                var regexUid = /cn\/u\/(.*?)(?=\?|$)/;
                var matchUid = currentUrl.match(regexUid);
                if(matchUid){
                    setQuietfollow(matchUid[1])
                }
            });
        };
        if (element3&& (element4==null)) {
            // 创建新的div元素
            var newDiv2 = document.createElement('div');
            newDiv2.className = 'bar-btn m-box-col quiet-follow'; // 添加自定义类名
            newDiv2.innerHTML = '<div callback="follow()" class="m-add-box m-followBtn m-btn m-btn-block m-btn-blue"><span class="m-add-box"><sapn>悄悄关注</span></span></div>';
            // 将新的div标签添加到找到的div标签后面
            element3.parentNode.insertBefore(newDiv2, element3.nextSibling);
            // 执行完毕后断开观察者
            //observer.disconnect();
            // 添加点击事件监听器
            newDiv2.addEventListener('click', function() {
                var currentUrl = window.location.href;
                // 使用正则表达式匹配St内容
                var regexUid = /profile\/(.*?)(?=\?|$)/;
                var matchUid = currentUrl.match(regexUid);
                if(matchUid){
                    setQuietfollow(matchUid[1])
                }
            });
        };
        if (element5&& (element6==null)) {
            // 创建新的div元素
            var newDiv3 = document.createElement('a');
            newDiv3.className = 'router-link-exact-active router-link-active ALink_default_2ibt1 quiet-follow'; // 添加自定义类名
            newDiv3.href = 'https://m.weibo.cn/setting?tab=whisper'; // 设置跳转链接
            newDiv3.innerHTML = '<div class="woo-box-flex woo-box-alignCenter NavItem_main_2hs9r NavItem_cur_2ercx" role="link" title="使用偏好" tabindex="0" data-focus-visible="true"><span class="NavItem_text_3Z0D7">悄悄关注</span></div>';
            // 将新的div标签添加到找到的div标签后面
            element5.parentNode.insertBefore(newDiv3, element5.nextSibling);
        };
        if (element7&& (element8==null)) {
            // 创建新的div元素
            var newDiv4 = document.createElement('div');
            newDiv4.className = 'woo-pop-wrap quiet-follow'; // 添加自定义类名
            newDiv4.innerHTML = '<span class="woo-pop-ctrl"><button class="woo-button-main woo-button-flat woo-button-primary woo-button-m woo-button-round FollowBtn_m_1UJhp ProfileHeader_btn3_2VD_Y" user="[object Object]"><span class="woo-button-wrap"><span class="woo-button-content"> 悄悄关注 </span></span></button></span>';
            // 将新的div标签添加到找到的div标签后面
            element7.parentNode.insertBefore(newDiv4, element7.nextSibling);
            // 执行完毕后断开观察者
            //observer.disconnect();
            // 添加点击事件监听器
            newDiv4.addEventListener('click', function() {
                var currentUrl = window.location.href;
                // 使用正则表达式匹配St内容
                var regexUid = /\/u\/(\d+)(?=\?|$)/;
                var matchUid = currentUrl.match(regexUid);
                //console.log(matchUid)
                if(matchUid){
                    setQuietfollow(matchUid[1])
                }
            });
        };
        return element;
    }
    // 配置和启动观察者
    observer.observe(document.body, { childList: true, subtree: true });

    // 等待页面加载完成
    window.addEventListener('load', function() {
        // 查找.sub-header下的第一个span标签
        var subHeaderSpan = document.querySelector('.sub-header span');
        //console.log("搜索列表",subHeaderSpan)
        if (subHeaderSpan) {
            // 创建新的span标签
            var newSpan = document.createElement('span');
            newSpan.textContent = '设置'; // 设置新span的内容
            newSpan.style.float = 'right'; // 设置新span的样式
            newSpan.className = 'custom-setting-span'; // 添加自定义类名

            // 创建设置面板div
            var settingDiv = document.createElement('div');
            settingDiv.className = 'custom-setting-div';
            // 添加文本
            settingDiv.innerHTML = '<p>添加用户</p>';
            // 创建UID输入框
            var uidInput = document.createElement('input');
            uidInput.type = 'text';
            uidInput.placeholder = '请输入UID';
            // 创建确认添加按钮
            var addButton = document.createElement('button');
            addButton.textContent = '确认添加';
            // 将输入框和按钮添加到设置面板
            settingDiv.appendChild(uidInput);
            settingDiv.appendChild(addButton);

            // 添加点击事件监听器
            newSpan.addEventListener('click', function() {
                //关闭时刷新悄悄关注列表
                if(settingDiv.style.display=='block'){
                    location.reload();
                }
                // 显示或隐藏设置面板
                settingDiv.style.display = settingDiv.style.display === 'none' ? 'block' : 'none';
                //console.log(settingDiv.style.display);

            });
                        // 添加点击事件监听器
            addButton.addEventListener('click', function() {
                // 执行后台访问
                setQuietfollow(uidInput.value)
            });


            // 将新的span标签添加到找到的span标签后面
            subHeaderSpan.parentNode.insertBefore(newSpan, subHeaderSpan.nextSibling);
            // 将设置面板div添加到body中
            document.body.appendChild(settingDiv);
        }
    });
/*         // 保存原始的send函数
    var originalSend = XMLHttpRequest.prototype.send;

    // 修改send函数
    XMLHttpRequest.prototype.send = function() {
        // 在这里添加你的代码,它会在每个请求发送时执行

        // 监听请求的load事件,它会在请求完成时触发
        this.addEventListener('load', function() {
            if (this.readyState === 4 && this.status === 200) {
                // 在这里添加你的代码,它会在请求成功完成时执行
                var subHeaderSpan1 = document.querySelector('.box-right.m-box-center-a.m-box-center.m-btn-box');
                console.log("搜索列表",subHeaderSpan1)
                if (subHeaderSpan1) {
                    // 创建新的div元素
                    var newDiv = document.createElement('div');
                    newDiv.className = 'box-right m-box-center-a m-box-center m-btn-box'; // 添加自定义类名
                    newDiv.innerHTML = '<div data-v-124dcff2=""><div data-v-124dcff2="" class="m-add-box"><i data-v-124dcff2="" class="m-font m-font-follow"></i><h4 data-v-124dcff2="">加关注</h4></div></div>';

                    // 将新的div添加到当前元素的后面
                    subHeaderSpan1.appendChild(newDiv);
                }
                console.log('请求完成:', this);
            }
        }, false);

        // 调用原始的send方法
        originalSend.apply(this, arguments);
    }; */
    // 创建Toast函数
    function showToast(message, duration) {
        // 创建一个div元素作为Toast容器
        var toast = document.createElement('div');

        // 设置Toast的样式
        toast.style.position = 'fixed';
        toast.style.top = '50%';
        toast.style.left = '50%';
        toast.style.transform = 'translateX(-50%)';
        toast.style.backgroundColor = 'rgba(0, 0, 0, 0.7)';
        toast.style.color = 'white';
        toast.style.padding = '10px 20px';
        toast.style.borderRadius = '5px';
        toast.style.zIndex = '555';
        toast.style.fontSize = '16px';

        // 将消息文本添加到Toast容器中
        toast.textContent = message;

        // 将Toast添加到文档中
        document.body.appendChild(toast);

        // 设置Toast显示的时间
        setTimeout(function() {
            // 移除Toast
            document.body.removeChild(toast);
        }, duration || 2000); // 如果没有指定时间,默认为2000毫秒
    }

})();