diff --git a/README.md b/README.md
index 56d1176..73eacc2 100644
--- a/README.md
+++ b/README.md
@@ -8,7 +8,7 @@
-📝 功能清单
+📑 功能清单
- ✅ 采集小红书图文/视频作品信息
- ✅ 获取小红书图文/视频作品下载地址
@@ -20,6 +20,13 @@
📸 程序截图
+🔗 支持链接
+
+- https://www.xiaohongshu.com/explore/作品ID
+- https://www.xiaohongshu.com/discovery/item/作品ID
+- https://xhslink.com/分享码
+可以单次输入多个作品链接,链接之间使用空格分隔。
+
🪟 关于终端
⭐ 推荐使用 Windows 终端 (Windows 11 自带默认终端)运行程序以便获得最佳显示效果!
🥣 使用方法
@@ -47,22 +54,22 @@ folder = "Download" # 作品下载文件夹名称(自动创建),默认值
proxies = None # 网络代理
timeout = 5 # 网络请求超时限制,默认值:10
chunk = 1024 * 1024 # 下载文件时,每次从服务器获取的数据块大小,单位字节
-xhs = XHS(
- path=path,
- folder=folder,
- proxies=proxies,
- timeout=timeout,
- chunk=chunk, ) # 使用自定义参数
-# xhs = XHS() # 使用默认参数
-download = True # 是否下载作品文件,默认值:False
-# 返回作品详细信息,包括下载地址
-print(xhs.extract(error_demo)) # 获取数据失败时返回空字典
-print(xhs.extract(image_demo, download=download))
-print(xhs.extract(video_demo, download=download))
-print(xhs.extract(multiple_demo, download=download))
+# with XHS() as xhs:
+# pass # 使用默认参数
+with XHS(path=path,
+ folder=folder,
+ proxies=proxies,
+ timeout=timeout,
+ chunk=chunk) as xhs: # 使用自定义参数
+ download = True # 是否下载作品文件,默认值:False
+ # 返回作品详细信息,包括下载地址
+ print(xhs.extract(error_demo)) # 获取数据失败时返回空字典
+ print(xhs.extract(image_demo, download=download))
+ print(xhs.extract(video_demo, download=download))
+ print(xhs.extract(multiple_demo, download=download))
⚙️ 配置文件
-项目根目录下的 settings.json 文件,可以自定义部分运行参数。
+项目根目录下的 settings.json 文件,首次运行自动生成,可以自定义部分运行参数。
@@ -133,6 +140,7 @@ print(xhs.extract(multiple_demo, download=download))
如果您通过 Email 联系我,我可能无法及时查看并回复信息,我会尽力在七天内回复您的邮件;如果有紧急事项或需要更快的回复,请通过其他方式与我联系,谢谢理解!
+如果您对抖音 / TikTok 感兴趣,可以了解一下我的另一个开源项目 TikTokDownloader
⚠️ 免责声明
- 使用者对本项目的使用由使用者自行决定,并自行承担风险。作者对使用者使用本项目所产生的任何损失、责任、或风险概不负责。
diff --git a/main.py b/main.py
index dd34acb..4be96c2 100644
--- a/main.py
+++ b/main.py
@@ -7,30 +7,26 @@ def example():
error_demo = "https://github.com/JoeanAmier/XHS_Downloader"
image_demo = "https://www.xiaohongshu.com/explore/63b275a30000000019020185"
video_demo = "https://www.xiaohongshu.com/explore/64edb460000000001f03cadc"
- multiple_demo = (
- "https://www.xiaohongshu.com/explore/63b275a30000000019020185 "
- "https://www.xiaohongshu.com/explore/64edb460000000001f03cadc")
+ multiple_demo = f"{image_demo} {video_demo}"
# 实例对象
- path = "" # 作品下载储存根路径,默认值:当前路径
+ path = "D:\\" # 作品下载储存根路径,默认值:当前路径
folder = "Download" # 作品下载文件夹名称(自动创建),默认值:Download
- cookie = "" # 小红书网页版 Cookie
proxies = None # 网络代理
timeout = 5 # 网络请求超时限制,默认值:10
chunk = 1024 * 1024 # 下载文件时,每次从服务器获取的数据块大小,单位字节
- xhs = XHS(
- path=path,
- folder=folder,
- cookie=cookie,
- proxies=proxies,
- timeout=timeout,
- chunk=chunk, ) # 使用自定义参数
- # xhs = XHS() # 使用默认参数
- download = False # 是否下载作品文件
- # 返回作品详细信息,包括下载地址
- print(xhs.extract(error_demo)) # 获取数据失败时返回空字典
- print(xhs.extract(image_demo, download=download))
- print(xhs.extract(video_demo, download=download))
- print(xhs.extract(multiple_demo, download=download))
+ # with XHS() as xhs:
+ # pass # 使用默认参数
+ with XHS(path=path,
+ folder=folder,
+ proxies=proxies,
+ timeout=timeout,
+ chunk=chunk) as xhs: # 使用自定义参数
+ download = True # 是否下载作品文件,默认值:False
+ # 返回作品详细信息,包括下载地址
+ print(xhs.extract(error_demo)) # 获取数据失败时返回空字典
+ print(xhs.extract(image_demo, download=download))
+ print(xhs.extract(video_demo, download=download))
+ print(xhs.extract(multiple_demo, download=download))
if __name__ == '__main__':
diff --git a/source/Manager.py b/source/Manager.py
index 340c780..4367348 100644
--- a/source/Manager.py
+++ b/source/Manager.py
@@ -1,5 +1,6 @@
from pathlib import Path
from shutil import move
+from shutil import rmtree
__all__ = ['Manager']
@@ -24,3 +25,6 @@ class Manager:
@staticmethod
def move(temp: Path, path: Path):
move(temp.resolve(), path.resolve())
+
+ def clean(self):
+ rmtree(self.temp.resolve())
diff --git a/source/Video.py b/source/Video.py
index f3d7cfa..949d34e 100644
--- a/source/Video.py
+++ b/source/Video.py
@@ -1,11 +1,13 @@
from re import compile
+from .Html import Html
+
__all__ = ['Video']
class Video:
- VIDEO_TOKEN = compile(r'"originVideoKey":"pre_post\\u002F(\S+?)"')
+ VIDEO_TOKEN = compile(r'"originVideoKey":"(\S+?\\u002F\S+?)"')
def get_video_link(self, html: str) -> list:
- return [f"https://sns-video-hw.xhscdn.com/pre_post/{
- t.group(1)}"] if (t := self.VIDEO_TOKEN.search(html)) else []
+ return [Html.format_url(f"https://sns-video-hw.xhscdn.com/{
+ t.group(1)}")] if (t := self.VIDEO_TOKEN.search(html)) else []
diff --git a/source/__init__.py b/source/__init__.py
index fa6a13b..bc6c769 100644
--- a/source/__init__.py
+++ b/source/__init__.py
@@ -100,6 +100,12 @@ class XHS:
"""下载文件默认使用作品 ID 作为文件名,可修改此方法自定义文件名格式"""
return data["作品ID"]
+ def __enter__(self):
+ return self
+
+ def __exit__(self, exc_type, exc_value, traceback):
+ self.manager.clean()
+
class XHSDownloader(App):
VERSION = 1.6
@@ -114,6 +120,12 @@ class XHSDownloader(App):
# APP = XHS(**Settings().run())
+ # def __enter__(self):
+ # return self
+
+ # def __exit__(self, exc_type, exc_value, traceback):
+ # self.manager.clean()
+
def compose(self) -> ComposeResult:
yield Header()
yield ScrollableContainer(Label("请输入小红书图文/视频作品链接(多个链接使用空格分隔):"),