{"repo":"JoeanAmier/XHS-Downloader","free":true,"listed":false,"github":"https://github.com/JoeanAmier/XHS-Downloader","clone":"git clone https://github.com/JoeanAmier/XHS-Downloader.git","description":"小红书（XiaoHongShu、RedNote）链接提取/作品采集工具：提取账号发布、收藏、点赞、专辑作品链接；提取搜索结果作品、用户链接；采集小红书作品信息；提取小红书作品下载地址；下载小红书作品文件","language":"JavaScript","stars":12372,"topics":["api","docker","downloader","fastapi","httpx","javascript","json","linux","macos","mcp-server","pyinstaller","python","rednote","server","sqlite","tampermonkey","textual","userscript","windows","xiaohongshu"],"license":"GPL-3.0","category":"scraper","readme_excerpt":"<div align=\"center\">\n<img src=\"static/XHS-Downloader.png\" alt=\"XHS-Downloader\" height=\"256\" width=\"256\"><br>\n<h1>XHS-Downloader</h1>\n<p>简体中文 | <a href=\"README_EN.md\">English</a></p>\n<a href=\"https://trendshift.io/repositories/5435\" target=\"_blank\"><img src=\"https://trendshift.io/api/badge/repositories/5435\" alt=\"JoeanAmier%2FXHS-Downloader | Trendshift\" style=\"width: 250px; height: 55px;\" width=\"250\" height=\"55\"/></a>\n<br>\n<img alt=\"GitHub\" src=\"https://img.shields.io/github/license/JoeanAmier/XHS-Downloader?style=flat-square\">\n<img alt=\"GitHub forks\" src=\"https://img.shields.io/github/forks/JoeanAmier/XHS-Downloader?style=flat-square&color=55efc4\">\n<img alt=\"GitHub Repo stars\" src=\"https://img.shields.io/github/stars/JoeanAmier/XHS-Downloader?style=flat-square&color=fda7df\">\n<img alt=\"GitHub code size in bytes\" src=\"https://img.shields.io/github/languages/code-size/JoeanAmier/XHS-Downloader?style=flat-square&color=a29bfe\">\n<img alt=\"GitHub release (with filter)\" src=\"https://img.shields.io/github/v/release/JoeanAmier/XHS-Downloader?style=flat-square&color=48dbfb\">\n<br>\n<img alt=\"Static Badge\" src=\"https://img.shields.io/badge/Python-3.12-b8e994?style=flat-square&logo=python&labelColor=3dc1d3\">\n<img alt=\"Static Badge\" src=\"https://img.shields.io/badge/UserScript-ffec3d?style=flat-square&logo=tampermonkey&logoColor=%2300485B\">\n<img src=\"https://img.shields.io/badge/Sourcery-enabled-884898?style=flat-square&color=1890ff\" alt=\"\">\n<img alt=\"Static Badge\" src=\"https://img.shields.io/badge/Docker-badc58?style=flat-square&logo=docker\">\n<img alt=\"GitHub all releases\" src=\"https://img.shields.io/github/downloads/JoeanAmier/XHS-Downloader/total?style=flat-square&color=ffdd59\">\n</div>\n<br>\n<p>🔥 <b>小红书链接提取/作品采集工具</b>：提取账号发布、收藏、点赞、专辑作品链接；提取搜索结果作品链接、用户链接；采集小红书作品信息；提取小红书作品下载地址；下载小红书作品文件！</p>\n<p>🔥 “小红书”、“XiaoHongShu”、“RedNote” 含义相同，本项目统称为 “小红书”</p>\n<h1>📑 项目功能</h1>\n<details>\n<summary>项目程序与用户脚本功能清单（点击展开）</summary>\n<ul><b>程序功能</b>\n<li>✅ 采集小红书作品信息</li>\n<li>✅ 提取小红书作品下载地址</li>\n<li>✅ 下载小红书作品文件</li>\n<li>✅ 下载小红书 livePhoto 文件</li>\n<li>✅ 自动跳过已下载的作品文件</li>\n<li>✅ 作品文件完整性处理机制</li>\n<li>✅ 自定义图文作品文件下载格式</li>\n<li>✅ 持久化储存作品信息至文件</li>\n<li>✅ 作品文件储存至单独文件夹</li>\n<li>✅ 后台监听剪贴板下载作品</li>\n<li>✅ 记录已下载作品 ID</li>\n<li>✅ 支持命令行下载作品文件</li>\n<li>☑️ 从浏览器读取 Cookie</li> \n<li>✅ 自定义文件名称格式</li> \n<li>✅ 支持 API 调用功能</li>\n<li>✅ 支持 MCP 调用功能</li>\n<li>✅ 支持文件断点续传下载</li>\n<li>✅ 智能识别作品文件类型</li>\n<li>✅ 支持设置作者备注</li>\n<li>✅ 自动更新作者昵称</li>\n</ul>\n<ul><a href=\"#user-scripts\"><b>脚本功能</b></a>\n<li>✅ 下载小红书作品文件</li>\n<li>✅ 提取推荐页面作品链接</li>\n<li>✅ 提取账号发布作品链接</li>\n<li>✅ 提取账号收藏作品链接</li>\n<li>✅ 提取账号点赞作品链接</li>\n<li>✅ 提取账号专辑作品链接</li>\n<li>✅ 提取搜索结果作品链接</li>\n<li>✅ 提取搜索结果用户链接</li>\n</ul>\n</details>\n<h1>📸 程序截图</h1>\n<p><a href=\"https://www.bilibili.com/video/BV1Fcb3zWEjt/\">前往 bilibili 观看演示</a>；<a href=\"https://youtu.be/VIjDytHaopg\">前往 YouTube 观看演示</a></p>\n<img src=\"static/screenshot/程序运行截图CN1.png\" alt=\"\">\n<hr>\n<img src=\"static/screenshot/程序运行截图CN2.png\" alt=\"\">\n<hr>\n<img src=\"static/screenshot/程序运行截图CN3.png\" alt=\"\">\n<h1>🔗 支持链接</h1>\n<ul>\n<li><code>https://www.xiaohongshu.com/explore/作品ID?xsec_token=XXX</code></li>\n<li><code>https://www.xiaohongshu.com/discovery/item/作品ID?xsec_token=XXX</code></li>\n<li><code>https://www.xiaohongshu.com/user/profile/作者ID/作品ID?xsec_token=XXX</code></li>\n<li><code>https://xhslink.com/分享码</code></li>\n<br/>\n<p><b>支持单次输入多个作品链接，链接之间使用空格分隔；程序会自动提取有效链接，无需额外处理！</b></p>\n</ul>\n<h1>🪟 关于终端</h1>\n<p>⭐ 推荐使用 <a href=\"https://learn.microsoft.com/zh-cn/windows/terminal/install\">Windows 终端</a> （Windows 11 默认终端）运行程序以便获得最佳显示效果！</p>\n<h1>🥣 使用方法</h1>\n<p>如果仅需下载作品文件，建议选择 <b>程序运行</b> 或 <b>Docker 运行</b>；如果有其他需求，建议选择 <b>源码运行</b>！</p>\n<p>⚠️ Cookie 配置为非强制项；如遇功能异常，建议配置或更新 Cookie 后再次尝试！</p>\n<p>⚠️ 未设置 Cookie 时，视频作品只能下载低分辨率文件；建议配置 Cookie 以获取更高画质（无需登录账号）！</p>\n<h2>🖱 程序运行</h2>\n<p>⭐ Mac OS、Windows 10 及以上用户可前往 <a href=\"https://github.com/JoeanAmier/XHS-Downloader/releases/latest\">Releases</a> 或者 <a href=\"https://github.com/JoeanAmier/XHS-Downloader/actions\">Actions</a> 下载程序压缩包，解压后打开程序文件夹，双击运行 <code>main</code> 即可使用。</p>\n<p>⭐ 本项目包含自动构建可执行文件的 GitHub Actions，使用者可以随时使用 GitHub Actions 将最新源码构建为可执行文件！</p>\n<p>⭐ 自动构建可执行文件教程请查阅本文档的 <code>构建可执行文件指南</code> 部分；如果需要更加详细的图文教程，请 <a href=\"https://mp.weixin.qq.com/s/TorfoZKkf4-x8IBNLImNuw\">查阅文章</a>！</p>\n<p><strong>注意：由于 Mac OS 平台的可执行文件 <code>main</code> 未经过代码签名，首次运行时会受到系统安全限制。请先在终端执行 <code>xattr -cr 项目文件夹路径</code> 命令移除安全标记，执行一次后即可正常运行。</strong></p>\n<p>若通过此方式使用程序，文件默认下载路径为：<code>.\\_internal\\Volume\\Download</code>；配置文件路径为：<code>.\\_internal\\Volume\\settings.json</code></p>\n<h3>程序更新</h3>\n<p><strong>方案一：</strong>下载并解压文件，将旧版本的 <code>_internal\\Volume</code> 文件夹复制到新版本的 <code>_internal</code> 文件夹。</p>\n<p><strong>方案二：</strong>下载并解压文件（不要运行程序），复制全部文件，直接覆盖旧版本文件。</p>\n<h2>⌨️ 源码运行</h2>\n<ol>\n<li>安装不低于 <code>3.12</code> 版本的 <a href=\"https://www.python.org/\">Python</a> 解释器</li>\n<li>下载最新的源码或 <a href=\"https://github.com/JoeanAmier/XHS-Downloader/releases/latest\">Releases</a> 发布的源码至本地</li>\n<ol><b>使用 pip 安装项目依赖</b>\n<li>运行 <code>python -m venv venv</code> 命令创建虚拟环境（可选）</li>\n<li>运行 <code>.\\venv\\Scripts\\activate.ps1</code> 或者 <code>venv\\Scripts\\activate</code> 命令激活虚拟环境（可选）</li>\n<li>运行 <code>pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt</code> 命令安装程序所需模块</li>\n<li>运行 <code>python .\\main.py</code> 或者 <code>python main.py</code> 命令启动 XHS-Downloader</li>\n</ol>\n<ol><b>使用 uv 安装项目依赖（推荐）</b>\n<li>运行 <code>uv sync --no-dev</code> 命令同步环境依赖</li>\n<li>运行 <code>uv run main.py</code> 命令启动 XHS-Downloader</li>\n</ol>\n</ol>\n<h2>⌨️ Docker 运行</h2>\n<ol>\n<li>获取镜像</li>\n<ul>\n<li>方式一：使用 <code>Dockerfile</code> 文件构建镜像</li>\n<li>方式二：使用 <code>docker pull joeanamier/xhs-downloader</code> 命令拉取镜像</li>\n<li>方式三：使用 <code>docker pull ghcr.io/joeanamier/xhs-downloader</code> 命令拉取镜像</li>\n</ul>\n<li>创建容器</li>\n<ul>\n<li>TUI 模式：<code>docker run --name 容器名称(可选) -p 主机端口号:5556 -v xhs_downloader_volume:/app/Volume -it &lt;镜像名称&gt;</code></li>\n<li>API 模式：<code>docker run --name 容器名称(可选) -p 主机端口号:5556 -v xhs_downloader_volume:/app/Volume -it &lt;镜像名称&gt; python main.py api</code></li>\n<li>MCP 模式：<code>docker run --name 容器名称(可选) -p 主机端口号:5556 -v xhs_downloader_volume:/app/Volume -it &lt;镜像名称&gt; python main.py mcp</code></li>\n<br><b>注意：</b>此处的 <code>&lt;镜像名称&gt;</code> 需与您在第一步中使用的镜像名称保持一致（<code>joeanamier/xhs-downloader</code> 或 <code>ghcr.io/joeanamier/xhs-downloader</code>）\n</ul>\n<li>运行容器\n<ul>\n<li>启动容器：<code>docker start -i 容器名称/容器 ID</code></li>\n<li>重启容器：<code>docker restart -i 容器名称/容器 ID</code></li>\n</ul>\n</li>\n</ol>\n<p>Docker 运行项目时不支持 <b>命令行调用模式</b>，无法使用 <b>读取剪贴板</b> 与 <b>监听剪贴板</b> 功能，可以正常粘贴内容，其他功能如有异常请反馈！</p>\n<h1>🛠 命令行模式</h1>\n<p>项目支持命令行运行模式，若想要下载图文作品的部分图片，可以使用此模式设置需要下载的图片序号！</p>\n<p><strong>注意：</strong>未设置 <code>--index</code> 参数时，支持传入多个作品链接，全部链接需要使用引号包围，链接之间使用空格分隔；已设置 <code>--index</code> 参数时，不支持传入多个作品链接，即使传入多个作品链接，程序仅处理首个作品链接！</p>\n<p><code>bool</code> 类型参数支持使用 <code>true</code>、<code>false</code>、<code>1</code>、<code>0</code>、<code>yes</code>、<code>no</code>、<code>on</code> 或 <code>off</code>（不区分大小写）来设置。</p>\n<h2>从浏览器读取 Cookie</h2>\n<p>该功能已失效，请参考 <a href=\"#cookie\">获取 Cookie</a> 教程！</p>\n<p><del>可以使用命令行实现 <b>从浏览器读取 Cookie 并写入配置文件！</b></del></p>\n<p><del>命令示例：<code>python .\\main.py --browser_cookie Chrome --update_settings</code></del></p>\n<p><del>兼容性提醒：此功能依赖的第三方模块已长期未更新，可能无法正常支持最新浏览器版本。若功能出现异常，请尝试手动获取 Cookie！</del></p>\n<hr>\n<img src=\"static/screenshot/命令行模式截图CN1.png\" alt=\"\">\n<hr>\n<img src=\"static/screenshot/命令行模式截图CN2.png\" alt=\"\">\n<h1>🖥 服务器模式</h1>\n<p>服务器模式包含 API 模式和 MCP 模式！</p>\n<h2>API 模式</h2>\n<p><b>启动：</b>运行命令：<code>python .\\main.py api</code></p>\n<p><b>关闭：</b>按下 <code>Ctrl</code> + <code>C</code> 关闭服务器</p>\n<p>访问 <code>http://127.0.0.1:5556/docs</code> 或者 <code>http://127.0.0.1:5556/redoc</code>；你会看到自动生成的交互式 API 文档！</p>\n<p><b>请求接口：</b><code>/xhs/detail</code></p>\n<p><b>请求方法：</b><code>POST</code></p>\n<p><b>请求格式：</b><code>JSON</code></p>\n<p><b>请求参数：</b></p>\n<table>\n<thead>\n<tr>\n<th align=\"center\">参数</th>\n<th align=\"center\">类型</th>\n<th align=\"center\">含义</th>\n<th align=\"center\">默认值</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td align=\"center\">url</td>\n<td align=\"center\">str</td>\n<td align=\"center\">小红书作品链接，自动提取，不支持多链接；必需参数</td>\n<td align=\"center\">无</td>\n</tr>\n<tr>\n<td align=\"center\">download</td>\n<td align=\"center\">bool</td>\n<td align=\"center\">是否下载作品文件；设置为 <code>true</code> 将会耗费更多时间；可选参数</td>\n<td align=\"center\">false</td>\n</tr>\n<tr>\n<td align=\"center\">index</td>\n<td align=\"center\">list[int]</td>\n<td align=\"center\">下载指定序号的图片文件，仅对图文作品生效；<code>download</code> 参数设置为 <code>false</code> 时不生效；可选参数</td>\n<td align=\"center\">null</td>\n</tr>\n<tr>\n<td align=\"center\">cookie</td>\n<td align=\"center\">str</td>\n<td align=\"center\">请求数据时使用的 Cookie；可选参数</td>\n<td align=\"center\">配置文件 cookie 参数</td>\n</tr>\n<tr>\n<td align=\"center\">proxy</td>\n<td align=\"center\">str</td>\n<td align=\"center\">请求数据时使用的代理；可选参数</td>\n<td align=\"center\">配置文件 proxy 参数</td>\n</tr>\n<tr>\n<td align=\"center\">skip</td>\n<td align=\"center\">bool</td>\n<td align=\"center\">是否跳过存在下载记录的作品；设置为 <code>true</code> 将不会返回存在下载记录的作品数据；可选参数</td>\n<td align=\"center\">false</td>\n</tr>\n</tbody>\n</table>\n<p><b>代码示例：</b></p>\n<pre>\nasync def example_api():\n    \"\"\"通过 API 设置参数，适合二次开发\"\"\"\n    server = \"http://127.0.0.1:5556/xhs/detail\"\n    data = {\n        \"url\": \"\",  # 必需参数\n        \"download\": True,\n        \"index\": [\n            3,\n            6,\n            9,\n        ],\n        \"proxy\": \"http://127.0.0.1:10808\",\n    }\n    response = post(server, json=data, timeout=10)\n    print(response.json())\n</pre>\n<h2>MCP 模式</h2>\n<p><b>启动：</b>运行命令：<code>python .\\main.py mcp</code></p>\n<p><b>关闭：</b>按下 <code>Ctrl</code> + <code>C</code> 关闭服务器</p>\n<h3>MCP 配置示例</h3>\n\n[//]: # (<h4>STDIO</h4>)\n<h4>Streamable HTTP</h4>\n<p><b>MCP URL：</b><code>http://127.0.0.1:5556/mcp/</code></p>\n<img src=\"static/screenshot/MCP配置示例.png\" alt=\"MCP配置示例\">\n<h3>MCP 调用示例</h3>\n<details>\n<summary>MCP 功能及调用示例（点击展开）</summary>\n<h4><strong>获取小红书作品信息</strong></h4>\n<img src=\"static/screenshot/MCP获取数据.png\" alt=\"MCP获取数据\">\n<hr>\n<h4><strong>下载小红书作品文件</strong></h4>\n<p>下载图文作品时可以指定需要下载的图片序号；默认不返回作品信息，如需返回作品信息，请在对话时明确表述。</p>\n<img src=\"static/screenshot/MCP下载文件1.png\" alt=\"MCP下载文件\">\n<hr>\n<img s","default_branch":"master","files":108,"tree":[".github/ISSUE_TEMPLATE/bug_report.md",".github/ISSUE_TEMPLATE/feature_request.md",".github/dependabot.yml",".github/workflows/Close_Stale_Issues_and_PRs.yaml",".github/workflows/Delete_untagged_images.yml",".github/workflows/Manually_build_executable_programs.yml",".github/workflows/Manually_docker_image.yml",".github/workflows/Release_build_executable_program.yml",".github/workflows/Release_docker_image.yml",".gitignore",".python-version","Dockerfile","LICENSE","README.md","README_EN.md","example.py","locale/README.md","locale/en_US/LC_MESSAGES/xhs.mo","locale/en_US/LC_MESSAGES/xhs.po","locale/generate_path.py","locale/po_to_mo.py","locale/xhs.pot","locale/zh_CN/LC_MESSAGES/xhs.mo","locale/zh_CN/LC_MESSAGES/xhs.po","main.py","pyproject.toml","requirements.txt","setup.py","source/CLI/__init__.py","source/CLI/main.py","source/TUI/__init__.py","source/TUI/about.py","source/TUI/app.py","source/TUI/index.py","source/TUI/loading.py","source/TUI/monitor.py","source/TUI/progress.py","source/TUI/record.py","source/TUI/setting.py","source/TUI/update.py","source/__init__.py","source/application/__init__.py","source/application/app.py","source/application/download.py","source/application/explore.py","source/application/image.py","source/application/request.py","source/application/user_posted.py","source/application/video.py","source/expansion/__init__.py","source/expansion/browser.py","source/expansion/cleaner.py","source/expansion/converter.py","source/expansion/error.py","source/expansion/file_folder.py","source/expansion/namespace.py","source/expansion/pyi_rth_beartype.py","source/expansion/truncate.py","source/module/__init__.py","source/module/extend.py","source/module/manager.py","source/module/mapping.py","source/module/model.py","source/module/note_info.py","source/module/recorder.py","source/module/script.py","source/module/settings.py","source/module/static.py","source/module/tools.py","source/translation/__init__.py","source/translation/translate.py","static/Release_Notes.md","static/XHS-Downloader.icns","static/XHS-Downloader.ico","static/XHS-Downloader.jpg","static/XHS-Downloader.js","static/XHS-Downloader.png","static/XHS-Downloader.tcss","static/other/20250619.js","static/other/Bloome_AD.png","static/other/DartNode_AD.png","static/other/QQ群聊二维码.png","static/other/自动滚动页面.js","static/screenshot/MCP下载文件1.png","static/screenshot/MCP下载文件2.png","static/screenshot/MCP获取数据.png","static/screenshot/MCP配置示例.png","static/screenshot/命令行模式截图CN1.png","static/screenshot/命令行模式截图CN2.png","static/screenshot/命令行模式截图EN1.png","static/screenshot/命令行模式截图EN2.png","static/screenshot/用户脚本截图1.png","static/screenshot/用户脚本截图2.png","static/screenshot/用户脚本截图3.png","static/screenshot/用户脚本截图4.png","static/screenshot/程序运行截图CN1.png","static/screenshot/程序运行截图CN2.png","static/screenshot/程序运行截图CN3.png","static/screenshot/程序运行截图EN1.png","static/screenshot/程序运行截图EN2.png","static/screenshot/程序运行截图EN3.png","static/screenshot/脚本切换语言.png","static/screenshot/脚本安装教程.png","static/screenshot/获取Cookie示意图.png","static/screenshot/请求头示例图.png","static/微信赞助二维码.png","static/支付宝赞助二维码.png","uv.lock"],"storefront":"/r/JoeanAmier","claimed":false,"request_supported":{"post":"https://gitbuyer.com/r/JoeanAmier/XHS-Downloader/request-supported","requests":0},"note":"indexed from public GitHub; nothing is for sale on this page. Clone it from GitHub. Paid listings live at /search."}