XHS-Downloader README

The project's README from github.com/JoeanAmier/XHS-Downloader. As one markdown file: README.md.

XHS-Downloader

XHS-Downloader

简体中文 | English

JoeanAmier%2FXHS-Downloader | Trendshift
GitHub GitHub forks GitHub Repo stars GitHub code size in bytes GitHub release (with filter)
Static Badge Static Badge Static Badge GitHub all releases

🔥 小红书(XiaoHongShu、RedNote)链接提取/作品采集工具!


📑 项目功能

项目程序与用户脚本功能清单,快速了解项目能力(点击展开)
    程序功能
  • ✅ 采集小红书作品信息
  • ✅ 提取小红书作品下载地址
  • ✅ 下载小红书作品文件
  • ✅ 下载视频作品封面文件
  • ✅ 下载小红书 livePhoto 文件
  • ✅ 自动跳过已下载的作品文件
  • ✅ 作品文件完整性处理机制
  • ✅ 自定义图文作品文件下载格式
  • ✅ 持久化储存作品信息至文件
  • ✅ 作品文件储存至单独文件夹
  • ✅ 后台监听剪贴板下载作品
  • ✅ 记录已下载作品 ID
  • ✅ 支持命令行下载作品文件
  • ☑️ 从浏览器读取 Cookie
  • ✅ 自定义文件名称格式
  • ✅ 支持 API 调用功能
  • ✅ 支持 MCP 调用功能
  • ✅ 支持文件断点续传下载
  • ✅ 智能识别作品文件类型
  • ✅ 支持设置作者备注
  • ✅ 自动更新作者昵称
    脚本功能
  • ✅ 下载小红书作品文件
  • ✅ 提取推荐页面作品链接
  • ✅ 提取账号发布作品链接
  • ✅ 提取账号收藏作品链接
  • ✅ 提取账号点赞作品链接
  • ✅ 提取账号专辑作品链接
  • ✅ 提取搜索结果作品链接
  • ✅ 提取搜索结果用户链接

📸 程序截图

前往 bilibili 观看演示;前往 YouTube 观看演示

GUI 界面截图


TUI 界面截图(模式命令:python .\main.py TUI)

🔗 支持链接

🥣 使用方法

如果仅需下载作品文件,建议选择 程序运行 或 Docker 运行;如果有其他需求,建议选择 源码运行!

⚠️ Cookie 配置为非强制项;如遇功能异常,建议配置或更新 Cookie 后再次尝试!

⚠️ 未设置 Cookie 时,视频作品只能下载低分辨率文件;建议配置 Cookie 以获取更高画质(无需登录账号)!

🖱 程序运行

⭐ Mac OS、Windows 10 及以上用户可前往 Releases 或者 Actions 下载程序压缩包,解压后打开程序文件夹,双击运行 main 即可使用。

⭐ 本项目包含自动构建可执行文件的 GitHub Actions,使用者可以随时使用 GitHub Actions 将最新源码构建为可执行文件!

⭐ 自动构建可执行文件教程请查阅本文档的 构建可执行文件指南 部分;如果需要更加详细的图文教程,请 查阅文章!

注意:由于 Mac OS 平台的可执行文件 main 未经过代码签名,首次运行时会受到系统安全限制。请先在终端执行 xattr -cr 项目文件夹路径 命令移除安全标记,执行一次后即可正常运行。

若通过此方式使用程序,文件默认下载路径为:.\Volume\Download;配置文件路径为:.\Volume\settings.json

程序更新

方案一:下载并解压文件,将旧版本的 Volume 文件夹复制到新版本的程序根目录。

方案二:下载并解压文件(不要运行程序),复制全部文件,直接覆盖旧版本文件。

⌨️ 源码运行

  1. 安装不低于 3.12 版本的 Python 解释器
  2. 下载最新的源码或 Releases 发布的源码至本地
    1. 使用 pip 安装项目依赖
    2. 运行 python -m venv venv 命令创建虚拟环境(可选)
    3. 运行 .\venv\Scripts\activate.ps1 或者 venv\Scripts\activate 命令激活虚拟环境(可选)
    4. 运行 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt 命令安装程序所需模块
    5. 运行 python .\main.py 或者 python main.py 命令启动 XHS-Downloader
      使用 uv 安装项目依赖(推荐)
    1. 运行 uv sync --no-dev 命令同步环境依赖
    2. 运行 uv run main.py 命令启动 XHS-Downloader

⌨️ Docker 运行

  1. 获取镜像
    • 方式一:使用 Dockerfile 文件构建镜像
    • 方式二:使用 docker pull joeanamier/xhs-downloader 命令拉取镜像
    • 方式三:使用 docker pull ghcr.io/joeanamier/xhs-downloader 命令拉取镜像
  2. 创建容器
    • TUI 模式:docker run --name 容器名称(可选) -p 主机端口号:5556 -v xhs_downloader_volume:/app/Volume -it <镜像名称>
    • API 模式:docker run --name 容器名称(可选) -p 主机端口号:5556 -v xhs_downloader_volume:/app/Volume -it <镜像名称> python main.py api
    • MCP 模式:docker run --name 容器名称(可选) -p 主机端口号:5556 -v xhs_downloader_volume:/app/Volume -it <镜像名称> python main.py mcp

    • 注意:此处的 <镜像名称> 需与您在第一步中使用的镜像名称保持一致(joeanamier/xhs-downloader 或 ghcr.io/joeanamier/xhs-downloader)
  3. 运行容器
    • 启动容器:docker start -i 容器名称/容器 ID
    • 重启容器:docker restart -i 容器名称/容器 ID

Docker 运行项目时不支持 命令行调用模式,无法使用 读取剪贴板 与 监听剪贴板 功能,可以正常粘贴内容,其他功能如有异常请反馈!

🛠 命令行模式

命令行模式说明,适合习惯命令行操作或需要脚本化调用的用户(点击展开)

项目支持命令行运行模式,可通过命令行参数直接下载作品文件,也可以设置需要下载的图片序号!

注意:未设置 --index 参数时,支持传入多个作品链接,全部链接需要使用引号包围,链接之间使用空格分隔;已设置 --index 参数时,不支持传入多个作品链接,即使传入多个作品链接,程序仅处理首个作品链接!

bool 类型参数支持使用 true、false、1、0、yes、no、on 或 off(不区分大小写)来设置。

从浏览器读取 Cookie

该功能已失效,请参考 获取 Cookie 教程!

可以使用命令行实现 从浏览器读取 Cookie 并写入配置文件!

命令示例:python .\main.py --browser_cookie Chrome --update_settings

兼容性提醒:此功能依赖的第三方模块已长期未更新,可能无法正常支持最新浏览器版本。若功能出现异常,请尝试手动获取 Cookie!



🖥 服务器模式

服务器模式包含 API 模式和 MCP 模式!

API 模式

API 模式说明,适合需要调用接口获取作品数据或下载文件的开发者(点击展开)

启动:运行命令:python .\main.py api

关闭:按下 Ctrl + C 关闭服务器

访问 http://127.0.0.1:5556/docs 或者 http://127.0.0.1:5556/redoc;你会看到自动生成的交互式 API 文档!

请求接口:/xhs/detail

请求方法:POST

请求格式:JSON

请求参数:

参数 类型 含义 默认值
url str 小红书作品链接,自动提取,不支持多链接;必需参数 无
download bool 是否下载作品文件;设置为 true 将会耗费更多时间;可选参数 false
index list[int] 下载指定序号的图片文件,仅对图文作品生效;download 参数设置为 false 时不生效;可选参数 null
cookie str 请求数据时使用的 Cookie;可选参数 配置文件 cookie 参数
proxy str 请求数据时使用的代理;可选参数 配置文件 proxy 参数
check_record bool 是否跳过已有下载记录的作品;可选参数 true

代码示例:

async def example_api():
    """通过 API 设置参数,适合二次开发"""
    server = "http://127.0.0.1:5556/xhs/detail"
    data = {
        "url": "",  # 必需参数
        "download": True,
        "index": [
            3,
            6,
            9,
        ],
        "proxy": "http://127.0.0.1:10808",
    }
    response = post(server, json=data, timeout=10)
    print(response.json())

MCP 模式

MCP 模式说明,适合需要启动 MCP 服务接入 AI 助手等工具的开发者(点击展开)

启动:运行命令:python .\main.py mcp

关闭:按下 Ctrl + C 关闭服务器

MCP 配置示例

Streamable HTTP

MCP URL:http://127.0.0.1:5556/mcp/

MCP配置示例

MCP 调用示例

获取小红书作品信息

MCP获取数据

下载小红书作品文件

下载图文作品时可以指定需要下载的图片序号;默认不返回作品信息,如需返回作品信息,请在对话时明确表述。

MCP下载文件
MCP下载文件

📜 其他说明

🕹 用户脚本

如果您的浏览器安装了 Tampermonkey 浏览器扩展程序,可以使用用户脚本体验项目功能!

用户脚本链接(右键单击复制链接):master 分支、develop 分支


查看 Tampermonkey 用户脚本截图(点击展开)


提示:使用 XHS-Downloader 用户脚本批量提取作品链接,搭配 XHS-Downloader 程序可以实现批量下载作品文件!

修改用户脚本语言

切换语言

🌏 连接服务器

⭐ 本项目支持通过浏览器用户脚本与主程序联动,实现一键推送下载任务。

📜 脚本说明

自动滚动页面功能代码已重构,该功能默认关闭!启用该功能可能会被小红书检测为自动化操作,从而导致账号受到风控或封禁风险!

💻 二次开发

二次开发代码示例,适合基于项目进行二次开发的开发者(点击展开)

如果有其他需求,可以根据 example.py 的注释提示进行代码调用或修改!

async def example():
    """通过代码设置参数,适合二次开发"""
    # 示例链接
    demo_link = "https://www.xiaohongshu.com/explore/XXX?xsec_token=XXX"
    # 实例对象
    work_path = "D:\\"  # 作品数据/文件保存根路径,默认值:项目根路径
    folder_name = "Download"  # 作品文件储存文件夹名称(自动创建),默认值:Download
    name_format = "作品标题 作品描述"
    impersonate = "chrome146"  # 浏览器模拟目标
    cookie = ""  # 小红书网页版 Cookie
    proxy = None  # 网络代理
    proxy_download = False  # 下载文件时,是否使用 proxy 参数的网络代理
    timeout = 5  # 请求数据超时限制,单位:秒
    chunk = 1024 * 1024 * 10  # 下载文件时,每次从服务器获取的数据块大小,单位:字节
    max_retry = 2  # 请求数据失败时,重试的最大次数,单位:次
    record_data = False  # 是否保存作品数据至文件
    image_format = "WEBP"  # 图文作品文件下载格式,支持:AUTO、PNG、WEBP、JPEG、HEIC
    folder_mode = False  # 是否将每个作品的文件储存至单独的文件夹
    image_download = True  # 图文、图集作品文件下载开关
    video_download = True  # 视频作品文件下载开关
    video_cover_download = False  # 视频作品封面文件下载开关
    live_download = False  # 图文动图文件下载开关
    download_record = True  # 是否记录下载成功的作品 ID
    language = "zh_CN"  # 设置程序提示语言
    author_archive = True  # 是否将每个作者的作品存至单独的文件夹
    write_mtime = True  # 是否将作品文件的 修改时间 修改为作品的发布时间
    note_format = ""  # 作品信息保存格式,支持:txt、md、all,为空则不保存
    # read_cookie = None  # 读取浏览器 Cookie,支持设置浏览器名称(字符串)或者浏览器序号(整数),设置为 None 代表不读取
    # async with XHS() as xhs:
    #     pass  # 使用默认参数
    async with XHS(
        work_path=work_path,
        folder_name=folder_name,
        name_format=name_format,
        impersonate=impersonate,
        cookie=cookie,
        proxy=proxy,
        proxy_download=proxy_download,
        timeout=timeout,
        chunk=chunk,
        max_retry=max_retry,
        record_data=record_data,
        image_format=image_format,
        folder_mode=folder_mode,
        image_download=image_download,
        video_download=video_download,
        video_cover_download=video_cover_download,
        live_download=live_download,
        download_record=download_record,
        language=language,
        # read_cookie=read_cookie,
        author_archive=author_archive,
        write_mtime=write_mtime,
        note_format=note_format,
    ) as xhs:  # 使用自定义参数
        download = True  # 是否下载作品文件,默认值:False
        # 返回作品详细信息,包括下载地址
        # 获取数据失败时返回空字典
        print(
            await xhs.extract(
                demo_link,
                download,
                index=[
                    1,
                    2,
                    5,
                ],
            )
        )

📋 读取剪贴板

读取剪贴板平台说明,适合 Windows 以外的用户(Mac / Linux)(点击展开)

项目使用 pyperclip 实现读取剪贴板功能,该模块在不同的系统上会有差异。

在 Windows 上,不需要额外的模块。

在 Mac 上,该模块使用 pbcopy 和 pbpaste 命令,这些命令应该随操作系统一起提供。

在 Linux 上,该模块使用 xclip 或 xsel 命令,这些命令应该随操作系统一起提供。否则,请运行 "sudo apt-get install xclip" 或 "sudo apt-get install xsel"(注意:xsel 似乎并不总是有效)

在其他 Linux 系统上,你需要安装 qtpy 或 PyQT5 模块。

⚙️ 配置文件

配置文件参数说明,适合需要直接修改程序配置参数的用户(点击展开)

项目根目录下的 ./Volume/settings.json 文件,首次运行自动生成,可以自定义程序运行参数;如果设置了无效的参数值,程序将会使用参数默认值!

如果您在程序界面修改配置时无法正常交互,可以直接编辑配置文件;如果您的计算机没有合适的程序编辑 JSON 文件,建议使用 在线工具 编辑配置文件内容,修改后需要重启软件才能生效。

参数 类型 含义 默认值
mapping_data str: str #作者别名映射表,格式:作者ID: 作者别名 无
work_path str 作品数据 / 文件保存根路径 项目根路径/Volume
folder_name str 作品文件储存文件夹名称 Download
name_format str 作品文件名称格式,字段之间使用空格分隔,支持字段:收藏数量、评论数量、分享数量、点赞数量、作品标签、作品ID、作品标题、作品描述、作品类型、发布时间、最后更新时间、作者昵称、作者ID 发布时间 作者昵称 作品标题
impersonate str 浏览器模拟目标;参考 curl_cffi 文档 chrome146
cookie str 小红书网页版 Cookie,无需登录,非必需参数! 无
proxy str 设置程序代理 null
proxy_download bool 下载文件时,是否使用 proxy 参数的网络代理 false
timeout int 请求数据超时限制,单位:秒 10
chunk int 下载文件时,每次从服务器获取的数据块大小,单位:字节 2097152(2 MB)
max_retry int 请求数据失败时,重试的最大次数,单位:秒 5
record_data bool 是否保存作品数据至 SQLite 数据库(所有作品统一保存) false
image_format str 图文作品文件下载格式,支持:AUTO、PNG、WEBP、JPEG、HEIC
部分作品没有 HEIC 格式的文件,此时下载的文件可能为 WEBP 格式!
设置为 AUTO 时表示动态格式,实际格式取决于服务器响应数据!
JPEG
image_download bool 图文、图集作品文件下载开关 true
video_download bool 视频作品文件下载开关 true
video_cover_download bool 视频作品封面下载开关;封面格式与图文作品文件格式一致 false
live_download bool 图文动图文件下载开关 false
video_preference str 视频作品文件下载偏好;含义:resolution:分辨率优先;bitrate:码率优先;size:文件大小优先 resolution
folder_mode bool 是否将每个作品的文件储存至单独的文件夹;文件夹名称与文件名称保持一致 false
download_record bool 是否记录下载成功的作品 ID,如果开启,程序将会自动跳过下载存在记录的作品 true
author_archive bool #是否将每个作者的作品储存至单独的文件夹;文件夹名称为 作者ID_作者昵称 false
write_mtime bool 是否将作品文件的 修改时间 属性修改为作品的发布时间 false
language str 设置程序语言,目前支持:zh_CN、en_US

XHS-Downloader (JoeanAmier/XHS-Downloader)

Searching Database…

这是什么?XHS-Downloader 是一款工具,可以从小红书(XiaoHongShu / RedNote)提取分享链接,并下载帖子中的内容,包括图片、视频、实况照片和封面。
它是桌面应用、命令行工具,还是服务器?以上都是。它是一个 Python 程序,可以作为 GUI/TUI 应用运行,也可以作为命令行工具使用,或作为 API/MCP 服务器运行。此外还配有一个 Tampermonkey 用户脚本,用于从小红书网站提取链接。
我该怎么让它运行起来?可以下载适用于 Mac OS 或 Windows 10 及以上版本的预编译可执行文件,也可以拉取 Docker 镜像(joeanamier/xhs-downloader),或者从源码运行:先执行 `pip install -r requirements.txt`(或 `uv sync`),再执行 `python main.py`。
从源码运行需要先安装什么?从源码运行需要 Python 3.12 或更高版本。Mac 和 Windows 的可执行文件不需要额外依赖;浏览器端则需要 Tampermonkey 用户脚本管理器。
不登录、也不设置 Cookie,能正常使用吗?Cookie 是可选的,但如果不设置,视频只能下载低分辨率版本。另外,“从浏览器读取 Cookie”功能目前无法使用,Docker 模式也不能使用基于剪贴板的命令行下载模式。
预编译应用支持哪些操作系统?预编译的可执行文件支持 Mac OS 和 Windows 10 及以上版本。Linux 及其他平台可以通过源码运行或 Docker 使用。
Tampermonkey 脚本会自己下载文件吗?不会。用户脚本只负责提取链接,或者通过 “scriptserver” 把下载任务推送给正在运行的程序。实际的下载和文件处理由主 Python 程序完成。
图文帖子可以保存为哪些图片格式?imageformat 设置支持 AUTO、PNG、WEBP、JPEG 和 HEIC,默认为 JPEG。当 HEIC 不可用时,会改用 WEBP。
我能在自己的代码里把它当作库来用吗?可以。example.py 中展示的异步 XHS 类允许你通过代码配置参数,并调用 xhs.extract(link, download=True),获取或下载帖子,便于做自定义集成。
它能和 AI 助手集成吗?可以。运行 `python main.py mcp` 会启动一个 MCP 服务器,AI 工具可以调用它获取帖子信息,或直接在聊天界面中触发下载。
Creator
JoeanAmier
Size
18.6 MB
Stars
13K
Age
3y
Commits · 90 Days