Greasy Fork

Greasy Fork is available in English.

小红书帖子内容下载为TXT

在页面右上角添加按钮,点击后提取帖子内容并下载为TXT文件

// ==UserScript==
// @name         小红书帖子内容下载为TXT
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  在页面右上角添加按钮,点击后提取帖子内容并下载为TXT文件
// @author       schweigen
// @match        *://*.xiaohongshu.com/*
// @grant        none
// @run-at       document-end
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    // 创建右上角下载按钮
    const downloadBtn = document.createElement("button");
    downloadBtn.innerText = "下载帖子TXT";
    // 设置按钮样式(固定定位于右上角)
    Object.assign(downloadBtn.style, {
        position: "fixed",
        top: "10px",
        right: "10px",
        zIndex: "9999",
        padding: "8px 12px",
        backgroundColor: "#007bff",
        color: "#fff",
        border: "none",
        borderRadius: "4px",
        cursor: "pointer",
        boxShadow: "0 2px 6px rgba(0,0,0,0.2)"
    });
    document.body.appendChild(downloadBtn);

    // 从帖子中提取内容文本的函数
    function extractPostContent() {
        // 尝试获取帖子主体所在的容器
        const descContainer = document.getElementById("detail-desc");
        if (!descContainer) {
            alert("未找到帖子内容,请确认页面已加载完毕!");
            return null;
        }
        // 这里直接取 innerText,包含了所有的文本信息
        return descContainer.innerText || descContainer.textContent;
    }

    // 点击按钮时执行下载动作
    downloadBtn.addEventListener("click", function() {
        const content = extractPostContent();
        if (!content) return;

        // 创建一个 Blob 对象保存文本内容
        const blob = new Blob([content], { type: "text/plain;charset=utf-8" });
        // 动态创建一个临时链接用于下载
        const downloadLink = document.createElement("a");
        downloadLink.href = URL.createObjectURL(blob);
        // 文件名可以使用页面标题或固定名称
        const filename = (document.title || "xiaohongshu_post") + ".txt";
        downloadLink.download = filename;
        document.body.appendChild(downloadLink);
        downloadLink.click();
        document.body.removeChild(downloadLink);

        // 释放 URL 对象
        setTimeout(() => {
            URL.revokeObjectURL(downloadLink.href);
        }, 1000);
    });
})();