某书笔记采集器

采集某书笔记信息的工具

Чтобы установить этот скрипт, вы сначала должны установить расширение браузера, например Tampermonkey, Greasemonkey или Violentmonkey.

Для установки этого скрипта вам необходимо установить расширение, такое как Tampermonkey.

Чтобы установить этот скрипт, вы сначала должны установить расширение браузера, например Tampermonkey или Violentmonkey.

Чтобы установить этот скрипт, вы сначала должны установить расширение браузера, например Tampermonkey или Userscripts.

Чтобы установить этот скрипт, сначала вы должны установить расширение браузера, например Tampermonkey.

Чтобы установить этот скрипт, вы должны установить расширение — менеджер скриптов.

(у меня уже есть менеджер скриптов, дайте мне установить скрипт!)

Чтобы установить этот стиль, сначала вы должны установить расширение браузера, например Stylus.

Чтобы установить этот стиль, сначала вы должны установить расширение браузера, например Stylus.

Чтобы установить этот стиль, сначала вы должны установить расширение браузера, например Stylus.

Чтобы установить этот стиль, сначала вы должны установить расширение — менеджер стилей.

Чтобы установить этот стиль, сначала вы должны установить расширение — менеджер стилей.

Чтобы установить этот стиль, сначала вы должны установить расширение — менеджер стилей.

(у меня уже есть менеджер стилей, дайте мне установить скрипт!)

// ==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();
})();