From 1c1cb2f7b2847506464341511605144d2757f986 Mon Sep 17 00:00:00 2001 From: Quan Date: Wed, 14 Jan 2026 12:12:43 +0800 Subject: [PATCH] =?UTF-8?q?feat(app):=20=E5=A2=9E=E5=8A=A0=E6=89=B9?= =?UTF-8?q?=E9=87=8F=E4=B8=8B=E8=BD=BD=E8=B4=A6=E5=8F=B7=E4=BD=9C=E5=93=81?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pyproject.toml | 1 + source/application/user_posted.py | 70 +++++++++++++++++++++++++++++++ source/module/settings.py | 2 + uv.lock | 35 +++++++++++++++- 4 files changed, 107 insertions(+), 1 deletion(-) create mode 100644 source/application/user_posted.py diff --git a/pyproject.toml b/pyproject.toml index 5139d26..b195d36 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -23,6 +23,7 @@ dependencies = [ "textual>=6.8.0", "uvicorn>=0.38.0", "websockets>=15.0.1", + "xhshow>=0.1.7", ] [project.urls] diff --git a/source/application/user_posted.py b/source/application/user_posted.py new file mode 100644 index 0000000..be4dce7 --- /dev/null +++ b/source/application/user_posted.py @@ -0,0 +1,70 @@ +from xhshow import Xhshow +from typing import TYPE_CHECKING +from ..module import Manager, retry, sleep_time +from httpx import get + +if TYPE_CHECKING: + from ..module import Manager + + +class UserPosted: + encipher = Xhshow() + + def __init__( + self, + manager: "Manager", + url: str, + params: dict, + cookies: str = None, + proxy: str = None, + ): + self.url = url + self.params = params + self.headers = manager.headers.copy() + self.update_cookie(cookies) + self.cookies = self.headers["cookie"] + self.print = manager.print + self.retry = manager.retry + self.client = manager.request_client + self.timeout = manager.timeout + self.proxy = proxy + + def update_cookie(self, cookies: str = None) -> None: + if cookies: + self.headers["cookie"] = cookies + + def run( + self, + verify=True, + ): ... + + @retry + async def get_data(self): + headers = self.get_headers() + if self.proxy: + response = get( + self.url, + params=self.params, + headers=headers, + proxy=self.proxy, + follow_redirects=True, + verify=False, + timeout=self.timeout, + ) + else: + response = await self.client.get( + self.url, + params=self.params, + headers=headers, + ) + await sleep_time() + response.raise_for_status() + return response.json() + + def get_headers(self): + headers = self.encipher.sign_headers_get( + uri=self.url, + cookies=self.cookies, + params=self.params, + ) + return headers | self.headers diff --git a/source/module/settings.py b/source/module/settings.py index 59cacfd..e37170a 100644 --- a/source/module/settings.py +++ b/source/module/settings.py @@ -15,6 +15,8 @@ class Settings: "folder_name": "Download", # 下载文件夹名称 "name_format": "发布时间 作者昵称 作品标题", # 文件命名格式 "user_agent": USERAGENT, # 请求头 + # "a_user_agent": USERAGENT, # 请求头 + # "b_user_agent": USERAGENT, # 请求头 "cookie": "", # Cookie "proxy": None, # 代理设置 "timeout": 10, # 超时时间(秒) diff --git a/uv.lock b/uv.lock index ab62033..2ceca35 100644 --- a/uv.lock +++ b/uv.lock @@ -1067,6 +1067,25 @@ wheels = [ { url = "https://mirrors.ustc.edu.cn/pypi/packages/a0/e3/59cd50310fc9b59512193629e1984c1f95e5c8ae6e5d8c69532ccc65a7fe/pycparser-2.23-py3-none-any.whl", hash = "sha256:e5c6e8d3fbad53479cab09ac03729e0a9faf2bee3db8208a550daf5af81a5934", size = 118140, upload-time = "2025-09-09T13:23:46.651Z" }, ] +[[package]] +name = "pycryptodome" +version = "3.23.0" +source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" } +sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/8e/a6/8452177684d5e906854776276ddd34eca30d1b1e15aa1ee9cefc289a33f5/pycryptodome-3.23.0.tar.gz", hash = "sha256:447700a657182d60338bab09fdb27518f8856aecd80ae4c6bdddb67ff5da44ef", size = 4921276, upload-time = "2025-05-17T17:21:45.242Z" } +wheels = [ + { url = "https://mirrors.ustc.edu.cn/pypi/packages/db/6c/a1f71542c969912bb0e106f64f60a56cc1f0fabecf9396f45accbe63fa68/pycryptodome-3.23.0-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:187058ab80b3281b1de11c2e6842a357a1f71b42cb1e15bce373f3d238135c27", size = 2495627, upload-time = "2025-05-17T17:20:47.139Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/6e/4e/a066527e079fc5002390c8acdd3aca431e6ea0a50ffd7201551175b47323/pycryptodome-3.23.0-cp37-abi3-macosx_10_9_x86_64.whl", hash = "sha256:cfb5cd445280c5b0a4e6187a7ce8de5a07b5f3f897f235caa11f1f435f182843", size = 1640362, upload-time = "2025-05-17T17:20:50.392Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/50/52/adaf4c8c100a8c49d2bd058e5b551f73dfd8cb89eb4911e25a0c469b6b4e/pycryptodome-3.23.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67bd81fcbe34f43ad9422ee8fd4843c8e7198dd88dd3d40e6de42ee65fbe1490", size = 2182625, upload-time = "2025-05-17T17:20:52.866Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/5f/e9/a09476d436d0ff1402ac3867d933c61805ec2326c6ea557aeeac3825604e/pycryptodome-3.23.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c8987bd3307a39bc03df5c8e0e3d8be0c4c3518b7f044b0f4c15d1aa78f52575", size = 2268954, upload-time = "2025-05-17T17:20:55.027Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/f9/c5/ffe6474e0c551d54cab931918127c46d70cab8f114e0c2b5a3c071c2f484/pycryptodome-3.23.0-cp37-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aa0698f65e5b570426fc31b8162ed4603b0c2841cbb9088e2b01641e3065915b", size = 2308534, upload-time = "2025-05-17T17:20:57.279Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/18/28/e199677fc15ecf43010f2463fde4c1a53015d1fe95fb03bca2890836603a/pycryptodome-3.23.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:53ecbafc2b55353edcebd64bf5da94a2a2cdf5090a6915bcca6eca6cc452585a", size = 2181853, upload-time = "2025-05-17T17:20:59.322Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/ce/ea/4fdb09f2165ce1365c9eaefef36625583371ee514db58dc9b65d3a255c4c/pycryptodome-3.23.0-cp37-abi3-musllinux_1_2_i686.whl", hash = "sha256:156df9667ad9f2ad26255926524e1c136d6664b741547deb0a86a9acf5ea631f", size = 2342465, upload-time = "2025-05-17T17:21:03.83Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/22/82/6edc3fc42fe9284aead511394bac167693fb2b0e0395b28b8bedaa07ef04/pycryptodome-3.23.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:dea827b4d55ee390dc89b2afe5927d4308a8b538ae91d9c6f7a5090f397af1aa", size = 2267414, upload-time = "2025-05-17T17:21:06.72Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/59/fe/aae679b64363eb78326c7fdc9d06ec3de18bac68be4b612fc1fe8902693c/pycryptodome-3.23.0-cp37-abi3-win32.whl", hash = "sha256:507dbead45474b62b2bbe318eb1c4c8ee641077532067fec9c1aa82c31f84886", size = 1768484, upload-time = "2025-05-17T17:21:08.535Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/54/2f/e97a1b8294db0daaa87012c24a7bb714147c7ade7656973fd6c736b484ff/pycryptodome-3.23.0-cp37-abi3-win_amd64.whl", hash = "sha256:c75b52aacc6c0c260f204cbdd834f76edc9fb0d8e0da9fbf8352ef58202564e2", size = 1799636, upload-time = "2025-05-17T17:21:10.393Z" }, + { url = "https://mirrors.ustc.edu.cn/pypi/packages/18/3d/f9441a0d798bf2b1e645adc3265e55706aead1255ccdad3856dbdcffec14/pycryptodome-3.23.0-cp37-abi3-win_arm64.whl", hash = "sha256:11eeeb6917903876f134b56ba11abe95c0b0fd5e3330def218083c7d98bbcb3c", size = 1703675, upload-time = "2025-05-17T17:21:13.146Z" }, +] + [[package]] name = "pydantic" version = "2.12.5" @@ -1643,6 +1662,7 @@ dependencies = [ { name = "textual" }, { name = "uvicorn" }, { name = "websockets" }, + { name = "xhshow" }, ] [package.dev-dependencies] @@ -1658,7 +1678,7 @@ requires-dist = [ { name = "click", specifier = ">=8.3.1" }, { name = "emoji", specifier = ">=2.15.0" }, { name = "fastapi", specifier = ">=0.124.2" }, - { name = "fastmcp", specifier = ">=2.14.0" }, + { name = "fastmcp", specifier = ">=2.14.2" }, { name = "httpx", extras = ["socks"], specifier = ">=0.28.1" }, { name = "lxml", specifier = ">=6.0.2" }, { name = "pyperclip", specifier = ">=1.11.0" }, @@ -1667,6 +1687,7 @@ requires-dist = [ { name = "textual", specifier = ">=6.8.0" }, { name = "uvicorn", specifier = ">=0.38.0" }, { name = "websockets", specifier = ">=15.0.1" }, + { name = "xhshow", specifier = ">=0.1.7" }, ] [package.metadata.requires-dev] @@ -1675,6 +1696,18 @@ dev = [ { name = "textual-dev", specifier = ">=1.7.0" }, ] +[[package]] +name = "xhshow" +version = "0.1.7" +source = { registry = "https://mirrors.ustc.edu.cn/pypi/simple" } +dependencies = [ + { name = "pycryptodome" }, +] +sdist = { url = "https://mirrors.ustc.edu.cn/pypi/packages/13/ee/ff0ed107df425b362432b7667aee6881f53cd36d494c9d54a3596d291b86/xhshow-0.1.7.tar.gz", hash = "sha256:2cb395dced80821acab240f8f4330a49d3cbba2b116d99f332c9b9a0349a5dee", size = 44962, upload-time = "2026-01-13T10:12:00.921Z" } +wheels = [ + { url = "https://mirrors.ustc.edu.cn/pypi/packages/a5/8c/a15c37cccc6d03ddf4df9f0a3942e6afd70cff4e3bb340440ef04178e51a/xhshow-0.1.7-py3-none-any.whl", hash = "sha256:b6db008aad28b71733349a4859a621e5dbc22a529d3464aa6c570f9c0b0071a7", size = 28515, upload-time = "2026-01-13T10:11:59.487Z" }, +] + [[package]] name = "yarl" version = "1.22.0"