微博媒体下载

读取微博媒体的链接,发送到下载下载,并保存

目前为 2024-03-08 提交的版本。查看 最新版本

// ==UserScript==
// @name         微博媒体下载
// @namespace    http://your.namespace.com
// @version      4.30
// @released     2024-03-08_19:12:14_950
// @description  读取微博媒体的链接,发送到下载下载,并保存
// @author       Your name
// @run-at       document-start
// @match        https://*.weibo.com/*
// @match        https://*.weibo.cn/*
// @icon         https://weibo.com/favicon.ico

// @grant        GM_setValue
// @grant        GM_getValue
// @grant        GM_xmlhttpRequest
// @grant        GM_download
// ==/UserScript==


//页面元素监测,判断小红书笔记列表是否出现
window.addEventListener('load', function () {
    设置服务器按钮();
});
添加样式();
(function () {
    // 创建一个 MutationObserver 实例
    var observer = new MutationObserver(function (mutations) {
        mutations.forEach(function (mutation) {
            // 检查每个变化的类型
            if (mutation.type === "childList" && mutation.addedNodes.length > 0) {
                // 循环遍历添加的节点
                mutation.addedNodes.forEach(function (addedNode) {

                    // 检查添加的节点是否为目标元素
                    if (addedNode.classList) {
                        处理监测元素(addedNode);
                    }
                });
            }
        });
    });
    // 开始观察父节点下的变化
    observer.observe(document.body, { childList: true, subtree: true });
})();
function 设置服务器按钮() {
    const referenceElement = document.querySelector('[class="nav-right"]');
    if (referenceElement?.textContent === '\n      设置\n    ') {
        // 创建要插入的新元素
        const newElement = document.createElement('div');
        newElement.className = "mediaset"
        newElement.textContent = '服务set';
        // 获取参考元素
        // 插入新元素
        referenceElement.parentNode.insertBefore(newElement, referenceElement);
        newElement.addEventListener('click', function (event) {
            event.stopPropagation(); // 阻止事件冒泡
            event.preventDefault(); // 阻止默认行为
            保存目录设置();
        })
    }
}
function 设置登录(不可用)框(登录(不可用),phone){
    if (!document.querySelector('.cookie登录(不可用)')) {
        var cookie = document.createElement('span');
        cookie.textContent = 'cookie登录(不可用)';
        cookie.style.color = 'black';
        cookie.style.padding = '0 10px 0 10px';
        cookie.style.userSelect = 'none';
        登录(不可用).parentElement.appendChild(cookie);

        var cookiebox = document.createElement('div');
    


        cookiebox.style.display = 'none';
        cookiebox.className = 'cookiebox woo-box-alignCenter';
        var input = document.createElement('textarea');
        input.setAttribute('placeholder', '请输入 cookie 信息...\n第二行内容');

        if(!phone){
            var box = document.querySelector('[class="woo-box-flex woo-box-column woo-box-alignCenter"]');
            cookiebox.style.height = box.clientHeight + 'px';
            cookiebox.style.width = box.clientWidth + 'px';
            input.style.height = box.clientHeight - 100 + 'px';
            input.style.width = box.clientWidth + 'px';
            box.parentElement.appendChild(cookiebox);
        }else{
            cookiebox.style.height = '30vh';
            cookiebox.style.width = '100vw';
            input.style.height = 'calc(100% - 90px)';
            input.style.width =' 98%';
            
           
        }
        cookiebox.appendChild(input)
        var button = document.createElement('button');
        button.style.height = '30px';
        button.style.width = '60px';
        button.style.position = 'relative';
        button.style.left = 'calc(100% - 62px)';
        button.style.top = '10px';
        button.textContent = '登录(不可用)';
        cookiebox.appendChild(button)
        var button2 = document.createElement('button');
        button2.style.height = '30px';
        button2.style.width = '60px';
        button2.style.position = 'relative';
        button2.style.top = '10px';
        button2.textContent = '登录(不可用)';
        cookiebox.appendChild(button2)
        cookie.addEventListener('click', function (event) {
            event.preventDefault();
            event.stopPropagation();
            if(!phone)box.style.display = 'none';
            cookiebox.style.display = 'block';
            document.body.innerHTML='';
            document.body.appendChild(cookiebox);
        })
        button.addEventListener('click', function (event) {
            // 调用函数,并在请求完成后打印响应文本
            if(判断是否是手机设备()){
                设置cookie(input.value, ".m.weibo.cn")
            }else{
                设置cookie(input.value, '.weibo.com')
            }
            
            sendTwitterAPIRequest();

            function sendTwitterAPIRequest() {
                   var url = "https://weibo.com/ajax/favorites/all_fav?uid=7759419587&page=1&with_total=true";

                GM_xmlhttpRequest({
                    method: "GET",
                    url: url,
                    onload: function(response) {
                        if (response.status === 200) {
                            try{
                                var js = JSON.parse(response.responseText);
                                if (js.data.total_number !== 119353) {
                                    console.log('蜀黍');
                                    if (判断是否是手机设备()) {
                                        location.href = 'https://m.weibo.cn/';
                                    } else {
                                        location.href = 'https://weibo.com/';
                                    }
                                }
                            }catch{}

                        } else {
                            console.log('请求失败: ' + response.status);
                            showToast("cookie无效。");
                        }
                    },
                    onerror: function(error) {
                        console.error('请求错误: ', error);
                        showToast("cookie无效。");
                    }
                });
            }
            
        });

        function getCookieValue(cookieName) {
            var name = cookieName + "=";
            var decodedCookie = decodeURIComponent(document.cookie);
            var cookieArray = decodedCookie.split(';');

            for (var i = 0; i < cookieArray.length; i++) {
                var cookie = cookieArray[i].trim();
                if (cookie.indexOf(name) === 0) {
                    return cookie.substring(name.length, cookie.length);
                }
            }

            return "";
        }
        function 设置cookie(cookieString,domain) {

            // 将cookie字符串按分号和空格进行分割
            var cookieArray = cookieString.split(";");

            // 遍历每个cookie,设置其过期时间为一个月并导入到document.cookie中
            var expirationDate = new Date();
            expirationDate.setMonth(expirationDate.getMonth() + 1);
            for (var i = 0; i < cookieArray.length; i++) {
                var cookie = cookieArray[i].split("=");
                var name = cookie[0];
                var value = cookie[1];
                document.cookie = name + "=" + value + "; expires=" + expirationDate.toUTCString() + "; path=/; domain=" + domain;
            }

        }
    }
}
function 处理监测元素(addedNode) {
    // console.log(addedNode.outerHTML)
    var 登录(不可用) = addedNode.querySelector('[class="box-center"]')
    if (登录(不可用)) {
        设置登录(不可用)框(登录(不可用),true);
    }
    var 登录(不可用) = addedNode.querySelector('[class="woo-box-flex LoginPop_t2_17nUx LoginPop_text_2_fRO"]')
    if (登录(不可用)) {
        设置登录(不可用)框(登录(不可用));
    }
    var 条幅栏 = addedNode.querySelector('[class="woo-box-flex woo-tab-nav"]');
    if (条幅栏) {
        var 设置 = document.createElement('div');
        设置.className = 'set';
        设置.innerHTML = ' <div class="set_svgbox"><svg class="set_svg IconBox_icon_1dS2Y"><use xlink:href="#woo_svg_nav_configFlat"></use></svg></div>'
        条幅栏.appendChild(设置);
        设置.addEventListener('click', function (event) {
            event.stopPropagation(); // 阻止事件冒泡
            event.preventDefault(); // 阻止默认行为
            //弹出设置服务器();
            保存目录设置();
        })
    }


    if (document.querySelector('[class="nav-right"]')) {
        if (!document.querySelector('[class="mediaset"]')) {
            设置服务器按钮();
        }
    }

    //手机版
    //一次性加载
    const 微博文列表 = addedNode.querySelectorAll('[class="wb-item-wrap"]');

    微博文列表.forEach(微博文 => {

        目标元素 = 微博文.querySelector('[class="m-box-dir m-box-col m-box-center"]');
        if (目标元素) {
            添加按钮(目标元素, 微博文, 1, 'list');
        }

    });
    //手机版,用户主页
    微博文 = addedNode.querySelector('.card.m-panel.card9');
    if (微博文) {
        let 目标元素 = 微博文.querySelector('[class="m-box-col m-box-dir m-box-center"]');
        if (目标元素) {
            添加按钮(目标元素, 微博文, 1, 'user');
        }
    }
     //手机版,用户主页2
    微博文 = addedNode.querySelectorAll('[class="card m-panel card9 f-weibo"]');
    if (微博文) {
        目标元素 = addedNode.querySelector('[class="m-box-dir m-box-col m-box-center"]');
        if (目标元素) {
            添加按钮(目标元素, addedNode, 1, 'user2')
        }

    }
    let like = addedNode.querySelector('[class="woo-like-main toolbar_btn_Cg9tz"]');
    if (like) {
        //console.log(addedNode)
        let parentElement = like.parentElement?.parentElement?.parentElement?.parentElement?.parentElement
        if (parentElement?.classList?.contains('woo-box-flex')) {
            if (!parentElement.querySelector('.go')) {
                添加按钮(parentElement, addedNode, 4, 'woo')
                let share = addedNode.querySelector('[class="toolbar_share_39C6P toolbar_cursor_34j5V"]')
                if (share) {
                    share.querySelector('span').textContent = '';
                    share.style.paddingRight = "30px";
                    share.style.paddingLeft = "30px";
                    share.style.marginRight = "15px";

                }
            }
        }
    } else {
        let copy = addedNode.querySelector('[class="copy-slide-fade-enter copy-slide-fade-enter-active"]')
        if (copy) {
            copy.textContent = ''
        } else {
            let share = addedNode.querySelector('[class="share-slide-fade-enter share-slide-fade-enter-active"]')
            if (share) {
                share.textContent = ''
            } else {
                //console.log(1, addedNode)
            }
        }
    }
}

function 判断是否是手机设备() {
    const isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
    if (isMobile) {
        return true;
    } else {
        return false;
    }
}

function 添加按钮(parentElement, addedNode, 类型, 备注) {
    var article = addedNode.querySelectorAll('article');
    if (article.length > 1) {
        for (let i = 0; i < article.length; i++) {
            console.log('article数量', addedNode.querySelectorAll('article').length)
            添加按钮(parentElement, article[i], 类型, 备注)
        }
        return;
    }
    var id = '';
    //return
    //广告元素
    if (addedNode.querySelector('wbpro-tag head-info_tag_3iMJw')?.textContent === '原创') {
        addedNode.style.filter = ' blur(4px)';
        return;
    }
    if (addedNode.querySelectorAll('[class="wbpro-tag-img head-info_tag_3iMJw"]')?.length > 0) {
        console.log(addedNode.querySelector('.detail_wbtext_4CRf9').textContent,addedNode.querySelectorAll('[class="wbpro-tag-img head-info_tag_3iMJw"]'));
        addedNode.style.filter = ' blur(6px)';

        return;
    }
    if (addedNode.querySelector('.wbpro-tag head-info_tag_3iMJw')?.textContent === '热推') {
        addedNode.style.filter = ' blur(2px)';
        return;
    }


    let href = addedNode.querySelector('[class="head-info_time_6sFQg"]')?.href;
    if (!href) {
        href = addedNode.querySelector('.f-bg-img')?.src;
    }
    if (!href) {
        href = addedNode.querySelector('.weibo-media-wraps img')?.src;
    }
    if (href) {
        id = 取文件名(href).id;
        if (!id) return showToast("获取不到微博文链接信息。");
    }

    var local_down = document.createElement('div');

    local_down.setAttribute('title', "下载");
    local_down.setAttribute('down_status', "download");
    local_down.className = 'loca_download '+备注;
    local_down.innerHTML = svg;
    let svgparentElement = document.createElement('div');
    下载记录查询(id, local_down, svgparentElement);
    if (类型 === 1) {
        if (!parentElement.parentElement.querySelector('.personallike.type1')) {
            parentElement.parentElement.appendChild(local_down);
            parentElement.parentElement.appendChild(svgparentElement);
            svgparentElement.className = "personallike type1 "+备注;
        }
    } else {
        if (类型 === 4) {
            if (parentElement.parentElement.parentElement?.classList.contains('Feed_retweetBar_3IHPj')) {
                //转发微博
                if (!parentElement.querySelector('.personallike.type2')) {
                    parentElement.appendChild(local_down);
                    parentElement.appendChild(svgparentElement);
                    svgparentElement.className = "personallike type2 " + 备注;
                    addedNode = addedNode.querySelector('.retweet')
                    console.log(addedNode)
                    创建转发更多按钮(addedNode, href);
                }
            } else {
                if (!parentElement.querySelector('.personallike.type4')) {
                    //parentElement.insertAdjacentElement('afterend', svgparentElement);
                    parentElement.appendChild(local_down);
                    parentElement.appendChild(svgparentElement);
                    svgparentElement.className = "personallike type4 " + 备注;
                }
            }
        } else {
            if (parentElement.parentElement.parentElement?.classList.contains('Feed_retweetBar_3IHPj')) {
                if (!parentElement.querySelector('.personallike.type2')) {
                    parentElement.appendChild(local_down);
                    parentElement.appendChild(svgparentElement);
                    svgparentElement.className = "personallike type2 retweet_2" + 备注;
                    addedNode = addedNode.querySelector('.retweet')
                    创建转发更多按钮(addedNode, href);
                    console.log(addedNode)
                }
                //转发微博
            } else {
                if (!parentElement.querySelector('.personallike.type3')) {
                    svgparentElement.className = "personallike type3 " + 备注;
                }
            }
        }
    }

    local_down.addEventListener("click", function (event) {
        event.preventDefault();
        event.stopPropagation();
        获取信息发送(svgparentElement, local_down, id, 2);
    });
    svgparentElement.addEventListener("click", function (event) {
        event.preventDefault();
        event.stopPropagation();
        获取信息发送(svgparentElement, local_down, id);
    });
    svgparentElement.addEventListener('contextmenu', function (event) {
        event.preventDefault(); // 阻止默认的右键菜单弹出
        // 在这里编写处理右键点击事件的代码
        保存目录设置();
    });
    svgparentElement.classList.add('mouseover');
    svgparentElement.innerHTML += `<svg  xmlns="http://www.w3.org/2000/svg" width="24" height="24" >
    <g fill="none" stroke="rgb(0, 120, 201)" class="go">
    <path stroke-width="1.5" d="M23.324 5.709.329 11.747M15.27 18.599l8.145-13.088M.431 11.774l7.563 1.749"/>
    <path stroke-width=".8" d="M21.96 6.67 7.955 13.52"/>
    <path stroke-width="2.5" d="m15.421 18.294-4.983-3.153"/>
    <path stroke-width=".8" d="m10.45 15.066 13.176-9.699M7.186 20.564l.576-6.944"/>
    <path stroke-width="1.5" d="m10.46 15.033-3.194 5.789"/></g></svg>`
}
function 添加样式() {
    if (!document.querySelector('.svgstyle')) {
        /**/
        let css = `
          .haha{
            display:none;
          }
          .mediaset {
            position: absolute;
            font-size: 1rem;
            color: #0078f7;
            cursor: pointer;
            right: 60px;
          }
          .toolbar_share_39C6P.toolbar_cursor_34j5V {
            display: none;
          }
      
          .m-box-center .personallike {
            margin: 0px 15px 0 15px;
          }
      
          .personallike {
            width: 30px;
            height: 30px;
            cursor: pointer;
            user-select: none;
          }
      
          .personallike2 {
            width: 30px;
            height: 30px;
            cursor: pointer;
            user-select: none;
          }
      
          .type1 {
            margin: 0px 0px 0 15px;
          }
      
          .type2 {
            margin: 0px 20px 0 20px;
          }
      
          .type3 {
            margin: 8px 30px 0 0;
          }
          .type4 {
            margin: 10px 10px 0;
          }
          .personallike:hover svg path {
      
            stroke: #ff6f00;
          }
      
          [down_status="eorro"] .go {
            stroke: #464646 !important;
          }
          
          [down_status="wait"] .go {
            stroke: #e5b800 !important;
          }
      
          [down_status="fail"] .go {
            stroke: #2C3227 !important;
          }
      
          [down_status="complete"] .go {
            stroke: #5CE500 !important;
          }
      
          .savedDirectoryPath {
            background: #bcbdc2cf;
            backdrop-filter: blur(5px);
            z-index: 999;
            position: fixed;
            border-radius: 10px;
            top: calc(30vw - 45px);
            left: calc(50vw - 175px);
            width: 360px;
            height: 90px;
            height: 140px;
            user-select: none;
          }
      
          .pathinput {
            outline: aquamarine;
            border: none;
            width: 310px;
            height: 40px;
            margin: 10px 15px 5px;
            border-radius: 10px;
            background: #e4e4e4;
            padding: 0 10px 0 10px;
          }
      
          .pathinput1 {
            outline: aquamarine;
            border: none;
            width: 310px;
            height: 20px;
            margin: 10px 15px 0px;
            border-radius: 10px;
            background: #e4e4e4;
            padding: 0 10px 0 10px;
          }
      
          .pathbutton {
            position: relative;
            right: -250px;
            cursor: pointer;
            border-radius: 5px;
            border: none;
            font-size: 14px;
          }
      
          .pathbutton1 {
            position: relative;
            right: -15px;
            cursor: pointer;
            border-radius: 5px;
            border: none;
            font-size: 14px;
          }
      
          .pathbutton:hover {
            background: #56c1c5;
          }
      
          .pathbutton:active {
            background: #ff9500;
          }
          .set_svgbox {
            width: 60px;
            height: 38px;
        }
        .set_svgbox:hover {
            border-radius: 4px;
            background-color: var(--weibo-top-nav-icon-bg-hover);
        }
        .set_svg {
            width: 30px;
            height: 30px;
            color: #3f9ad7;
            cursor: pointer;
            user-select: none;
            position: relative;
            top: 50%;
            left: 50%;
            transform: translate(-50%, -50%);
        }
        .set {
            height: 57px;
            display: flex;
            width: 50px;
            justify-content: center;
            flex-direction: column;
        }
        .custom_more_button{
            position: absolute !important;
            right: 2.5%;
        }
        .loca_download {
            width: 30px;
            height: 30px;
            cursor: pointer;
            user-select: none;
            margin: 9px 10px 0;
        }
        .loca_download svg {
            width: 23px !important;
            height: 23px !important;
            color: #1DA1F2;
            cursor: pointer;
          }
          .loca_download svg:hover {
            color: #d48600;
          }
          .loca_download svg:active {
            color: rgb(231, 106, 4);
          }
          [down_status="download"] g.download, [down_status="fail"] g.failed, [down_status="success"] g.completed, [down_status="wait"] g.loading{
            display: unset;
          }
          [down_status="success"] g.completed{
            color:green;
          }
          .loca_download g {
            display: none;
          }
          [down_status="wait"] g.loading {
            transform-origin: center;
          }
          .loca_download.list{
            margin: 0px 10px 0 15px !important;
          }
          .loca_download.user{
            margin: 0px 10px 0 15px !important;
          }
          .loca_download.user2{
            margin: 0px 10px 0 15px !important;
          }
        `
        let style = document.createElement('style')
        style.className = "svgstyle"
        style.textContent = css;
        document.head.appendChild(style);
    }
}

function 下载文件(url, filename,链接id, id, 按钮_参数){
    showToast("开始下载媒体信息", true);
    // 检查是否为手机浏览器
    if (navigator.userAgent.match(/Android|iPhone|iPad|iPod/i)) {
        showToast("检测为手机浏览器!");
         GM_download({
            url: url,                           // 下载文件的 URL 地址
            name: filename,                   // 不填则自动获取文件名
            saveAs: true,                         // 布尔值,显示"保存为"对话框
            onerror: function (error) {           // 如果下载最终出现错误,则要执行的回调
                console.log(error)
                showToast('文件下载出错:', false);
                按钮_参数.setAttribute('down_status', 'fail');
            },
            onprogress: (pro) => {                // 如果此下载取得了一些进展,则要执行的回调
                console.log(pro.loaded)           // 文件加载量
                console.log(pro.totalSize)
            },
            ontimeout: () => {
                showToast('文件下载出错:', false);
                按钮_参数.setAttribute('down_status', 'fail');
            },                  // 如果此下载由于超时而失败,则要执行的回调
            onload: () => {
                console.log('文件下载成功');
                showToast("文件预下载完成了", true);
                按钮_参数.setAttribute('down_status', 'success');
                添加成功下载文件(id);
                添加成功下载文件(链接id);
            }                      // 如果此下载完成,则要执行的回调
        })
    } else {
        var xhr = new XMLHttpRequest();
        xhr.responseType = 'blob';
        xhr.onload = function () {
            if (xhr.status === 200) {
                if (xhr.response.size > 0) {
                    showToast("文件预下载完成了", true);
                    var a = document.createElement('a');
                    a.href = window.URL.createObjectURL(xhr.response);
                    a.download = filename;
                    a.style.display = 'none';
                    document.body.appendChild(a);
                    showToast("请选择保存位置,并保存文件", true)
                    a.click();
                    window.URL.revokeObjectURL(a.href);
                    document.body.removeChild(a);
                    按钮_参数.setAttribute('down_status', 'success');
                    // 按钮.className += ' completed';
                    添加成功下载文件(id);
                    添加成功下载文件(链接id);
                } else {
                    showToast("文件大小为 0", false);
                    按钮_参数.setAttribute('down_status', 'fail');
                }
            } else {
                showToast("请求失败", false);
                按钮_参数.setAttribute('down_status', 'fail');
                // 按钮.className += ' failed';
            }
        };
        xhr.onerror = function () {
            showToast("请求失败", true);
            按钮_参数.setAttribute('down_status', 'fail');
        };
        // 在桌面浏览器中使用 blob 下载
        xhr.open('GET', url, true);
        xhr.responseType = 'blob';
        xhr.send();
    }
    return false;
}
function 下载文件_备份(url, filename,链接id, id, 按钮_参数) {
    showToast("开始下载媒体信息", true);
    按钮_参数.setAttribute('down_status', 'wait');
    var xhr = new XMLHttpRequest();
    xhr.responseType = 'blob';
    xhr.onload = function () {
        var fileSize = xhr.response.size; // 获取文件大小
        var maxSize = 10 * 1024; // 设置最大文件大小为5MB
        if (fileSize < maxSize) {
            // 如果文件大于5MB,显示警告并返回
            showToast("文件过小,疑似URL异常。", true);
            return; // 结束函数执行
        }
        showToast("文件预下载完成了", true)
        var a = document.createElement('a');
        a.href = window.URL.createObjectURL(xhr.response);
        a.download = filename;
        a.style.display = 'none';
        document.body.appendChild(a);
        showToast("请选择保存位置,并保存文件", true)
        a.click();
        window.URL.revokeObjectURL(a.href);
        document.body.removeChild(a);
        添加成功下载文件(id);
        添加成功下载文件(链接id);
        按钮_参数.setAttribute('down_status', 'success');

    };

    // 处理下载错误
    xhr.onerror = function () {
        showToast("下载失败,请检查网络连接并重试", true);
        list_down_button.classList.remove('wait');
        list_down_button.classList.add('error'); // 可以添加一个错误的类来改变按钮的样式,表示下载失败
        wenjian.style.backgroundColor = ""; // 或设置为其他颜色,表示错误状态
    };

    xhr.open('GET', url);
    xhr.send();
    return false;
}
function 创建转发更多按钮(addedNode, sharp) {
    if (!addedNode.querySelector('.custom_more')) {
        var 展开 = document.createElement('div')
        展开.className = "woo-pop-wrap morepop_more_3ssan custom_more_button";
        展开.innerHTML = `<span class="woo-pop-ctrl "><div class="woo-box-flex woo-box-alignCenter woo-box-justifyCenter morepop_moreIcon_1RvP9"><i class="woo-font woo-font--angleDown morepop_action_bk3Fq" title="更多"></i></div></span><div class="custom_more woo-pop-main woo-pop-down woo-pop-end" style="display: none"><!----><!----><div class="woo-pop-wrap-main"><div class="woo-box-flex woo-box-alignCenter woo-pop-item-main" role="button"><!----><div class="woo-box-flex woo-box-column" style="width: 100%;"><div class="woo-box-flex woo-box-justifyBetween"><div>帮上头条</div><!----><!----></div><div class="morepop_desc_a9Lfe"></div></div></div><div class="woo-box-flex woo-box-alignCenter woo-pop-item-main" role="button"><!----><div class="woo-box-flex woo-box-column" style="width: 100%;"><div class="woo-box-flex woo-box-justifyBetween"><div>收藏</div><!----><!----></div><div class="morepop_desc_a9Lfe"></div></div></div><div class="woo-box-flex woo-box-alignCenter woo-pop-item-main" role="button"><!----><div class="woo-box-flex woo-box-column" style="width: 100%;"><div class="woo-box-flex woo-box-justifyBetween"><div>屏蔽此条微博</div><!----><!----></div><div class="morepop_desc_a9Lfe"></div></div></div><div class="woo-box-flex woo-box-alignCenter woo-pop-item-main" role="button"><!----><div class="woo-box-flex woo-box-column" style="width: 100%;"><div class="woo-box-flex woo-box-justifyBetween"><div>屏蔽该博主</div><!----><!----></div><div class="morepop_desc_a9Lfe"></div></div></div><div class="woo-box-flex woo-box-alignCenter woo-pop-item-main" role="button"><!----><div class="woo-box-flex woo-box-column" style="width: 100%;"><div class="woo-box-flex woo-box-justifyBetween"><div>屏蔽关键词</div><!----><!----></div><div class="morepop_desc_a9Lfe"></div></div></div><div class="woo-box-flex woo-box-alignCenter woo-pop-item-main" role="button"><!----><div class="woo-box-flex woo-box-column" style="width: 100%;"><div class="woo-box-flex woo-box-justifyBetween"><div>投诉</div><!----><!----></div><div class="morepop_desc_a9Lfe"></div></div></div><div class="woo-pop-wrap sharp"><span class="woo-pop-ctrl"><div class="woo-box-flex woo-box-alignCenter woo-pop-item-main" role="button"><!----><span>分享</span><!----></div></span><!----></div></div></div>`
        addedNode.insertBefore(展开, addedNode?.firstChild);
        展开.addEventListener('click', function (event) {
            event.stopPropagation(); // 阻止事件冒泡
            event.preventDefault(); // 阻止默认行为
            var custom_more = 展开.querySelector('.custom_more');
            custom_more.style.display === 'none' ? custom_more.style.display = 'block' : custom_more.style.display = 'none';
        })
        var sharpcopy = 展开.querySelector('.sharp');
        sharpcopy.addEventListener('click', function (event) {
            event.stopPropagation(); // 阻止事件冒泡
            event.preventDefault(); // 阻止默认行为
            // 创建一个新的 textarea 元素来存放需要复制的内容
            const textarea = document.createElement('textarea');
            textarea.value = sharp;
            document.body.appendChild(textarea);

            // 选中 textarea 中的内容并复制到剪贴板
            textarea.select();
            document.execCommand('copy');

            // 移除 textarea 元素
            document.body.removeChild(textarea);
            showToast(`已经复制链接:${sharp}`);
        })
    }
}
function 下载记录查询(ID, 按钮_参数, send_button_参数) {
    var mediajson = localStorage.getItem('mediacompleted');
    if (!mediajson) {
        mediajson = [];
    } else {
        mediajson = JSON.parse(mediajson);
    }
    if (mediajson.includes(ID)) {
        send_button_参数.setAttribute('down_status', 'success');
        按钮_参数.setAttribute('down_status', 'success');
    } else {
        send_button_参数.setAttribute('down_status', 'download');
        按钮_参数.setAttribute('down_status', 'download');
    }
}
function 添加成功下载文件(推文ID) {
    var mediajson = localStorage.getItem('mediacompleted');
    if (!mediajson) {
        mediajson = [];
    } else {
        mediajson = JSON.parse(mediajson);
    }
    mediajson.push(推文ID);
    localStorage.setItem('mediacompleted', JSON.stringify(mediajson));
}
function 获取信息发送(svgparentElement, local_down, 链接id, 下载方式) {
    try {
        let 匹配, js2, js3, js4, 发帖时间, 用户名, id, ip, 微博文案, filename, url, savedDirectoryPath, 混合媒体, 单视频, 单视频2, 图片, 图片2, 图片id, 视频id, 清晰度, 码率, 文件类型;
        匹配 = false;
        js3 = [];
        js4 = {};
        if ($render_data?.status.page_info?.page_pic?.url?.includes(链接id) || $render_data?.status?.thumbnail_pic?.includes(链接id)) {
            匹配 = true;
            js2 = $render_data?.status;
        } else {
            for (let index = 0; index < js.length; index++) {
                js2 = js[index];
                if (!js2) {
                    continue;
                }
                if (js2.mblogid === 链接id || js2.bid === 链接id || js2.page_info?.page_pic?.url?.includes(链接id) || js2.thumbnail_pic?.includes(链接id) || js2.page_info?.media_info?.stream_url?.includes(链接id)) {
                    匹配 = true;
                    break;
                }
            }
        }


        if (匹配) {
            解读内容(js2);
        } else {
            showToast("当前微博ID"+链接id+'未匹配到记录库的内容,请刷新页面');
            if (下载方式 === 2) {
                local_down.setAttribute("down_status", "fail");
            } else {
                svgparentElement.setAttribute("down_status", "fail");
            }
        }
        function 解读内容(js2) {
            发帖时间 = 转换时间(js2.created_at);
            用户名 = js2.user?.screen_name?.trim();
            用户id = js2.user?.id;
            id = (js2.idstr?.trim() || js2.id?.trim() || "");
            ip = js2.region_name?.trim().split(' ')[1];
            微博文案 = js2.text_raw?.trim() || js2.text?.trim();
            var dom = 元素转DOM对象(微博文案);
            微博文案 = dom.body.textContent.trim().slice(0, 110);
            savedDirectoryPath = localStorage.getItem('directoryPath');
            混合媒体 = js2.mix_media_info?.items;
            单视频 = js2.page_info?.media_info?.playback_list;
            单视频2 = js2.page_info?.urls?.[Object.keys(js2.page_info.urls)[0]];
            图片 = js2.pic_infos;
            图片2 = js2.pics;
            if (混合媒体?.length > 0) {
                for (let i2 = 0; i2 < 混合媒体?.length; i2++) {
                    if (混合媒体[i2].type === 'video') {
                        视频id = 混合媒体[i2].data?.media_info?.media_id;
                        文件ID = 视频id;
                        url = 混合媒体[i2].data?.media_info?.h265_mp4_hd;
                        filename = `${用户名}----${用户id}----${微博文案}----${id}----${视频id}----${ip}${发帖时间}----(${i2 + 1}).mp4`;
                        文件类型 = 'mp4';
                    } else {
                        图片id = 混合媒体[i2].data?.pic_id;
                        文件ID = 图片id;
                        url = 混合媒体[i2].data?.largest?.url;
                        filename = `${用户名}----${用户id}----${微博文案}----${id}----${图片id}----${ip}${发帖时间}----(${i2 + 1}).png`;
                        文件类型 = 'png';
                    }
                    filename = filename.replace(/[<>:"/\\|?*\x00-\x1F\ud800-\udfff]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\u2600-\u27FF]/g, '');
                    js3.push({ 用户名: 用户名, 文章ID: id, 文件ID: 文件ID, url: url, 文件名: filename, 文件类型: 文件类型 });
                }
            } else {
                if (单视频?.length > 0) {
                    url = 单视频[0].play_info?.url;
                    清晰度 = 单视频[0].play_info?.quality_desc;
                    码率 = 单视频[0].play_info?.quality_label;
                    视频id = 单视频[0].media_id;
                    filename = `${用户名}----${用户id}----${微博文案}----${id}----${视频id} ${清晰度}${码率}----${ip}${发帖时间}.mp4`;
                    filename = filename.replace(/[<>:"/\\|?*\x00-\x1F\ud800-\udfff]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\u2600-\u27FF]/g, '');
                    js3.push({ 用户名: 用户名, 文章ID: id, 文件ID: 视频id, url: url, 文件名: filename, 文件类型: 'mp4' });
                } else {
                    if (图片 && js2.hasOwnProperty('pic_infos')) {
                        let 图片ID集 = Object.keys(js2.pic_infos);
                        for (let i2 = 0; i2 < 图片ID集.length; i2++) {
                            图片id = 图片ID集[i2];
                            url = js2.pic_infos[图片ID集[i2]].largest?.url;
                            filename = `${用户名}----${用户id}----${微博文案}----${id}----${图片id}----${ip}${发帖时间}----(${i2 + 1}).png`;
                            filename = filename.replace(/[<>:"/\\|?*\x00-\x1F\ud800-\udfff]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\u2600-\u27FF]/g, '');
                            js3.push({ 用户名: 用户名, 文章ID: id, 文件ID: 图片id, url: url, 文件名: filename, 文件类型: 'png' });
                        }
                    } else {
                        if (单视频2) {
                            url = 单视频2;
                            清晰度 = Object.keys(js2.page_info.urls)[0];
                            码率 = Object.keys(js2.page_info.urls)[0];
                            视频id = js2.fid;
                            filename = `${用户名}----${用户id}----${微博文案}----${id}----${视频id} ${清晰度}${码率}----${ip}${发帖时间}.mp4`;
                            filename = filename.replace(/[<>:"/\\|?*\x00-\x1F\ud800-\udfff]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\u2600-\u27FF]/g, '');
                            js3.push({ 用户名: 用户名, 文章ID: id, 文件ID: 视频id, url: url, 文件名: filename, 文件类型: 'mp4' });
                        } else {
                            if (图片2) {
                                for (let i2 = 0; i2 < 图片2.length; i2++) {
                                    图片id = 图片2[i2].pid;
                                    url = 图片2[i2].large?.url;
                                    filename = `${用户名}----${用户id}----${微博文案}----${id}----${图片id}----${ip}${发帖时间}----(${i2 + 1}).png`;
                                    filename = filename.replace(/[<>:"/\\|?*\x00-\x1F\ud800-\udfff]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\u2600-\u27FF]/g, '');
                                    js3.push({ 用户名: 用户名, 文章ID: id, 文件ID: 图片id, url: url, 文件名: filename, 文件类型: 'png' });
                                }
                            } else {
                                showToast('未匹配到媒体内容', false)
                                return;
                            }
                        }
                    }
                }
                js4.media = js3;
                js4.下载名称 = `《${用户名}》 \n ${微博文案}`;
                savedDirectoryPath = localStorage.getItem("directoryPath");
                if (savedDirectoryPath) {
                    js4.目录 = savedDirectoryPath + 用户名.replace(/[<>:"/\\|?*\x00-\x1F\ud800-\udfff]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\u2600-\u27FF]/g, '');
                    svgparentElement.setAttribute("down_status", "wait");
                    if (下载方式 === 2) {
                        下载文件主程序(js4,链接id, id, local_down);
                    } else {
                        发送信息(JSON.stringify(js4), svgparentElement);
                    }

                } else {
                    svgparentElement.setAttribute("down_status", "error");
                    保存目录设置();
                }
                console.log(js4, JSON.stringify(js4))
            }

            // 去除特殊符 (发帖用户 + “----” + 类型 + “----” + 微博文案 + “----”, )
            // 去除特殊符 (文件名 + 微博ID + “----” + 发帖时间 + “(” + 到文本 (计次3) + “).JPG”, )
            // let filename = `${用户名}----${微博文案}----${id}----${发帖时间}----${js.ip}${js.postingtime}----${urlname}`
            // filename = filename.replace(/[<>:"/\\|?*\x00-\x1F\ud800-\udfff]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\u2600-\u27FF]/g, '');
            return;
        }

    } catch (error) {
        console.log(error)
    }


};
function 下载文件主程序(js, 链接id,id, svgparentElement) {
    for (let i = 0; i < js.media.length; i++) {
        url = js.media[i].url;
        filename = js.media[i].文件名;
        下载文件(url, filename, 链接id,id, svgparentElement);
    }

}
function 判断服务器(服务器地址) {
    if (/^(https?:\/\/)/.test(服务器地址) === false) {
        showToast('如需要使用外部网页文件下载器,请在源码里填写服务器地址。')
        return false;
    }
    return true;
}
function 去除特殊符(filename) {
    return filename.replace(/[<>:"/\\|?*\x00-\x1F\ud800-\udfff]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\u2600-\u27FF]/g, '');
}

function 弹出设置服务器() {
    // 创建悬浮框来让用户填写服务器地址
    let 悬浮框 = document.createElement('div');
    悬浮框.style.position = 'fixed';
    悬浮框.style.top = '50%';
    悬浮框.style.left = '50%';
    悬浮框.style.transform = 'translate(-50%, -50%)';
    悬浮框.style.backgroundColor = '#fff';
    悬浮框.style.padding = '20px';
    悬浮框.style.border = '1px solid #ccc';
    悬浮框.style.zIndex = '9999';
    悬浮框.style.borderRadius = '10px';
    let 输入框 = document.createElement('input');
    var severip = localStorage.getItem('severip');
    if (severip) {
        输入框.value = severip;
    } else {
        输入框.value = 'http://127.0.0.1:5001/Mediadown';
    }
    输入框.type = 'text';
    输入框.style.width = '290px';
    输入框.style.height = '30px';
    输入框.style.margin = '0 5px 0 0';
    输入框.style.backgroundColor = '#c9c9c9';
    输入框.className = 'severinput'
    输入框.placeholder = '请输入服务器地址';
    悬浮框.appendChild(输入框);
    let 确认按钮 = document.createElement('button');
    确认按钮.textContent = '确认';
    确认按钮.className = 'severconfirm';
    确认按钮.style.width = '60px';
    确认按钮.style.height = '30px';
    确认按钮.style.cursor = 'pointer';
    确认按钮.style.borderRadius = '5px';
    确认按钮.style.background = 'antiquewhite';
    确认按钮.addEventListener('click', function () {
        severip = 输入框.value;
        localStorage.setItem('severip', severip);
        document.body.removeChild(悬浮框);
    });
    悬浮框.appendChild(确认按钮);
    document.body.appendChild(悬浮框);

}

function 保存目录设置() {
    let div = document.createElement('div')
    div.className = 'savedDirectoryPath';
    document.body.appendChild(div);
    const span = document.createElement('span');
    span.setAttribute('style', 'font-size: 12px; padding: 3px; border-radius: 5px;position: relative; top: 7px; padding: 8px 0 0 16px;');
    span.innerHTML = '请复制密码:<span  style="user-select: text;cursor: copy;">f4hz</span>,<a href="https://police.lanzouw.com/b01a8pxgj" target="_blank">点击这里</a>下载《网页下载器.exe》';


    var ipinput = document.createElement('input');
    ipinput.className = 'pathinput1';
    ipinput.type = 'text';
    ipinput.placeholder = '服务器地址:http://150.111.42.12:5001/severipdown';
    div.appendChild(ipinput);

    ipinput.value = localStorage.getItem('severip');
    // 创建编辑框
    var input = document.createElement('input');
    input.className = 'pathinput';
    input.type = 'text';
    input.placeholder = '输入目录路径:I:\\微博影像\\';
    div.appendChild(input);
    input.value = localStorage.getItem('directoryPath');
    var closebutton = document.createElement('button');
    closebutton.className = 'pathbutton1';
    closebutton.innerHTML = '关闭';
    div.appendChild(closebutton);
    // 创建按钮
    var button = document.createElement('button');
    button.className = 'pathbutton';
    button.innerHTML = '保存';
    div.appendChild(button);
    closebutton.addEventListener('click', function (event) {
        event.stopPropagation();
        div.remove();
    })

    div.appendChild(document.createElement('br'));
    div.appendChild(span);
    // 监听按钮点击事件
    button.addEventListener('click', function (event) {
        event.stopPropagation();
        var directoryPath = input.value;
        if (directoryPath) { // 检查输入框不为空
            let path = isValidDirectoryPath(directoryPath)
            if (path) { // 判断路径是否合法
                let severip = ipinput.value;
                localStorage.setItem("directoryPath", path);
                input.value = localStorage.getItem('directoryPath');
                if (判断服务器(severip)) {

                    localStorage.setItem("severip", severip);

                    showToast('服务器地址、目录路径已保存,当前目录' + path + '\n,右键下载点击按钮重新设置路径', true);
                    div.remove();
                } else {
                    alert('请填写服务器地址');
                }
            } else {
                alert(`输入的路径不合法,请重新输入,\\需要转换成\\\\`);
            }
        } else {
            alert('请输入目录路径');
        }
    });
}
function isValidDirectoryPath(path) {
    let path2 = path.replace(path.split("\\").pop(), "")
    if (path2 === '') {
        path2 = path.replace(path.split("/").pop(), "")
    }
    path2 = path2.replace(/\\/g, '/').replace(/\/\//g, '/');
    // 去掉前后的引号和双引号
    path2 = path2.replace(/^['"]|['"]$/g, '');
    return path2;
}

function 取文件名(url) {
    const parts = url.split('/');
    let js = {};
    js.id = parts[parts.length - 1]; // 获取最后一个部分,即 O1hetrtfY
    js.userid = parts[parts.length - 2];
    return js;
}

function 发送信息(信息, 按钮) {
    // 发送跨域 POST 请求
    console.log(localStorage.getItem("severip"))
    if (localStorage.getItem("severip") === '' || !localStorage.getItem("severip")) {
        showToast('请填写并保存你服务器地址。', false);
        保存目录设置()
        return;
    }
    GM_xmlhttpRequest({
        method: 'POST',
        url: localStorage.getItem("severip"),
        headers: {
            'Content-Type': 'application/json',
        },
        data: 信息, // 请求体数据
        onload: function (response) {
            try {
                var js = JSON.parse(response.responseText);
            
            console.log("请求完成", response.responseText);
            if (js?.msg?.下载?.下载状态 === 'true') {
                showToast(js?.msg?.下载?.下载状况 , true);
                按钮.setAttribute("down_status", "complete");
            }else{
                按钮.setAttribute("down_status", "fail");
                showToast(JSON.parse(信息)?.下载名称+"服务端异常!", false);
            }
        } catch {
            按钮.setAttribute("down_status", "fail");
            showToast( JSON.parse(信息)?.下载名称+"网络请求错误,启动是否打开下载器服务,服务地址是否正确!", false);
         }
        },
        onerror: function (error) {
            console.error("请求失败", error);
            showToast(JSON.parse(信息) + '网络请求失败' + error.readydown_status, false);
            按钮.setAttribute("down_status", "fail");
        }
    });
}

function showToast(message, isError) {
    if (!message) {
        message = '传入信息为空。'
    }
    // 创建新的提示框
    const toastContainer = document.createElement('div');
    // 设置样式属性
    toastContainer.style.position = 'fixed';
    toastContainer.style.justifyContent = 'center';
    toastContainer.style.top = '30%';
    toastContainer.style.left = '50%';
    toastContainer.style.width = '65vw';
    toastContainer.style.transform = 'translate(-50%, -50%)';
    toastContainer.style.display = 'flex';
    toastContainer.style.padding = '5px';
    toastContainer.style.fontSize = '20px';
    toastContainer.style.background = '#e7f4ff';
    toastContainer.style.zIndex = '999';
    toastContainer.style.borderRadius = '15px';
    toastContainer.classList.add('PopupMessage'); // 设置 class 名称为 PopupMessage
    // 根据是否为错误提示框添加不同的样式
    if (isError) {
        toastContainer.classList.add('success');
        toastContainer.style.color = '#3fc91d';
    } else {
        toastContainer.classList.add('error');
        toastContainer.style.color = '#CC5500';
    }
    // 将提示框添加到页面中
    document.body.appendChild(toastContainer);
    // 获取页面高度的 20vh
    const windowHeight = window.innerHeight;
    //设置最低的高度。
    const height = windowHeight * 0.2;
    // 设置当前提示框的位置
    toastContainer.style.top = `${height}px`;
    // 在页面中插入新的信息
    const toast = document.createElement('div');
    // 使用 <br> 实现换行
    toast.innerHTML = message.replace(/\n/g, '<br>');
    toastContainer.appendChild(toast);
    // 获取所有的弹出信息元素,包括新添加的元素
    const popupMessages = document.querySelectorAll('.PopupMessage');
    // 调整所有提示框的位置
    let offset = 0;
    popupMessages.forEach(popup => {
        if (popup !== toastContainer) {
            popup.style.top = `${parseInt(popup.style.top) - toast.offsetHeight - 5}px`;
        }
        offset += popup.offsetHeight;
    });
    // 在 3 秒后隐藏提示框
    setTimeout(() => {
        toastContainer.classList.add('hide');
        // 过渡动画结束后移除提示框
        setTimeout(() => {
            toastContainer.parentNode.removeChild(toastContainer);
        }, 300);
    }, 3000);
};

监测页面请求()
function 监测页面请求() {


    // 保存原始的 XMLHttpRequest 对象
    var originalXhrOpen = XMLHttpRequest.prototype.open;
    var originalXhrSend = XMLHttpRequest.prototype.send;
    // 重写 XMLHttpRequest 的 open 方法
    XMLHttpRequest.prototype.open = function (method, url) {
        //console.log('发起网络请求:', method, url);

        // 保存请求URL
        this.__url = url;

        // 调用原始的 open 方法
        originalXhrOpen.apply(this, arguments);
    };
    // 重写 XMLHttpRequest 的 send 方法
    XMLHttpRequest.prototype.send = function (data) {
        var xhr = this;

        // 监听请求完成事件
        xhr.addEventListener('load', function () {
            // console.log('请求URL:', xhr.__url);
            // console.log('请求头:', xhr.getAllResponseHeaders());
            // console.log('响应内容:', xhr.responseText);
            if (xhr.responseType === 'arraybuffer') {
                // 处理 ArrayBuffer 类型的响应
                var arrayBuffer = xhr.response;
                // 在这里进行 ArrayBuffer 类型响应的处理
            } else {
                // 处理 text 类型的响应
                // console.log('响应内容:', xhr.responseText);
                数据判断(xhr.__url, xhr.responseText);
            }
        });

        // 调用原始的 send 方法
        originalXhrSend.apply(this, arguments);
    };
    // 监听 fetch 请求
    if (window.fetch) {
        var originalFetch = window.fetch;

        window.fetch = function (url, options) {
            console.log('发起网络请求:', url, options);

            // 调用原始的 fetch 方法
            return originalFetch.apply(this, arguments)
                .then(function (response) {
                    //console.log('响应URL:', response.url);
                    //console.log('响应头:', response.headers);
                    return response.text().then(function (text) {
                        //console.log('响应内容:', text);
                        数据判断(response.url, text);
                        return new Response(text, response);
                    });
                });
        };
    }
}

var js = [];
function 数据判断(url, data) {
    try {
        // // 判断是否包含有 "comment/page" 和 "cursor=" 的 URL 请求
        // console.log('响应链接', currentUrl);
        // // 判断是否包含有 "comment/page" 和 "cursor=" 的 URL 请求
        // console.log('请求链接:', currentUrl);
        // console.log('请求协议头:', xhr.getAllResponseHeaders());
        // console.log('Cookie:', document.cookie);
        // console.log('提交数据:', data);
        // console.log('响应数据:', xhr.responseText);
        console.dir(url)
        ///
        if (url.includes('/ajax/feed/groupstimeline?list_id=') || url.includes('ajax/feed/unreadfriendstimeline?list_id=')) {
            let statuses = JSON.parse(data).statuses
            statuses添加(statuses)
        }
        if (url.includes('friends?max_id=') || url.includes('feed/friends')) {
            let statuses = JSON.parse(data).data.statuses
            statuses添加(statuses)
        }
        if (url.includes('ajax/statuses/mymblog?uid=')) {
            let statuses = JSON.parse(data).data?.list
            statuses添加(statuses)
        }
        if (url.includes('container/getIndex')) {
            let json = JSON.parse(data)
            if (json.data?.cards?.length > 0) {
                cards = json.data?.cards;
                for (let index = 0; index < cards.length; index++) {
                    let mblog = cards[index].mblog;
                    if (mblog) {
                        js.push(mblog.retweeted_status || mblog);
                    } else {
                        const mblog = cards[index]?.card_group;
                        if (mblog?.length > 0) {
                            js.push(mblog[0].mblog.mblog || mblog);
                        }
                    }
                }
            }
        }
        //收藏视频
        if (url.includes('ajax/favorites/all_fav?uid=')) {
            let statuses = JSON.parse(data).data?.status
            statuses添加(statuses)
        }

        //喜欢的视频
        if (url.includes('ajax/favorites/all_fav?uid=')) {
            let statuses = JSON.parse(data).data?.list;
            statuses添加(statuses);
        }
        if (url.includes('ajax/statuses/show?id=')) {
            let statuses = JSON.parse(data);
            statuses添加(statuses, 1);
        }
        if (url.includes('statuses/show?id=')) {
            let statuses = JSON.parse(data).data;
            statuses添加(statuses);
        }
        //我的视频
        if (url.includes('profile/info?uid=')) {
            let statuses = JSON.parse(data).data.statuses;
            statuses添加(statuses);
        }
        //热门微博
        if (url.includes('/ajax/feed/hottimeline?refresh=2&group_id=')) {
            let statuses = JSON.parse(data).statuses;
            statuses添加(statuses);
        }
        //手机分组
        if (url.includes('/feed/group?gid=')) {
            let statuses = JSON.parse(data).data.statuses;
            statuses添加(statuses);
        }
        //手机榜单
        if (url.includes('/api/feed/trendtop?containerid=')) {
            let statuses = JSON.parse(data).data.statuses;
            statuses添加(statuses);
        }
        //手机关注
        if (url.includes('/feed/friends?=')) {
            let statuses = JSON.parse(data).data.statuses;
            statuses添加(statuses);
        }
        function statuses添加(statuses, 类型) {
            if (类型 === 1) {
                js.push(statuses);
            } else {
                if (statuses?.length > 0) {
                    for (let index = 0; index < statuses.length; index++) {
                        if (statuses[index].retweeted_status) {
                            js.push(statuses[index].retweeted_status);
                        } else {
                            js.push(statuses[index]);
                        }
                    }
                    console.log(js);
                }
            }

        }
    } catch (error) {
        console.log("错误信息", error);
    }

}

function 转换时间(inputDateString) {
    // 解析日期字符串
    const date = new Date(inputDateString);
    // 获取年、月、日、时、分、秒
    const year = date.getFullYear();
    const month = date.getMonth() + 1; // 月份是从0开始的,需要加1
    const day = date.getDate();
    const hours = date.getHours();
    const minutes = date.getMinutes();
    const seconds = date.getSeconds();
    // 格式化输出
    const formattedDate = `${year}-${month.toString().padStart(2, '0')}-${day.toString().padStart(2, '0')} ${hours.toString().padStart(2, '0')}${minutes.toString().padStart(2, '0')}${seconds.toString().padStart(2, '0')}`;
    return formattedDate;
}
(function () {
    'use strict';
})();
function 元素转DOM对象(data) {
    let htmlString = data;
    // 创建一个 DOMParser 实例
    let parser = new DOMParser();
    // 使用 DOMParser 的 parseFromString 方法将 HTML 文本解析为 DOM 对象
    return parser.parseFromString(htmlString, 'text/html');
}

var svg = `<svg viewBox="0 0 24 24" style="width: 18px; height: 18px;">
<g class="download"><path d="M3,14 v5 q0,2 2,2 h14 q2,0 2,-2 v-5 M7,10 l4,4 q1,1 2,0 l4,-4 M12,3 v11" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"></path></g>
<g class="completed"><path d="M3,14 v5 q0,2 2,2 h14 q2,0 2,-2 v-5 M7,10 l3,4 q1,1 2,0 l8,-11" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"></path></g>
<g class="loading"><circle cx="12" cy="12" r="10" fill="none" stroke="currentColor" stroke-width="4" opacity="0.4"></circle><path d="M12,2 a10,10 0 0 1 10,10" fill="none" stroke="#1DA1F2" stroke-width="4" stroke-linecap="round"></path></g>
<g class="failed"><circle cx="12" cy="12" r="11" fill="#f33" stroke="currentColor" stroke-width="2" opacity="0.8"></circle><path d="M14,5 a1,1 0 0 0 -4,0 l0.5,9.5 a1.5,1.5 0 0 0 3,0 z M12,17 a2,2 0 0 0 0,4 a2,2 0 0 0 0,-4" fill="#fff" stroke="none"></path></g>
</svg>`

QingJ © 2025

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