某书笔记采集器

采集某书笔记信息的工具

Na nainštalovanie skriptu si budete musieť nainštalovať rozšírenie, ako napríklad Tampermonkey, Greasemonkey alebo Violentmonkey.

Na inštaláciu tohto skriptu je potrebné nainštalovať rozšírenie, ako napríklad Tampermonkey.

Na nainštalovanie skriptu si budete musieť nainštalovať rozšírenie, ako napríklad Tampermonkey, % alebo Violentmonkey.

Na nainštalovanie skriptu si budete musieť nainštalovať rozšírenie, ako napríklad Tampermonkey alebo Userscripts.

Na inštaláciu tohto skriptu je potrebné nainštalovať rozšírenie, ako napríklad Tampermonkey.

Na inštaláciu tohto skriptu je potrebné nainštalovať rozšírenie správcu používateľských skriptov.

(Už mám správcu používateľských skriptov, nechajte ma ho nainštalovať!)

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie, ako napríklad Stylus.

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie, ako napríklad Stylus.

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie, ako napríklad Stylus.

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie správcu používateľských štýlov.

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie správcu používateľských štýlov.

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie správcu používateľských štýlov.

(Už mám správcu používateľských štýlov, nechajte ma ho nainštalovať!)

// ==UserScript==
// @name         某书笔记采集器
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  采集某书笔记信息的工具
// @author       Your name
// @match        *://*.xiaohongshu.com/*
// @grant        none
// @require      https://code.jquery.com/jquery-3.6.0.min.js
// ==/UserScript==

(function() {
    'use strict';

    // 添加样式
    const style = `
        #collector-panel {
            position: fixed;
            left: 20px;
            top: 50%;
            transform: translateY(-50%);
            background: white;
            border: 1px solid black;
            padding: 10px;
            z-index: 9999;
            width: 300px;
            border-radius: 5px;
        }
        #collector-count {
            margin-bottom: 10px;
            font-weight: bold;
        }
        #collected-data {
            width: 100%;
            height: 200px;
            margin-bottom: 10px;
            resize: vertical;
        }
        .collector-btn {
            margin: 5px;
            padding: 5px 10px;
            cursor: pointer;
        }
         #collector-count1 {
            margin-bottom: 10px;
            font-weight: bold;
        }

    `;

    $('<style>').text(style).appendTo('head');

    // 创建采集面板
    const panel = `
        <div id="collector-panel">
            <div id="collector-count1">小某书采集器</div>
            <div id="collector-count">已采集: 0条数据</div>
            <textarea id="collected-data" readonly></textarea>
            <button class="collector-btn" id="copy-btn">复制数据</button>
            <button class="collector-btn" id="reset-btn">重新开始</button>
        </div>
    `;

    $('body').append(panel);

    let collectedData = [];
    let processedUrls = new Set();

    // 复制数据到剪贴板
    $('#copy-btn').click(function() {
        const textarea = document.getElementById('collected-data');
        textarea.select();
        document.execCommand('copy');
        alert('数据已复制到剪贴板!');
    });

    // 重置数据
    $('#reset-btn').click(function() {
        collectedData = [];
        processedUrls = new Set();
        updateDisplay();
        alert('数据已重置!');
    });

    // 更新显示
    function updateDisplay() {
        $('#collector-count').text(`已采集: ${collectedData.length}条数据`);
        // 添加表头
        const header = '作者\t标题\t点赞数\t详情页URL\n';
        const formattedData = header + collectedData.map(item =>
            `${item.author}\t${item.title}\t${item.likes}\t${item.url}`
        ).join('\n');
        $('#collected-data').val(formattedData);
    }

    // 采集数据
    function collectData() {
        $('.note-item').each(function() {
            const $item = $(this);
            const url = $item.find('a.cover').attr('href');

            if (!url || processedUrls.has(url)) return;
            processedUrls.add(url);

            const data = {
                author: $item.find('.author .name').text().trim(),
                title: $item.find('a.title span').text().trim(),
                likes: $item.find('.like-wrapper .count').text().trim(),
                url: 'https://www.xiaohongshu.com' + url
            };

            // 检查数据是否完整
            if (data.author && data.title) {
                collectedData.push(data);
                updateDisplay();
            }
        });
    }

    // 监听DOM变化
    const observer = new MutationObserver((mutations) => {
        collectData();
    });

    observer.observe(document.body, {
        childList: true,
        subtree: true
    });

    // 初始采集
    collectData();
})();