mirror of
https://github.com/JoeanAmier/XHS-Downloader.git
synced 2025-12-26 04:48:05 +08:00
更新项目代码
This commit is contained in:
parent
cc72e54302
commit
ceb3757085
38
README.md
38
README.md
@ -8,7 +8,7 @@
|
||||
<img alt="GitHub release (with filter)" src="https://img.shields.io/github/v/release/JoeanAmier/XHS-Downloader?style=for-the-badge&color=44bd32">
|
||||
<hr>
|
||||
</div>
|
||||
<h1>📝 功能清单</h1>
|
||||
<h1>📑 功能清单</h1>
|
||||
<ul>
|
||||
<li>✅ 采集小红书图文/视频作品信息</li>
|
||||
<li>✅ 获取小红书图文/视频作品下载地址</li>
|
||||
@ -20,6 +20,13 @@
|
||||
<h1>📸 程序截图</h1>
|
||||
<br>
|
||||
<img src="static/程序运行截图.png" alt="">
|
||||
<h1>🔗 支持链接</h1>
|
||||
<ul>
|
||||
<li>https://www.xiaohongshu.com/explore/作品ID</li>
|
||||
<li>https://www.xiaohongshu.com/discovery/item/作品ID</li>
|
||||
<li>https://xhslink.com/分享码</li>
|
||||
<p>可以单次输入多个作品链接,链接之间使用空格分隔。</p>
|
||||
</ul>
|
||||
<h1>🪟 关于终端</h1>
|
||||
<p>⭐ 推荐使用 <a href="https://learn.microsoft.com/zh-cn/windows/terminal/install">Windows 终端</a> (Windows 11 自带默认终端)运行程序以便获得最佳显示效果!</p>
|
||||
<h1>🥣 使用方法</h1>
|
||||
@ -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))
|
||||
</pre>
|
||||
<h1>⚙️ 配置文件</h1>
|
||||
<p>项目根目录下的 <code>settings.json</code> 文件,可以自定义部分运行参数。</p>
|
||||
<p>项目根目录下的 <code>settings.json</code> 文件,首次运行自动生成,可以自定义部分运行参数。</p>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
@ -133,6 +140,7 @@ print(xhs.extract(multiple_demo, download=download))
|
||||
<p>
|
||||
<b>如果您通过 Email 联系我,我可能无法及时查看并回复信息,我会尽力在七天内回复您的邮件;如果有紧急事项或需要更快的回复,请通过其他方式与我联系,谢谢理解!</b>
|
||||
</p>
|
||||
<p><b>如果您对抖音 / TikTok 感兴趣,可以了解一下我的另一个开源项目 <a href="https://github.com/JoeanAmier/TikTokDownloader">TikTokDownloader</a></b></p>
|
||||
<h1>⚠️ 免责声明</h1>
|
||||
<ul>
|
||||
<li>使用者对本项目的使用由使用者自行决定,并自行承担风险。作者对使用者使用本项目所产生的任何损失、责任、或风险概不负责。</li>
|
||||
|
||||
34
main.py
34
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__':
|
||||
|
||||
@ -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())
|
||||
|
||||
@ -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 []
|
||||
|
||||
@ -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("请输入小红书图文/视频作品链接(多个链接使用空格分隔):"),
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user