百度贴吧,显示回帖用户ID和关注

显示回帖用户ID,点击ID可显示用户关注贴吧等级

目前为 2024-11-12 提交的版本。查看 最新版本

// ==UserScript==
// @license      MIT
// @name         百度贴吧,显示回帖用户ID和关注
// @namespace    https://tieba.baidu.com/
// @version      0.1.1
// @description  显示回帖用户ID,点击ID可显示用户关注贴吧等级
// @author       你的名字
// @match        https://tieba.baidu.com/p/*
// @grant        GM_xmlhttpRequest
// ==/UserScript==

(function() {
    'use strict';

    window.addEventListener('load', function () {
        // 找到网页元素
        /**
     * <li class="d_name" data-field="{&quot;user_id&quot;:3809203561}">
     *     <span class="pre_icon_wrap pre_icon_wrap_theme1 d_name_icon"><a class="icon_tbworld icon-crown-vip" href="/tbmall/tshow" data-field="{&quot;user_id&quot;:3809203561}" target="_blank" title="贴吧会员"></a></span>
     *     <a data-field="{&quot;un&quot;:&quot;\u6211\u95f0\u571f\u627e\u7339sky&quot;,&quot;id&quot;:&quot;tb.1.c50b273.9zoRQw8GhVHDzDrdD3rCnQ?t=1555564950&quot;}" alog-group="p_author" title="该用户已经连续签到159天了,连续30天一举“橙”名" class="p_author_name sign_highlight j_user_card vip_red " href="/home/main?id=tb.1.c50b273.9zoRQw8GhVHDzDrdD3rCnQ?t=1555564950&amp;fr=pb" target="_blank">73<img src="//tb1.bdstatic.com/tb/cms/nickemoji/1-17.png" class="nicknameEmoji" style="width:13px;height:13px">氺</a>
     * </li>
     */
        var $userList = $("div.d_author > ul.p_author > li.d_name");
        var userDialog = addDialog();
        $userList.each(function (_, element) {
            var $element = $(element);
            var userInfo = $element.find("a.p_author_name");
            var userData = userInfo.attr("data-field");
            if (userData == null) {
                return;
            }
            var utfUserName = JSON.parse(userData).un;
            console.log(utfUserName);
            var idElement = document.createElement("span");
            idElement.textContent = "id: ".concat(utfUserName); // 将匹配到的作者名放入新创建的 <span> 元素
            addStyle(idElement);
            idElement.style.letterSpacing = "normal";
            var username = encodeURIComponent(utfUserName);
            $(idElement).on('click', function (event) {
                showDialog(userDialog, event);
                requestDataFrom82Tool(username, userDialog, event);
            });
            var brElement = document.createElement("br");
            // 使用 jQuery 的 .prepend() 方法将新的 <span> 插入到元素的开头
            $(element).prepend(brElement);
            $(element).prepend(idElement);
        });
    });
    function getSubscribeTable(responseText) {
        // 使用 jQuery 创建一个临时的 DOM 元素来解析 HTML
        var $doc = $(responseText);
        // 存储提取的所有数据
        var data = [];
        // 获取所有的 <tr> 元素
        $doc.find("tr").each(function () {
            var $cells = $(this).find("td");
            // 确保这行有足够的列
            if ($cells.length >= 3) {
                var name_1 = $cells.eq(0).text().trim(); // 第一列
                var levelText = $cells.eq(2).find(".badge").text().trim(); // 第三列
                // 提取等级数字
                var level = parseInt(levelText, 10);
                if (!isNaN(level)) {
                    // 将每一行的数据存储到数组
                    data.push({
                        name: name_1,
                        level: level
                    });
                }
            }
        });
        return data;
    }
    function buildTable(userList) {
        var tableContent = "<table border='1' style='width:100%;'><thead><tr><th>吧名</th><th>等级</th></tr></thead><tbody>";
        if (userList.length == 0) {
            tableContent += "\u65E0\u67E5\u8BE2\u7ED3\u679C";
        }
        else {
            // 按照等级倒序排序
            userList.sort(function (a, b) {
                return b.level - a.level; // 从大到小排序
            });
            // 输出排序后的结果
            userList.forEach(function (item) {
                // 添加到表格内容
                tableContent += "<tr><td>".concat(item.name, "</td><td>").concat(item.level, "</td></tr>");
            });
        }
        // 结束表格内容
        tableContent += "</tbody></table>";
        return tableContent;
    }
    function requestDataFrom82Tool(encodedUserName, userDialog, event) {
        GM_xmlhttpRequest({
            method: "GET", // 请求方法
            url: "https://www.82cat.com/tieba/forum/".concat(encodedUserName, "/1"), // 目标跨域 URL
            onload: function (response) {
                // 请求成功后的回调函数
                console.log("成功响应:", response.responseText);
                // 获取响应文本
                var responseText = response.responseText;
                var data = getSubscribeTable(responseText);
                // 填充对话框内容
                var replyUrl = document.createElement("a");
                replyUrl.href = "https://www.82cat.com/tieba/reply/".concat(encodedUserName, "/1");
                replyUrl.target = "_blank";
                replyUrl.textContent = "点击查看用户历史发言";
                userDialog.innerHTML = buildTable(data);
                userDialog.prepend(replyUrl);
            },
            onerror: function (error) {
                // 请求失败后的回调函数
                console.error("请求失败:", error);
            },
            ontimeout: function () {
                // 请求超时后的回调函数
                console.error("请求超时");
            }
        });
    }
    function addStyle(spanElement) {
        // 直接在 span 中添加内联样式
        spanElement.style.backgroundColor = "#f0f0f0"; // 背景色
        spanElement.style.borderRadius = "5px"; // 圆角效果
        spanElement.style.color = "#333"; // 字体颜色
        spanElement.style.fontWeight = "bold"; // 加粗字体
        spanElement.style.marginRight = "8px"; // 图标和文本的间距
        spanElement.style.display = "inline-block"; // 保证背景色包裹文本
    }
    function addDialog() {
        // 在页面上添加一个隐藏的对话框元素
        // 创建并样式化聊天框对话框
        var userDialog = document.createElement("div");
        userDialog.id = "82ToolDialog";
        userDialog.style.position = "absolute";
        userDialog.style.zIndex = "9999";
        userDialog.style.backgroundColor = "#fff";
        userDialog.style.border = "1px solid #ccc";
        userDialog.style.borderRadius = "10px";
        userDialog.style.padding = "10px";
        userDialog.style.boxShadow = "0 4px 6px rgba(0, 0, 0, 0.1)";
        userDialog.style.width = "300px"; // 设置聊天框宽度
        userDialog.style.display = "none"; // 初始隐藏
        document.body.appendChild(userDialog);
        // 点击对话框外部时隐藏对话框
        $(document).on("click", function (event) {
            if (!$(event.target).closest("#82ToolDialog").length && !$(event.target).closest("span").length) {
                userDialog.style.display = "none";
            }
        });
        return userDialog;
    }
    function addHref(userDialog) {
        var replyUrl = document.createElement("a");
        replyUrl.id = "82Reply";
        replyUrl.href = "#";
        replyUrl.target = "_blank";
        replyUrl.textContent = "点击查看用户历史发言";
        userDialog.appendChild(replyUrl);
    }
    function showDialog(userDialog, event) {
        // 获取鼠标位置
        var mouseX = event.clientX;
        var mouseY = event.clientY;
        // 获取页面的滚动距离
        var scrollY = window.scrollY || document.documentElement.scrollTop;
        // 计算聊天框的位置
        var chatBoxWidth = userDialog.offsetWidth;
        var chatBoxHeight = userDialog.offsetHeight;
        // 先隐藏当前的聊天框(如果已经显示)
        userDialog.style.display = "none";
        // 设置聊天框位置:将其放置在鼠标上方
        userDialog.style.left = mouseX - chatBoxWidth / 2 + "px"; // 水平居中
        userDialog.style.top = mouseY + scrollY - chatBoxHeight - 10 + "px"; // 垂直上移10px,距离鼠标有10px的偏移
        // 显示聊天框
        userDialog.style.display = "block";
    }


})();

QingJ © 2025

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