From ad04d2b6b5ebd08aeab00a91a35ae37fb24ecdf0 Mon Sep 17 00:00:00 2001 From: zk Date: Mon, 27 Jul 2026 14:23:56 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=9B=BE=E7=89=87=E4=B8=8B?= =?UTF-8?q?=E8=BD=BD=E8=83=BD=E5=8A=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/tool/image_download.py | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 app/tool/image_download.py diff --git a/app/tool/image_download.py b/app/tool/image_download.py new file mode 100644 index 0000000..d0c19cc --- /dev/null +++ b/app/tool/image_download.py @@ -0,0 +1,36 @@ +"""图片下载工具。 + +把图片 URL 下载成字节流,供 OCR(app.tool.ocr)与二维码识别 +(app.tool.cv / app.tool.qr_decode)直接消费,不落盘。 +""" + +from __future__ import annotations + +import httpx + +from app.core.logger import log + +# 请求超时(秒) +_TIMEOUT = 20 + + +def download_image(url: str) -> bytes | None: + """下载图片。 + + Args: + url: 图片地址。 + + Returns: + 图片字节流;下载失败时返回 None。 + """ + if not url or not url.startswith("http"): + return None + + try: + with httpx.Client(timeout=_TIMEOUT, follow_redirects=True) as client: + response = client.get(url) + response.raise_for_status() + return response.content or None + except httpx.HTTPError as exc: + log.warning(f"图片下载失败: {url} | {exc}") + return None