bai

百家号主页UID提取,隐藏图片,作品首次发布时间由相对时间改为绝对时间,解除复制限制(支持PC和移动端)

Bu betiği kurabilmeniz için Tampermonkey, Greasemonkey ya da Violentmonkey gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

Bu betiği yüklemek için Tampermonkey gibi bir uzantı yüklemeniz gerekir.

Bu betiği kurabilmeniz için Tampermonkey ya da Violentmonkey gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

Bu betiği kurabilmeniz için Tampermonkey ya da Userscripts gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

Bu betiği indirebilmeniz için ayrıca Tampermonkey gibi bir eklenti kurmanız gerekmektedir.

Bu komut dosyasını yüklemek için bir kullanıcı komut dosyası yöneticisi uzantısı yüklemeniz gerekecek.

(Zaten bir kullanıcı komut dosyası yöneticim var, kurmama izin verin!)

Bu stili yüklemek için Stylus gibi bir uzantı yüklemeniz gerekir.

Bu stili yüklemek için Stylus gibi bir uzantı kurmanız gerekir.

Bu stili yükleyebilmek için Stylus gibi bir uzantı yüklemeniz gerekir.

Bu stili yüklemek için bir kullanıcı stili yöneticisi uzantısı yüklemeniz gerekir.

Bu stili yüklemek için bir kullanıcı stili yöneticisi uzantısı kurmanız gerekir.

Bu stili yükleyebilmek için bir kullanıcı stili yöneticisi uzantısı yüklemeniz gerekir.

(Zateb bir user-style yöneticim var, yükleyeyim!)

// ==UserScript==
// @name         bai
// @namespace    http://tampermonkey.net/
// @version      2.1
// @description  百家号主页UID提取,隐藏图片,作品首次发布时间由相对时间改为绝对时间,解除复制限制(支持PC和移动端)
// @author       祝大家天天爆文! [email protected]
// @match        https://author.baidu.com/home/*
// @icon         https://www.baidu.com/favicon.ico
// @license      AGPL-3.0-only
// @grant        unsafeWindow
// @grant        GM_addStyle
// ==/UserScript==

(function() {
    'use strict';

    // 检测是否为移动端
    const isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) 
                     || window.innerWidth < 768;

    // PC端样式
    const pcStyles = `
        .pc-topbar{display:none !important}
        .s-col.s-col-4.sfi-article-cover{display:none !important}
        .s-col.s-col-4.s-right-img-texts-cover{display:none !important}
        .s-col.s-col-4.s-image-set-cover{display:none !important}
        .s-col.s-col-8.s-image-set-cover{display:none !important}
        .sfi-video-image{display:none !important}
        .s-row.s-row-flex.s-row-wrap.sfi-n-smallVideo.imgsize-1{display:none !important}
        .avatar{display:none !important}
        .operate-btn.chat{display:none !important}
        .s-subscribes.head.pc-user-uhFollow.operate-btn{display:none !important}
    `;

    // 移动端样式
    const mobileStyles = `
        /* 隐藏移动端顶部导航 */
        .wap-topbar, .m-topbar, header{display:none !important}
        
        /* 隐藏移动端所有图片封面 */
        .article-cover, .video-cover, .dynamic-cover{display:none !important}
        img[class*="cover"], img[class*="thumb"]{display:none !important}
        
        /* 隐藏移动端视频封面 */
        .video-img, .video-image, .m-video-cover{display:none !important}
        
        /* 隐藏移动端头像 */
        .avatar, .user-avatar, img[class*="avatar"]{display:none !important}
        
        /* 隐藏移动端按钮 */
        .follow-btn, .chat-btn, .subscribe-btn{display:none !important}
        
        /* 隐藏所有可能的图片容器 */
        [class*="image-wrapper"], [class*="img-container"]{display:none !important}
    `;

    // 应用对应平台的样式
    GM_addStyle(isMobile ? mobileStyles : pcStyles);

    // 时间格式化
    const formatTimestamp = (timestamp) => {
        const date = new Date(timestamp * 1000);
        const now = new Date();
        const pad = n => n.toString().padStart(2, '0');
        const year = date.getFullYear();
        const month = pad(date.getMonth() + 1);
        const day = pad(date.getDate());
        const hours = pad(date.getHours());
        const minutes = pad(date.getMinutes());

        return (year === now.getFullYear())
            ? `${month}-${day} ${hours}:${minutes}`
            : `${year}-${month}-${day} ${hours}:${minutes}`;
    };

    // PC端处理配置
    const pcTypeConfig = {
        article: {
            selector: '.sfi-article-subscript',
            timeIndex: 2,
            insertPosition: 'beforeend'
        },
        dynamic: {
            selector: '.sfi-dynamic-subscript',
            timeIndex: null,
            insertPosition: 'beforeend'
        },
        mainSmallVideo: {
            selector: '.sfi-n-smallVideo-subscript',
            timeIndex: null,
            insertPosition: 'beforeend'
        },
        video: {
            selector: '.sfi-video-subscript',
            timeIndex: 1,
            insertPosition: 'beforeend'
        },
        zhibo: {
            selector: '.sfi-live-subscript',
            timeIndex: 1,
            insertPosition: 'beforeend',
            extraProcess: (container) => {
                const liveTag = document.querySelector('.sfi-live-status-tag');
                if (liveTag) {
                    const viewers = liveTag.parentNode.textContent.match(/\d+/)?.[0] || '未知';
                    container.insertAdjacentHTML('afterbegin',
                        `<span>${liveTag.textContent}: ${viewers}人观看</span>`);
                    liveTag.parentNode.remove();
                }
            }
        }
    };

    // PC端处理器
    const processItemPC = (item) => {
        const itemType = item.getAttribute('itemtype')?.split('/').pop();
        const config = pcTypeConfig[itemType];
        if (!config) return;

        const container = item.querySelector(config.selector);
        if (!container) return;

        if (config.timeIndex !== null) {
            const timeSpan = container.children[config.timeIndex];
            const timestamp = item.children[0]?.getAttribute('publish_at');
            if (timeSpan && timestamp) {
                timeSpan.textContent = formatTimestamp(timestamp);
            }
        }

        const feedId = item.getAttribute('feed_id');
        if (feedId && !container.querySelector('[data-nid-added]')) {
            const nidSpan = document.createElement('span');
            nidSpan.textContent = `nid: ${feedId}`;
            nidSpan.dataset.nidAdded = true;
            nidSpan.style.cssText = 'color: #ff6b6b; font-weight: bold; margin-left: 10px;';
            container.insertAdjacentElement(config.insertPosition, nidSpan);
        }

        config.extraProcess?.(container);
    };

    // 移动端处理器
    const processItemMobile = (item) => {
        // 查找所有可能包含时间和信息的元素
        const timeSelectors = [
            '.time', '.publish-time', '.date',
            '[class*="time"]', '[class*="date"]',
            'time', 'span[class*="meta"]'
        ];

        let timeElement = null;
        for (const selector of timeSelectors) {
            timeElement = item.querySelector(selector);
            if (timeElement) break;
        }

        // 尝试提取feed_id或其他ID
        const feedId = item.getAttribute('data-feed-id') 
                    || item.getAttribute('feed_id')
                    || item.getAttribute('data-id')
                    || item.id;

        if (feedId && !item.querySelector('[data-nid-added]')) {
            const nidSpan = document.createElement('div');
            nidSpan.textContent = `nid: ${feedId}`;
            nidSpan.dataset.nidAdded = true;
            nidSpan.style.cssText = `
                color: #ff6b6b;
                font-weight: bold;
                font-size: 12px;
                margin-top: 5px;
                padding: 3px 8px;
                background: #fff3f3;
                border-radius: 4px;
                display: inline-block;
            `;

            // 尝试插入到合适的位置
            if (timeElement && timeElement.parentNode) {
                timeElement.parentNode.appendChild(nidSpan);
            } else {
                const contentArea = item.querySelector('.content, .article-content, [class*="content"]');
                if (contentArea) {
                    contentArea.appendChild(nidSpan);
                } else {
                    item.appendChild(nidSpan);
                }
            }
        }

        // 处理时间格式
        if (timeElement) {
            const timestamp = item.getAttribute('data-publish-time') 
                           || item.getAttribute('publish_at')
                           || item.getAttribute('data-time');
            
            if (timestamp) {
                timeElement.textContent = formatTimestamp(timestamp);
            }
        }
    };

    // 主处理函数
    const processItem = (item) => {
        if (isMobile) {
            processItemMobile(item);
        } else {
            processItemPC(item);
        }
    };

    // 通用选择器(适配PC和移动端)
    const itemSelectors = [
        '[itemtype]',              // PC端
        '[data-feed-id]',          // 移动端可能的选择器
        '.article-item',           // 通用文章项
        '.video-item',             // 通用视频项
        '[class*="feed-item"]',    // 包含feed-item的类
        '[class*="content-item"]'  // 包含content-item的类
    ];

    // DOM监听器
    const observer = new MutationObserver(mutations => {
        mutations.forEach(mutation => {
            mutation.addedNodes.forEach(node => {
                if (node.nodeType === 1) {
                    // 检查是否匹配任何一个选择器
                    for (const selector of itemSelectors) {
                        if (node.matches && node.matches(selector)) {
                            processItem(node);
                            break;
                        }
                    }
                    
                    // 也检查子元素
                    itemSelectors.forEach(selector => {
                        node.querySelectorAll?.(selector).forEach(processItem);
                    });
                }
            });
        });
    });

    // 初始化
    const init = () => {
        console.log(`[百家号助手] 运行模式: ${isMobile ? '移动端' : 'PC端'}`);
        
        // 处理已存在的元素
        itemSelectors.forEach(selector => {
            document.querySelectorAll(selector).forEach(processItem);
        });

        // 开始监听
        observer.observe(document.body, {
            childList: true,
            subtree: true
        });

        // 额外隐藏所有图片(兜底方案)
        setTimeout(() => {
            document.querySelectorAll('img').forEach(img => {
                if (!img.alt?.includes('icon') && !img.src?.includes('icon')) {
                    img.style.display = 'none';
                }
            });
        }, 1000);
    };

    // 等待页面加载完成
    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', init);
    } else {
        init();
    }

})();