From d0f4b885943bbdd6c7f795aeaa71dec24ee86d49 Mon Sep 17 00:00:00 2001 From: qixiaoxin Date: Thu, 4 Sep 2025 23:41:26 +0800 Subject: [PATCH 1/2] =?UTF-8?q?refactor(mzapi):=20=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E5=B9=B6=E6=B7=BB=E5=8A=A0=E6=96=B0=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit -新增目录 baidu,用于存放百度相关代码 - 新增 RecognizeGeneralTextImageWarn 功能 - 重构日志记录,提高安全性 - 更新项目结构,删除冗余代码 - 优化 GitHub Actions 工作流 --- .cnb.yml | 4 - .github/workflows/publish-to-pypi.yml | 6 +- .github/workflows/release.yml | 9 +- .github/workflows/sync-to-coding.yml | 22 +- .ide/Dockerfile | 3 + install_sdk.sh | 57 -- mzapi/__init__.py | 7 +- mzapi/baidu/__init__.py | 1 + mzapi/baidu/authorization.py | 12 + mzapi/{utlis => baidu/nlp}/__init__.py | 0 mzapi/tencent/ocr/GeneralAccurateOCR.py | 21 +- mzapi/tencent/ocr/GeneralBasicOCR.py | 19 +- .../ocr/RecognizeGeneralTextImageWarn.py | 112 +++ mzapi/tencent/ocr/__init__.py | 3 +- mzapi/utlis/ImageValidator.py | 3 +- mzapi/utlis/verification.py | 25 + yilai.txt | 852 ++++++++++++++++++ 17 files changed, 1063 insertions(+), 93 deletions(-) delete mode 100644 install_sdk.sh create mode 100644 mzapi/baidu/__init__.py create mode 100644 mzapi/baidu/authorization.py rename mzapi/{utlis => baidu/nlp}/__init__.py (100%) create mode 100644 mzapi/tencent/ocr/RecognizeGeneralTextImageWarn.py create mode 100644 mzapi/utlis/verification.py create mode 100644 yilai.txt diff --git a/.cnb.yml b/.cnb.yml index 9ae120f..aea5eb0 100644 --- a/.cnb.yml +++ b/.cnb.yml @@ -19,10 +19,6 @@ $: script: - chmod +x ./modify_apt_sources.sh - sudo ./modify_apt_sources.sh - - name: 安装依赖 - script: - - chmod +x ./install_sdk.sh - - sudo ./install_sdk.sh master: push: - docker: diff --git a/.github/workflows/publish-to-pypi.yml b/.github/workflows/publish-to-pypi.yml index ce4394c..1515a4a 100644 --- a/.github/workflows/publish-to-pypi.yml +++ b/.github/workflows/publish-to-pypi.yml @@ -1,12 +1,12 @@ -name: 发布包到PyPI +name: 发布包到pypi on: push: branches: - master pull_request: + types: [opened, synchronize, reopened, closed] branches: [ "master" ] - types: [closed] permissions: contents: read @@ -38,7 +38,7 @@ jobs: pypi-publish: runs-on: ubuntu-latest needs: release-build - if: ${{ github.event_name == 'push' || (github.event_name == 'pull_request' && github.event.pull_request.merged) }} + if: github.event_name == 'pull_request' && github.event.action == 'closed' && github.event.pull_request.merged == true environment: name: pypi diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 99e4be0..6c44b45 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -6,7 +6,7 @@ on: - master pull_request: branches: [ "master" ] - types: [closed] + types: [opened, synchronize, reopened, closed] permissions: contents: read @@ -15,7 +15,6 @@ permissions: jobs: release-build: runs-on: ubuntu-latest - if: github.event.pull_request.merged == true || github.event_name == 'push' steps: - uses: actions/checkout@v4 @@ -34,10 +33,10 @@ jobs: id: extract_version run: | filename=$(ls dist/mzapi_python-*.whl) - version=$(echo $filename | sed -e 's/.*-\([0-9]\+\.[0-9]\+\.[0-9]\+\).*\.whl/\1/') + version=$(echo $filename | sed -e 's/.*-\([0-9]*\.[0-9]*\.[0-9]*\)-py3-none-any\.whl/\1/') echo "version=$version" >> $GITHUB_ENV - - name: 创建GitHub Release + - name: Create GitHub release uses: softprops/action-gh-release@v2 with: tag_name: v${{ env.version }} @@ -51,4 +50,4 @@ jobs: files: | dist/*.whl dist/*.tar.gz - token: ${{ secrets.TOKEN }} \ No newline at end of file + token: ${{ secrets.TOKEN }} diff --git a/.github/workflows/sync-to-coding.yml b/.github/workflows/sync-to-coding.yml index de590b5..f3b8ac2 100644 --- a/.github/workflows/sync-to-coding.yml +++ b/.github/workflows/sync-to-coding.yml @@ -1,18 +1,15 @@ -name: 同步代码到多个仓库 - on: push: branches: - master pull_request: - branches: - - master - types: [closed] + branches: [ "master" ] + types: [opened, synchronize, reopened, closed] jobs: sync-to-gitcode: + if: github.event_name == 'pull_request' && github.event.action == 'closed' && github.event.pull_request.merged == true runs-on: ubuntu-latest - if: github.event.pull_request.merged == true || github.event_name == 'push' env: SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }} GIT_USER: xiaomizhou @@ -37,6 +34,7 @@ jobs: run: | git config --global user.name "${{ secrets.GIT_USER }}" git config --global user.email "${{ secrets.GIT_EMAIL }}" + - name: Add Gitcode Remote run: git remote add gitcode git@gitcode.com:xiaomizhou/MZAPI-python.git @@ -44,12 +42,12 @@ jobs: run: git push gitcode master sync-to-gitee: + if: github.event_name == 'pull_request' && github.event.action == 'closed' && github.event.pull_request.merged == true runs-on: ubuntu-latest - if: github.event.pull_request.merged == true || github.event_name == 'push' env: SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }} - GIT_USER: ${{ secrets.GITEE_USER }} - GIT_EMAIL: ${{ secrets.GITEE_EMAIL }} + GITEE_USER: ${{ secrets.GITEE_USER }} + GITEE_EMAIL: ${{ secrets.GITEE_EMAIL }} steps: - name: Checkout uses: actions/checkout@v4 @@ -78,8 +76,8 @@ jobs: run: git push gitee master sync-to-codeup: + if: github.event_name == 'pull_request' && github.event.action == 'closed' && github.event.pull_request.merged == true runs-on: ubuntu-latest - if: github.event.pull_request.merged == true || github.event_name == 'push' env: SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }} GIT_USER: ${{ secrets.CODEUP_USER }} @@ -112,8 +110,8 @@ jobs: run: git push codeup master sync-to-huaweicloud: + if: github.event_name == 'pull_request' && github.event.action == 'closed' && github.event.pull_request.merged == true runs-on: ubuntu-latest - if: github.event.pull_request.merged == true || github.event_name == 'push' env: SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }} GIT_USER: ${{ secrets.HUAWEICLOUD_USER }} @@ -146,8 +144,8 @@ jobs: run: git push huaweicloud master sync-to-cnb: + if: github.event_name == 'pull_request' && github.event.action == 'closed' && github.event.pull_request.merged == true runs-on: ubuntu-latest - if: github.event.pull_request.merged == true || github.event_name == 'push' env: SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }} GIT_USER: ${{ secrets.CNB_USER }} diff --git a/.ide/Dockerfile b/.ide/Dockerfile index 3478d1d..198dbe0 100644 --- a/.ide/Dockerfile +++ b/.ide/Dockerfile @@ -16,6 +16,9 @@ RUN curl -fsSL https://code-server.dev/install.sh | sh \ && echo done +# 安装python依赖 +RUN pip install -r yilai.txt + # 指定字符集支持命令行输入中文(根据需要选择字符集) ENV LANG C.UTF-8 ENV LANGUAGE C.UTF-8 \ No newline at end of file diff --git a/install_sdk.sh b/install_sdk.sh deleted file mode 100644 index d759e8d..0000000 --- a/install_sdk.sh +++ /dev/null @@ -1,57 +0,0 @@ -# 安装阿里云、腾讯云、华为云、百度云、OpenAI、字节跳动和京东云的Python SDK -# 确保pip已安装 -if ! which pip; then - python3 -m ensurepip --upgrade -fi - -# 安装阿里云SDK -echo "正在安装阿里云SDK..." -git clone https://github.com/aliyun/alibabacloud-python-sdk.git -cd alibabacloud-python-sdk || exit -for dir in */ -do - dir_name=$(basename "$dir") - if [[ "$dir_name" =~ ^alibabacloud_ ]]; then - echo "正在安装SDK:$dir_name..." - pip install "$dir_name" || exit 1 - fi -done - -# 安装腾讯云SDK -echo "正在安装腾讯云SDK..." -pip install --upgrade tencentcloud-sdk-python || exit 1 - -# 安装华为云SDK -echo "正在安装华为云SDK..." -cd / # 回到根目录 -git clone --depth 1 https://github.com/huaweicloud/huaweicloud-sdk-python-v3.git -cd huaweicloud-sdk-python-v3/huaweicloud-sdk-all || exit -for dir in */ -do - dir_name=$(basename "$dir") - # 仅处理以huaweicloud开头的目录 - if [[ "$dir_name" =~ ^huaweicloud ]]; then - # 替换-sdk-为sdk,去掉其他连字符 - install_name=$(echo "$dir_name" | sed -e 's/-sdk-/sdk/g' -e 's/-//g') - echo "正在安装SDK:$install_name..." - pip install "$install_name" || exit 1 - fi -done - -# 安装百度云SDK -echo "正在安装百度云SDK..." -pip install bce-python-sdk || exit 1 - -# 安装OpenAI和其他库 -echo "正在安装OpenAI和其他库..." -pip install openai qianfan || exit 1 - -# 安装字节跳动 SDK -echo "正在安装字节跳动 SDK..." -pip install volcengine-python-sdk || exit 1 - -# 安装京东云 SDK -echo "正在安装京东云 SDK..." -pip install -U jdcloud_sdk || exit 1 - -echo "所有SDK安装完成!" \ No newline at end of file diff --git a/mzapi/__init__.py b/mzapi/__init__.py index d1619b8..055eeef 100644 --- a/mzapi/__init__.py +++ b/mzapi/__init__.py @@ -24,5 +24,10 @@ def get_email(): """获取SDK作者邮箱""" return __email__ from .tencent import * +from .baidu import * -__all__ = [GeneralBasicOCR,GeneralAccurateOCR] +__all__ = [ + "GeneralBasicOCR" + ,"GeneralAccurateOCR" + ,"RecognizeGeneralTextImageWarn" +] diff --git a/mzapi/baidu/__init__.py b/mzapi/baidu/__init__.py new file mode 100644 index 0000000..e190527 --- /dev/null +++ b/mzapi/baidu/__init__.py @@ -0,0 +1 @@ +from .nlp import * \ No newline at end of file diff --git a/mzapi/baidu/authorization.py b/mzapi/baidu/authorization.py new file mode 100644 index 0000000..354b85a --- /dev/null +++ b/mzapi/baidu/authorization.py @@ -0,0 +1,12 @@ +import requests + + +def access_token(ak, sk): + url = f"https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id={ak}&client_secret={sk}" + payload = "" + headers = { + 'Content-Type': 'application/json', + 'Accept': 'application/json' + } + response = requests.get(url, headers=headers, data=payload) + return response.json().get("access_token") diff --git a/mzapi/utlis/__init__.py b/mzapi/baidu/nlp/__init__.py similarity index 100% rename from mzapi/utlis/__init__.py rename to mzapi/baidu/nlp/__init__.py diff --git a/mzapi/tencent/ocr/GeneralAccurateOCR.py b/mzapi/tencent/ocr/GeneralAccurateOCR.py index 3314604..f658a8f 100644 --- a/mzapi/tencent/ocr/GeneralAccurateOCR.py +++ b/mzapi/tencent/ocr/GeneralAccurateOCR.py @@ -10,6 +10,7 @@ from tencentcloud.ocr.v20181119 import ocr_client, models from ...utlis.ImageValidator import ImageValidator +from ...utlis.verification import Verification class GeneralAccurateOCR: @@ -31,6 +32,7 @@ def __init__(self, secret_id=None, secret_key=None, token=None, log_level=None): Raises: TencentCloudSDKException: 初始化失败时抛出 """ + self.sanitize_log_data = Verification self.logger = logging.getLogger(__name__) if log_level is not None: self.logger.setLevel(log_level) @@ -72,18 +74,27 @@ def recognize(self,ImageBase64,ImageUrl,IsWords,EnableDetectSplit,IsPdf,PdfPageN :param ConfigID: 配置ID支持: OCR -- 通用场景 MulOCR--多语种场景 """ try: - self.logger.info("开始执行OCR识别") - self.logger.debug(f"输入参数: ImageBase64={ImageBase64}, ImageUrl={ImageUrl}, IsWords={IsWords}, EnableDetectSplit={EnableDetectSplit}, IsPdf={IsPdf}, PdfPageNumber={PdfPageNumber}, EnableDetectText={EnableDetectText}, ConfigID={ConfigID}") - if ImageBase64 is None and ImageUrl is None: + if (ImageBase64 is None or str(ImageBase64).strip() == "") and (ImageUrl is None or str(ImageUrl).strip() == ""): error_msg = "ImageBase64和ImageUrl必须提供一个" self.logger.error(error_msg) raise ValueError(error_msg) if ImageUrl: - self.logger.debug(f"验证图片URL: {ImageUrl}") + self.logger.debug("验证图片URL: %s", ImageUrl) self.validate_url.validate_url(ImageUrl, ["png", "jpg", "jpeg", "bmp", "pdf"]) self.logger.debug("图片URL验证通过") + self.logger.debug("图片Base64验证通过") + self.logger.info("开始执行OCR识别") + self.logger.debug("输入参数: ImageBase64=%s, ImageUrl=%s, IsWords=%s, EnableDetectSplit=%s, IsPdf=%s, PdfPageNumber=%s, EnableDetectText=%s, ConfigID=%s", + self.sanitize_log_data.sanitize_log_data(ImageBase64,100), + ImageUrl, + IsWords, + EnableDetectSplit, + IsPdf, + PdfPageNumber, + EnableDetectText, + ConfigID) req = models.GeneralAccurateOCRRequest() params = { "ImageBase64": ImageBase64, @@ -99,7 +110,7 @@ def recognize(self,ImageBase64,ImageUrl,IsWords,EnableDetectSplit,IsPdf,PdfPageN self.logger.info("正在向腾讯云OCR API发送请求...") resp = self.client.GeneralAccurateOCR(req) self.logger.info("OCR识别请求成功完成") - self.logger.debug(f"响应数据: {resp.to_json_string()}") + self.logger.debug("响应数据: %s", self.sanitize_log_data.sanitize_log_data(resp.to_json_string(),50)) return resp.to_json_string() except TencentCloudSDKException as err: diff --git a/mzapi/tencent/ocr/GeneralBasicOCR.py b/mzapi/tencent/ocr/GeneralBasicOCR.py index b3987f3..f139c07 100644 --- a/mzapi/tencent/ocr/GeneralBasicOCR.py +++ b/mzapi/tencent/ocr/GeneralBasicOCR.py @@ -9,6 +9,7 @@ from tencentcloud.ocr.v20181119 import ocr_client, models from ...utlis.ImageValidator import ImageValidator +from ...utlis.verification import Verification class GeneralBasicOCR: @@ -30,6 +31,7 @@ def __init__(self, secret_id=None, secret_key=None, token=None, log_level=None): Raises: TencentCloudSDKException: 初始化失败时抛出 """ + self.sanitize_log_data = Verification self.logger = logging.getLogger(__name__) if log_level is not None: self.logger.setLevel(log_level) @@ -106,7 +108,15 @@ def recognize(self, ImageBase64=None, ImageUrl=None, Scene=None, LanguageType=No """ try: self.logger.info("开始执行OCR识别") - self.logger.debug(f"输入参数: ImageUrl={ImageUrl}, LanguageType={LanguageType}, IsPdf={IsPdf}") + safe_base64 = self.sanitize_log_data.sanitize_log_data(ImageBase64,100) + self.logger.debug("输入参数: ImageBase64=%s, ImageUrl=%s, Scene=%s, LanguageType=%s, IsPdf=%s, PdfPageNumber=%s, IsWords=%s", + safe_base64, + ImageUrl, + Scene, + LanguageType, + IsPdf, + PdfPageNumber, + IsWords) if ImageBase64 is None and ImageUrl is None: error_msg = "ImageBase64和ImageUrl必须提供一个" @@ -114,7 +124,7 @@ def recognize(self, ImageBase64=None, ImageUrl=None, Scene=None, LanguageType=No raise ValueError(error_msg) if ImageUrl: - self.logger.debug(f"验证图片URL: {ImageUrl}") + self.logger.debug("验证图片URL: %s", ImageUrl) self.validate_url.validate_url(ImageUrl, ["png", "jpg", "jpeg", "bmp", "pdf"]) self.logger.debug("图片URL验证通过") @@ -136,7 +146,8 @@ def recognize(self, ImageBase64=None, ImageUrl=None, Scene=None, LanguageType=No # 执行OCR识别 resp = self.client.GeneralBasicOCR(req) self.logger.info("OCR识别请求成功完成") - self.logger.debug(f"响应数据: {resp.to_json_string()}") # 只记录前200字符避免日志过大 + resp_json = resp.to_json_string() + self.logger.debug("响应数据: %s", self.sanitize_log_data.sanitize_log_data(resp_json,50)) return resp.to_json_string() @@ -145,4 +156,4 @@ def recognize(self, ImageBase64=None, ImageUrl=None, Scene=None, LanguageType=No raise err except Exception as e: self.logger.error(f"处理OCR请求时发生意外错误: {str(e)}", exc_info=True) - raise TencentCloudSDKException("OCR处理错误", str(e)) + raise TencentCloudSDKException("OCR处理错误", str(e)) \ No newline at end of file diff --git a/mzapi/tencent/ocr/RecognizeGeneralTextImageWarn.py b/mzapi/tencent/ocr/RecognizeGeneralTextImageWarn.py new file mode 100644 index 0000000..c7abcd6 --- /dev/null +++ b/mzapi/tencent/ocr/RecognizeGeneralTextImageWarn.py @@ -0,0 +1,112 @@ +# -*- coding: utf-8 -*- + +import json +import logging + +from tencentcloud.common import credential +from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException +from tencentcloud.common.profile.client_profile import ClientProfile +from tencentcloud.common.profile.http_profile import HttpProfile +from tencentcloud.ocr.v20181119 import ocr_client, models + +from ...utlis.ImageValidator import ImageValidator +from ...utlis.verification import Verification + + +class RecognizeGeneralTextImageWarn: + def __init__(self, secret_id=None, secret_key=None, token=None, log_level=None): + """初始化腾讯云OCR客户端 + + Args: + secret_id: 腾讯云SecretId + secret_key: 腾讯云SecretKey + token: 临时密钥Token(可选) + log_level: 日志级别,默认为None(不输出日志) + - logging.DEBUG: 详细调试信息 + - logging.INFO: 一般信息 + - logging.WARNING: 警告信息 + - logging.ERROR: 错误信息 + - logging.CRITICAL: 严重错误 + - None: 不输出日志(默认) + + Raises: + TencentCloudSDKException: 初始化失败时抛出 + """ + self.sanitize_log_data = Verification + self.validate = ImageValidator() + self.logger = logging.getLogger(__name__) + if log_level is not None: + self.logger.setLevel(log_level) + # 只在没有处理器时添加处理器 + if not self.logger.handlers: + handler = logging.StreamHandler() + handler.setFormatter(logging.Formatter('%(pastime)s - %(name)s - %(levelness)s - %(message)s')) + self.logger.addHandler(handler) + else: + # 确保现有处理器的格式一致 + for h in self.logger.handlers: + h.setFormatter(logging.Formatter('%(pastime)s - %(name)s - %(levelness)s - %(message)s')) + self.logger.info("初始化腾讯云OCR客户端,日志级别: %s", logging.getLevelName(log_level)) + try: + # 实例化认证对象 + self.cred = credential.Credential(secret_id, secret_key, token) + self.logger.debug("认证对象创建成功") + # 配置HTTP和客户端选项 + http_profile = HttpProfile() + http_profile.endpoint = "ocr.tencentcloudapi.com" + client_profile = ClientProfile() + client_profile.http_profile = http_profile + self.client = ocr_client.OcrClient(self.cred, "", client_profile) + self.validate_url = ImageValidator() + self.logger.info("OCR客户端初始化完成") + except Exception as e: + self.logger.error(f"初始化失败: {str(e)}") + raise TencentCloudSDKException("初始化失败", str(e)) + + def recognize(self,ImageBase64,ImageUrl,IsPdf,PdfPageNumber,Type): + """' + :param ImageBase64: 图片/PDF的 Base64 值。要求图片经Base64编码后不超过 10M,分辨率建议600*800以上,支持PNG、JPG、JPEG、BMP、PDF格式。图片的 ImageUrl、ImageBase64 必须提供一个,如果都提供,只使用 ImageUrl。 + :param ImageUrl: 图片/PDF的 Url 地址。要求图片经Base64编码后不超过10M,分辨率建议600*800以上,支持PNG、JPG、JPEG、BMP、PDF格式。图片下载时间不超过 3 秒。图片存储于腾讯云的 Url 可保障更高的下载速度和稳定性,建议图片存储于腾讯云。非腾讯云存储的 Url 速度和稳定性可能受一定影响。 + :param IsPdf: 是否开启PDF识别,默认值为false,开启后可同时支持图片和PDF的识别。 + :param PdfPageNumber: 需要识别的PDF页面的对应页码,仅支持PDF单页识别,当上传文件为PDF且IsPdf参数值为true时有效,默认值为1。 + :param Type: 识别类型,可选值为General 通用告警(支持所有类型告警),LicensePlate 车牌告警(支持翻拍告警) + """ + try: + if (ImageBase64 is None or str(ImageBase64).strip() == "") and (ImageUrl is None or str(ImageUrl).strip() == ""): + error_msg = "ImageBase64和ImageUrl必须提供一个" + self.logger.error(error_msg) + raise ValueError(error_msg) + + if ImageUrl: + self.logger.debug("验证图片URL: %s", ImageUrl) + self.validate_url.validate_url(ImageUrl, ["png", "jpg", "jpeg"]) + self.logger.debug("图片URL验证通过") + self.logger.debug("图片Base64验证通过") + self.logger.info("开始处理请求") + self.logger.debug("请求参数: ImageUrl=%s, IsPdf=%s, PdfPageNumber=%s, Type=%s", + self.sanitize_log_data.sanitize_log_data(ImageUrl,50), + IsPdf, + PdfPageNumber, + Type) + self.validate.validate_id(Type, ["General", "LicensePlate"], "Type") + req = models.RecognizeGeneralTextImageWarnRequest() + params = { + "ImageBase64": ImageBase64, + "ImageUrl": ImageUrl, + "IsPdf": IsPdf, + "PdfPageNumber": PdfPageNumber, + "Type": Type + } + req.from_json_string(json.dumps(params)) + self.logger.info("正在向腾讯云OCR API发送请求...") + resp = self.client.RecognizeGeneralTextImageWarn(req) + self.logger.info("OCR识别请求成功完成") + self.logger.debug("响应数据: %s", self.sanitize_log_data.sanitize_log_data(resp.to_json_string(),50)) + return resp.to_json_string() + + except TencentCloudSDKException as err: + self.logger.error(f"请求处理失败: {str(err)}", exc_info=True) + raise err + except Exception as e: + self.logger.error(f"处理OCR请求时发生意外错误: {str(e)}", exc_info=True) + raise TencentCloudSDKException("请求处理失败", str(e)) \ No newline at end of file diff --git a/mzapi/tencent/ocr/__init__.py b/mzapi/tencent/ocr/__init__.py index 2d2cc45..3570b72 100644 --- a/mzapi/tencent/ocr/__init__.py +++ b/mzapi/tencent/ocr/__init__.py @@ -1,2 +1,3 @@ from .GeneralBasicOCR import * -from .GeneralAccurateOCR import * \ No newline at end of file +from .GeneralAccurateOCR import * +from .RecognizeGeneralTextImageWarn import * \ No newline at end of file diff --git a/mzapi/utlis/ImageValidator.py b/mzapi/utlis/ImageValidator.py index f27c61d..98d89d4 100644 --- a/mzapi/utlis/ImageValidator.py +++ b/mzapi/utlis/ImageValidator.py @@ -1,8 +1,9 @@ # -*- coding: utf-8 -*- import re +from typing import List from urllib.parse import urlparse -from typing import Optional, List + class ImageValidator: @staticmethod diff --git a/mzapi/utlis/verification.py b/mzapi/utlis/verification.py new file mode 100644 index 0000000..2697ece --- /dev/null +++ b/mzapi/utlis/verification.py @@ -0,0 +1,25 @@ +class Verification: + @staticmethod + def sanitize_log_data(data, max_length=100): + """处理日志中的敏感数据 + 1. 如果是Base64数据,只显示最后10个字符并标记 + 2. 长字符串自动截断并标记 + :param data: 需要处理的数据 + :param max_length: 最大长度,超过该长度将被截断 + """ + if data is None: + return None + if isinstance(data, str): + if len(data) > max_length and 'base64' in data.lower(): + # 处理Base64数据 + return data[-20:] if len(data) > 100 else data[-10:] + elif len(data) > max_length: + # 处理长字符串 + if isinstance(data, str): + truncated = data[:max_length] + # 确保截断不会破坏UTF-8字符 + while len(truncated.encode('utf-8')) > max_length: + truncated = truncated[:-1] + return truncated + return data + return data \ No newline at end of file diff --git a/yilai.txt b/yilai.txt new file mode 100644 index 0000000..ad01374 --- /dev/null +++ b/yilai.txt @@ -0,0 +1,852 @@ +alibabacloud_abfs20211230 +alibabacloud_acc20240402 +alibabacloud_accountcenter20241209 +alibabacloud_acm20200206 +alibabacloud_actiontrail20150928 +alibabacloud_actiontrail20171204 +alibabacloud_actiontrail20200706 +alibabacloud_adb20190315 +alibabacloud_adb20211201 +alibabacloud_adb_inc20211201 +alibabacloud_adcp20220101 +alibabacloud_address_purification20191118 +alibabacloud_adp20210720 +alibabacloud_advisor20180120 +alibabacloud_aegis20161111 +alibabacloud_agency20221216 +alibabacloud_agency20250227 +alibabacloud_ahas_openapi20190901 +alibabacloud_aiccs20191015 +alibabacloud_aiccs20230516 +alibabacloud_aicontent20240611 +alibabacloud_aiearth_engine20220609 +alibabacloud_aiearth_meteorology20210928 +alibabacloud_aiearth_meteorology20220118 +alibabacloud_aiearth_meteorology20220322 +alibabacloud_aigen20240111 +alibabacloud_ailab_vision_public20210709 +alibabacloud_aimath20241114 +alibabacloud_aimiaobi20230801 +alibabacloud_aiops20200806 +alibabacloud_aipodcast20250228 +alibabacloud_airec20181012 +alibabacloud_airec20201126 +alibabacloud_airticketopen20230117 +alibabacloud_aisearch20230101 +alibabacloud_aiworkspace20210204 +alibabacloud_alb20200616 +alibabacloud_alicloudproc20240104 +alibabacloud_aliding20230426 +alibabacloud_alidns20150109 +alibabacloud_aligenieiap_1_0 +alibabacloud_aligenieip_1_0 +alibabacloud_aligenieoauth2_1_0 +alibabacloud_aligeniessp_1_0 +alibabacloud_alikafka20181015 +alibabacloud_alikafka20190916 +alibabacloud_alimt20180807 +alibabacloud_alimt20181012 +alibabacloud_alimt20190102 +alibabacloud_alimt20190107 +alibabacloud_alinlp20200629 +alibabacloud_aliyunape20210908 +alibabacloud_aliyunid_ag20180912 +alibabacloud_amqp_open20191212 +alibabacloud_antiddos_public20170518 +alibabacloud_antirisk20221128 +alibabacloud_apds20220331 +alibabacloud_apig20240327 +alibabacloud_appflow20230904 +alibabacloud_appstream_center20210218 +alibabacloud_appstream_center20210220 +alibabacloud_appstream_center20210901 +alibabacloud_appstream_center20210903 +alibabacloud_aps20240325 +alibabacloud_aps20250421 +alibabacloud_arms20161125 +alibabacloud_arms20190808 +alibabacloud_arms20210422 +alibabacloud_arms20210519 +alibabacloud_avatar20220130 +alibabacloud_avds20171129 +alibabacloud_baas20180731 +alibabacloud_baas20181221 +alibabacloud_baasdis20200509 +alibabacloud_bailian20230601 +alibabacloud_bailian20231229 +alibabacloud_bailianchatbot20241105 +alibabacloud_bailianmodelonchip20240816 +alibabacloud_batchcompute20151111 +alibabacloud_batchcompute20181213 +alibabacloud_bdrc20230808 +alibabacloud_beian20160810 +alibabacloud_bizworks20210408 +alibabacloud_bpstudio20200710 +alibabacloud_bpstudio20210931 +alibabacloud_brain_industrial20200920 +alibabacloud_bss20140714 +alibabacloud_bssopenapi20171214 +alibabacloud_bssopenapi20230930 +alibabacloud_btripopen20220517 +alibabacloud_btripopen20220520 +alibabacloud_buss20160718 +alibabacloud_buss20220822 +alibabacloud_cams20200606 +alibabacloud_captcha20230305 +alibabacloud_carbonfootprint20230711 +alibabacloud_cas20180713 +alibabacloud_cas20180813 +alibabacloud_cas20200407 +alibabacloud_cas20200619 +alibabacloud_cas20200630 +alibabacloud_cassandra20190101 +alibabacloud_cbn20170912 +alibabacloud_cc5g20220314 +alibabacloud_ccc20170705 +alibabacloud_ccc20200527 +alibabacloud_ccc20200701 +alibabacloud_cciotgw20210721 +alibabacloud_cd2021127 +alibabacloud_cddc20200320 +alibabacloud_cdn20141111 +alibabacloud_cdn20180510 +alibabacloud_cdp20210402 +alibabacloud_cdrs20201101 +alibabacloud_cdt20210813 +alibabacloud_cgcs20211111 +alibabacloud_chatbot20171011 +alibabacloud_chatbot20220408 +alibabacloud_ciomarketpop20250709 +alibabacloud_cityvisual20181030 +alibabacloud_clickhouse20191111 +alibabacloud_clickhouse20220101 +alibabacloud_clickhouse20230522 +alibabacloud_cloud_siem20220616 +alibabacloud_cloudapi20160201 +alibabacloud_cloudapi20160701 +alibabacloud_cloudapi20160714 +alibabacloud_cloudapi20180601 +alibabacloud_cloudapi20180901 +alibabacloud_cloudauth20190307 +alibabacloud_cloudauth20200618 +alibabacloud_cloudauth20201112 +alibabacloud_cloudauth20221125 +alibabacloud_cloudauth_console20190219 +alibabacloud_cloudauth_console20190403 +alibabacloud_cloudauth_intl20220809 +alibabacloud_cloudcallcenter20200701 +alibabacloud_cloudcontrol20220606 +alibabacloud_cloudcontrol20220830 +alibabacloud_cloudesl20190801 +alibabacloud_cloudesl20200201 +alibabacloud_cloudfw20171207 +alibabacloud_cloudgameapi20200728 +alibabacloud_cloudphone20201230 +alibabacloud_cloudphoto20170711 +alibabacloud_cloudsso20210515 +alibabacloud_cloudwifi_pop20191118 +alibabacloud_cmn20200825 +alibabacloud_cms20180308 +alibabacloud_cms20190101 +alibabacloud_cms20240330 +alibabacloud_cms_export20211101 +alibabacloud_cnip20201201 +alibabacloud_codeup20200414 +alibabacloud_companyreg20200306 +alibabacloud_composer20181212 +alibabacloud_computenest20210601 +alibabacloud_computenestsupplier20210521 +alibabacloud_config20190108 +alibabacloud_config20200907 +alibabacloud_consolecs20160406 +alibabacloud_contactcenterai20240603 +alibabacloud_cr20160607 +alibabacloud_cr20181201 +alibabacloud_cs20151215 +alibabacloud_cs20180418 +alibabacloud_csas20230120 +alibabacloud_csp20201020 +alibabacloud_customerservice20231228 +alibabacloud_das20200116 +alibabacloud_dashdeviceconsole20250408 +alibabacloud_dataanalysisgbi20240823 +alibabacloud_databot20200330 +alibabacloud_datalake20200710 +alibabacloud_datalake20200831 +alibabacloud_dataphin_public20230630 +alibabacloud_dataworks_public20180601 +alibabacloud_dataworks_public20200518 +alibabacloud_dataworks_public20240518 +alibabacloud_dbfs20200418 +alibabacloud_dbs20190306 +alibabacloud_dbs20210101 +alibabacloud_dcdn20180115 +alibabacloud_ddi20200617 +alibabacloud_ddosbgp20171120 +alibabacloud_ddosbgp20180201 +alibabacloud_ddosbgp20180720 +alibabacloud_ddoscoo20171228 +alibabacloud_ddoscoo20200101 +alibabacloud_ddosdiversion20230701 +alibabacloud_ddospro20170725 +alibabacloud_dds20151201 +alibabacloud_devops20210625 +alibabacloud_devops_rdc20200303 +alibabacloud_devs20230714 +alibabacloud_dfs20180620 +alibabacloud_dg20190327 +alibabacloud_dianjin20240628 +alibabacloud_dlfnext20250310 +alibabacloud_dm20151123 +alibabacloud_dm20170622 +alibabacloud_dms20250414 +alibabacloud_dms_dg20230914 +alibabacloud_dms_enterprise20181101 +alibabacloud_dms_yaochi_portal20230206 +alibabacloud_docmind_api20220711 +alibabacloud_docmind_api20220729 +alibabacloud_documentautoml20221229 +alibabacloud_domain20180129 +alibabacloud_domain20180208 +alibabacloud_domain_intl20171218 +alibabacloud_dplus20201216 +alibabacloud_drds20171016 +alibabacloud_drds20190123 +alibabacloud_dt_oc_info20220829 +alibabacloud_dts20160801 +alibabacloud_dts20190901 +alibabacloud_dts20200101 +alibabacloud_dtsrs20151124 +alibabacloud_dybaseapi20170525 +alibabacloud_dycdpapi20180610 +alibabacloud_dyiotapi20171111 +alibabacloud_dypls20170830 +alibabacloud_dyplsapi20170525 +alibabacloud_dypnsapi20170525 +alibabacloud_dypnsapi_intl20170725 +alibabacloud_dysms20170620 +alibabacloud_dysmsapi20170525 +alibabacloud_dysmsapi20180501 +alibabacloud_dytnsapi20200217 +alibabacloud_dytnsapi20230101 +alibabacloud_dyvmsapi20170525 +alibabacloud_dyvmsapi_intl20211015 +alibabacloud_eais20190624 +alibabacloud_eas20210701 +alibabacloud_easygene20210315 +alibabacloud_ebs20210730 +alibabacloud_ecd20200930 +alibabacloud_ecd20201001 +alibabacloud_ecd20201002 +alibabacloud_eci20180808 +alibabacloud_ecs20140526 +alibabacloud_ecs_workbench20220220 +alibabacloud_edas20160816 +alibabacloud_edas20170405 +alibabacloud_eds_aic20230930 +alibabacloud_eds_user20210308 +alibabacloud_edsofficeservice20221125 +alibabacloud_eduaiservice20231218 +alibabacloud_eduembed20240101 +alibabacloud_eduinterpreting20240828 +alibabacloud_edututor20250707 +alibabacloud_eflo20220530 +alibabacloud_eflo_cnp20230828 +alibabacloud_eflo_controller20221215 +alibabacloud_ehpc20170714 +alibabacloud_ehpc20180412 +alibabacloud_ehpc20230701 +alibabacloud_ehpc20240730 +alibabacloud_ehpcinstant20230701 +alibabacloud_eiam20211201 +alibabacloud_eiam_developerapi20220225 +alibabacloud_eipanycast20200309 +alibabacloud_ekyc_saas20230112 +alibabacloud_elasticsearch20170613 +alibabacloud_elasticsearch20190422 +alibabacloud_emas_appmonitor20190611 +alibabacloud_emr20160408 +alibabacloud_emr20210320 +alibabacloud_emr_serverless_spark20230808 +alibabacloud_emrstudio20231009 +alibabacloud_emrstudio20240430 +alibabacloud_energyexpertexternal20220923 +alibabacloud_ens20171110 +alibabacloud_es_serverless20220822 +alibabacloud_es_serverless20230627 +alibabacloud_esa20240910 +alibabacloud_ess20140828 +alibabacloud_ess20160722 +alibabacloud_ess20220222 +alibabacloud_et_industry_openapi20200824 +alibabacloud_et_industry_openapi20210105 +alibabacloud_ettrafficisp20230830 +alibabacloud_eventbridge20200401 +alibabacloud_expressconnectrouter20230901 +alibabacloud_face20181203 +alibabacloud_facebody20191230 +alibabacloud_facebody20200910 +alibabacloud_farui20240628 +alibabacloud_fc20230330 +alibabacloud_fc_open20210406 +alibabacloud_fnf20190315 +alibabacloud_foasconsole20190601 +alibabacloud_foasconsole20211028 +alibabacloud_ga20191120 +alibabacloud_gameshield20180305 +alibabacloud_gdb20190903 +alibabacloud_gemp20210413 +alibabacloud_geoip20200101 +alibabacloud_globalsearch20210110 +alibabacloud_goodstech20191230 +alibabacloud_governance20210120 +alibabacloud_gpdb20160503 +alibabacloud_gpdb20190620 +alibabacloud_grace20220606 +alibabacloud_green20170823 +alibabacloud_green20180509 +alibabacloud_green20220302 +alibabacloud_green20220926 +alibabacloud_gwlb20240415 +alibabacloud_gws20190618 +alibabacloud_hbase20170115 +alibabacloud_hbase20190101 +alibabacloud_hbr20170908 +alibabacloud_hcs_mgw20171024 +alibabacloud_hcs_mgw20240626 +alibabacloud_hdr20170925 +alibabacloud_hitsdb20170601 +alibabacloud_hitsdb20200615 +alibabacloud_hologram20220601 +alibabacloud_holowatcher20200730 +alibabacloud_hsm20231113 +alibabacloud_httpdns20160201 +alibabacloud_iacservice20210722 +alibabacloud_iacservice20210806 +alibabacloud_ice20201109 +alibabacloud_idaas_doraemon20210520 +alibabacloud_idrsservice20200630 +alibabacloud_igraph20210621 +alibabacloud_image_detect20211221 +alibabacloud_imageaudit20191230 +alibabacloud_imageenhan20190930 +alibabacloud_imageprocess20200320 +alibabacloud_imagerecog20190930 +alibabacloud_imagesearch20190325 +alibabacloud_imagesearch20200212 +alibabacloud_imagesearch20201214 +alibabacloud_imagesearch20210120 +alibabacloud_imagesearch20210501 +alibabacloud_imageseg20191230 +alibabacloud_imarketing20220704 +alibabacloud_imgsearch20200320 +alibabacloud_imm20170906 +alibabacloud_imm20200930 +alibabacloud_imp20210630 +alibabacloud_imp_room20210515 +alibabacloud_ims20190815 +alibabacloud_indvi20190701 +alibabacloud_intelligentcreation20240118 +alibabacloud_intelligentcreation20240313 +alibabacloud_intelligentcreation20241107 +alibabacloud_intelligentcreation20250301 +alibabacloud_intlmarket20250812 +alibabacloud_iot20180120 +alibabacloud_iotcc20210513 +alibabacloud_iovcc20180501 +alibabacloud_iqa20190813 +alibabacloud_iqs20240712 +alibabacloud_iqs20241111 +alibabacloud_ivision20190308 +alibabacloud_ivpd20190625 +alibabacloud_jarvis20180206 +alibabacloud_jarvis_public20180621 +alibabacloud_kms20160120 +alibabacloud_ledgerdb20191122 +alibabacloud_lingmou20250527 +alibabacloud_linkcard20210520 +alibabacloud_linkedmall20180116 +alibabacloud_linkedmall20220531 +alibabacloud_linkedmall20230608 +alibabacloud_linkedmall20230930 +alibabacloud_linkedmallretrieval20240501 +alibabacloud_linkedmallretrieval20240930 +alibabacloud_linkface20180720 +alibabacloud_linkvisual20180120 +alibabacloud_linkvisual20230630 +alibabacloud_linkwan20181030 +alibabacloud_live20161101 +alibabacloud_live_interaction20201214 +alibabacloud_location20150612 +alibabacloud_logiccomposer20181212 +alibabacloud_ltl20190510 +alibabacloud_lvwangwatermark20210104 +alibabacloud_market20151101 +alibabacloud_marketing_event20210101 +alibabacloud_marketplaceintl20221230 +alibabacloud_maxcompute20220104 +alibabacloud_metaspace20220307 +alibabacloud_mhub20170825 +alibabacloud_microgw20200810 +alibabacloud_milvus20231012 +alibabacloud_mindlive20210301 +alibabacloud_miniapplcdp20200113 +alibabacloud_mns_open20220119 +alibabacloud_mobi20240411 +alibabacloud_modelservice20220614 +alibabacloud_moguan_sdk20210415 +alibabacloud_mpaas20200710 +alibabacloud_mpaas20201028 +alibabacloud_mpserverless20190615 +alibabacloud_msc20250427 +alibabacloud_msccommonquery20210407 +alibabacloud_mscopensubscription20210713 +alibabacloud_mse20190531 +alibabacloud_mseap20210118 +alibabacloud_mssp20161228 +alibabacloud_mts20140618 +alibabacloud_mts20180528 +alibabacloud_mts20210728 +alibabacloud_multimediaai20190810 +alibabacloud_nas20170626 +alibabacloud_nbf20211110_21312586 +alibabacloud_nbf_vpc_cloud20211115_131123360 +alibabacloud_nis20211216 +alibabacloud_nlb20220430 +alibabacloud_nlp20180408 +alibabacloud_nlp_automl20190529 +alibabacloud_nlp_automl20190701 +alibabacloud_nlp_automl20191111 +alibabacloud_notifications20241225 +alibabacloud_objectdet20191230 +alibabacloud_oceanbasepro20190901 +alibabacloud_ocr20191230 +alibabacloud_ocr_api20210707 +alibabacloud_oms20160615 +alibabacloud_ons20190214 +alibabacloud_onsmqtt20191211 +alibabacloud_onsmqtt20200420 +alibabacloud_oos20190601 +alibabacloud_oosops20190601 +alibabacloud_openanalytics_open20180619 +alibabacloud_openanalytics_open20200928 +alibabacloud_openapiexplorer20241130 +alibabacloud_openitag20220616 +alibabacloud_openplatform20191219 +alibabacloud_opensearch20171225 +alibabacloud_opt20210730 +alibabacloud_ossmfd20231017 +alibabacloud_osssddp20240222 +alibabacloud_ots20160620 +alibabacloud_outboundbot20191226 +alibabacloud_pai_dlc20201203 +alibabacloud_pai_dsw20210226 +alibabacloud_pai_dsw20220101 +alibabacloud_paiabtest20240119 +alibabacloud_paiautoml20220828 +alibabacloud_paidms20210106 +alibabacloud_paielasticdatasetaccelerator20220801 +alibabacloud_paifeaturestore20230621 +alibabacloud_paiflow20210202 +alibabacloud_paillmtrace20240311 +alibabacloud_paiplugin20210325 +alibabacloud_paiplugin20220112 +alibabacloud_pairecservice20221213 +alibabacloud_paistudio20210202 +alibabacloud_paistudio20220112 +alibabacloud_pcdn20170411 +alibabacloud_pds20220301 +alibabacloud_polardb20170801 +alibabacloud_polardbai20240820 +alibabacloud_polardbx20200202 +alibabacloud_privatelink20200415 +alibabacloud_pts20150801 +alibabacloud_pts20181111 +alibabacloud_pts20190522 +alibabacloud_pts20201020 +alibabacloud_push20160801 +alibabacloud_pvtz20180101 +alibabacloud_qianzhou20211111 +alibabacloud_qssj20220112 +alibabacloud_qt_change_service20211201 +alibabacloud_qualitycheck20190115 +alibabacloud_quanmiaolightapp20240801 +alibabacloud_quickbi_public20200806 +alibabacloud_quickbi_public20200808 +alibabacloud_quickbi_public20220101 +alibabacloud_quotas20200510 +alibabacloud_r_kvstore20150101 +alibabacloud_rai20240701 +alibabacloud_ram20150501 +alibabacloud_rdc20180821 +alibabacloud_rds20140815 +alibabacloud_rds_data20220330 +alibabacloud_rdsai20250507 +alibabacloud_resellertrade20191227 +alibabacloud_resourcecenter20221201 +alibabacloud_resourcedirectorymaster20220419 +alibabacloud_resourcemanager20161111 +alibabacloud_resourcemanager20200331 +alibabacloud_resourcesharing20200110 +alibabacloud_retailadvqa20230417 +alibabacloud_retailcloud20180313 +alibabacloud_rmc20211104 +alibabacloud_rocketmq20220801 +alibabacloud_ros20190910 +alibabacloud_rtc20180111 +alibabacloud_rtc_white_board20201214 +alibabacloud_sae20190506 +alibabacloud_saf20170331 +alibabacloud_saf20181130 +alibabacloud_saf20190521 +alibabacloud_safconsole20210112 +alibabacloud_safe20220116 +alibabacloud_safe20220117 +alibabacloud_sas20160316 +alibabacloud_sas20181203 +alibabacloud_sas20210114 +alibabacloud_sasrasp20240727 +alibabacloud_sasti20200512 +alibabacloud_scdn20171115 +alibabacloud_schedulerx220190430 +alibabacloud_schedulerx320240624 +alibabacloud_scsp20200702 +alibabacloud_sddp20190103 +alibabacloud_searchengine20211025 +alibabacloud_searchplat20240529 +alibabacloud_selectdb20230522 +alibabacloud_serverless20210924 +alibabacloud_servicecatalog20210901 +alibabacloud_servicemesh20200111 +alibabacloud_sgw20180511 +alibabacloud_sgx_dcap_server20200726 +alibabacloud_slb20140515 +alibabacloud_slbv220220430 +alibabacloud_sls20201230 +alibabacloud_smartag20180313 +alibabacloud_smc20190601 +alibabacloud_sms_intl20180501 +alibabacloud_snapshot20201118 +alibabacloud_snapshot20210315 +alibabacloud_snsu20180710 +alibabacloud_snsuapi20180709 +alibabacloud_sophonsoar20220728 +alibabacloud_speechfiletranscriberlite20211221 +alibabacloud_starrocks20221019 +alibabacloud_status20200117 +alibabacloud_sts20150401 +alibabacloud_superappnlp20240930 +alibabacloud_support_plan20210706 +alibabacloud_swas_open20200601 +alibabacloud_sysom20231230 +alibabacloud_tablestore20201209 +alibabacloud_tag20180828 +alibabacloud_taihao20210331 +alibabacloud_tdsr20200101 +alibabacloud_teambition_aliyun20200226 +alibabacloud_threedvision20210131 +alibabacloud_tingwu20220930 +alibabacloud_tingwu20230930 +alibabacloud_trademark20180724 +alibabacloud_trademark20190902 +alibabacloud_trafficfxopen20240815 +alibabacloud_trusted_server20200613 +alibabacloud_tunnel_service20210509 +alibabacloud_uis20180821 +alibabacloud_uisplus20200707 +alibabacloud_um_test20211027 +alibabacloud_umeng_apm20220214 +alibabacloud_umeng_finplus20211125 +alibabacloud_umeng_finplus20211130 +alibabacloud_umeng_push20220225 +alibabacloud_umeng_verify_agent20240131 +alibabacloud_vcs20190430 +alibabacloud_vcs20200515 +alibabacloud_vdc20201214 +alibabacloud_vdmeter20210425 +alibabacloud_ververica20220718 +alibabacloud_viapi20210930 +alibabacloud_viapi20230117 +alibabacloud_viapi_oxs_cross20200701 +alibabacloud_viapi_regen20211119 +alibabacloud_videoenhan20200320 +alibabacloud_videorecog20200320 +alibabacloud_videosearch20200225 +alibabacloud_videoseg20200320 +alibabacloud_vod20170321 +alibabacloud_voicenavigator20180612 +alibabacloud_vpc20160428 +alibabacloud_vpcipam20230228 +alibabacloud_vpcpeer20220101 +alibabacloud_vs20181212 +alibabacloud_waf_openapi20170930 +alibabacloud_waf_openapi20180117 +alibabacloud_waf_openapi20190910 +alibabacloud_waf_openapi20211001 +alibabacloud_webplus20190320 +alibabacloud_websitebuild20250429 +alibabacloud_workorder20200326 +alibabacloud_workorder20210610 +alibabacloud_wss20211221 +alibabacloud_wuyingsolutionframework20230810 +alibabacloud_wyota20210420 +alibabacloud_xgippop20220520 +alibabacloud_xrengine20221111 +alibabacloud_xrengine20230313 +alibabacloud_xtee20210910 +alibabacloud_xtrace20190808 +alibabacloud_yicconsole20240118 +alibabacloud_yundun_bastionhost20191209 +alibabacloud_yundun_dbaudit20180320 +alibabacloud_yundun_dbaudit20181029 +alibabacloud_yundun_dbaudit20191209 +alibabacloud_yundun_dbaudit20210416 +alibabacloud_yunjian20211217 +alibabacloud_yuqing20220301 +tencentcloud-sdk-python-aai +tencentcloud-sdk-python-aca +tencentcloud-sdk-python-acp +tencentcloud-sdk-python-advisor +tencentcloud-sdk-python-af +tencentcloud-sdk-python-afc +tencentcloud-sdk-python-ai3d +tencentcloud-sdk-python-aiart +tencentcloud-sdk-python-ame +tencentcloud-sdk-python-ams +tencentcloud-sdk-python-anicloud +tencentcloud-sdk-python-antiddos +tencentcloud-sdk-python-ape +tencentcloud-sdk-python-api +tencentcloud-sdk-python-apigateway +tencentcloud-sdk-python-apm +tencentcloud-sdk-python-asr +tencentcloud-sdk-python-asw +tencentcloud-sdk-python-autoscaling +tencentcloud-sdk-python-ba +tencentcloud-sdk-python-batch +tencentcloud-sdk-python-bda +tencentcloud-sdk-python-bh +tencentcloud-sdk-python-bi +tencentcloud-sdk-python-billing +tencentcloud-sdk-python-bizlive +tencentcloud-sdk-python-bm +tencentcloud-sdk-python-bma +tencentcloud-sdk-python-bmeip +tencentcloud-sdk-python-bmlb +tencentcloud-sdk-python-bmvpc +tencentcloud-sdk-python-bpaas +tencentcloud-sdk-python-bri +tencentcloud-sdk-python-bsca +tencentcloud-sdk-python-btoe +tencentcloud-sdk-python-ca +tencentcloud-sdk-python-cam +tencentcloud-sdk-python-captcha +tencentcloud-sdk-python-car +tencentcloud-sdk-python-cat +tencentcloud-sdk-python-cbs +tencentcloud-sdk-python-ccc +tencentcloud-sdk-python-cdb +tencentcloud-sdk-python-cdc +tencentcloud-sdk-python-cdn +tencentcloud-sdk-python-cds +tencentcloud-sdk-python-cdwch +tencentcloud-sdk-python-cdwdoris +tencentcloud-sdk-python-cdwpg +tencentcloud-sdk-python-cdz +tencentcloud-sdk-python-cfg +tencentcloud-sdk-python-cfs +tencentcloud-sdk-python-cfw +tencentcloud-sdk-python-chc +tencentcloud-sdk-python-chdfs +tencentcloud-sdk-python-ciam +tencentcloud-sdk-python-cii +tencentcloud-sdk-python-cim +tencentcloud-sdk-python-ckafka +tencentcloud-sdk-python-clb +tencentcloud-sdk-python-cloudapp +tencentcloud-sdk-python-cloudaudit +tencentcloud-sdk-python-cloudhsm +tencentcloud-sdk-python-cloudstudio +tencentcloud-sdk-python-cls +tencentcloud-sdk-python-cme +tencentcloud-sdk-python-cmq +tencentcloud-sdk-python-cms +tencentcloud-sdk-python-common +tencentcloud-sdk-python-config +tencentcloud-sdk-python-controlcenter +tencentcloud-sdk-python-cpdp +tencentcloud-sdk-python-csip +tencentcloud-sdk-python-csxg +tencentcloud-sdk-python-ctem +tencentcloud-sdk-python-ctsdb +tencentcloud-sdk-python-cvm +tencentcloud-sdk-python-cwp +tencentcloud-sdk-python-cws +tencentcloud-sdk-python-cynosdb +tencentcloud-sdk-python-dasb +tencentcloud-sdk-python-dayu +tencentcloud-sdk-python-dbbrain +tencentcloud-sdk-python-dbdc +tencentcloud-sdk-python-dc +tencentcloud-sdk-python-dcdb +tencentcloud-sdk-python-dlc +tencentcloud-sdk-python-dnspod +tencentcloud-sdk-python-domain +tencentcloud-sdk-python-drm +tencentcloud-sdk-python-ds +tencentcloud-sdk-python-dsgc +tencentcloud-sdk-python-dts +tencentcloud-sdk-python-eb +tencentcloud-sdk-python-ecc +tencentcloud-sdk-python-ecdn +tencentcloud-sdk-python-ecm +tencentcloud-sdk-python-eiam +tencentcloud-sdk-python-eis +tencentcloud-sdk-python-emr +tencentcloud-sdk-python-es +tencentcloud-sdk-python-ess +tencentcloud-sdk-python-essbasic +tencentcloud-sdk-python-facefusion +tencentcloud-sdk-python-faceid +tencentcloud-sdk-python-fmu +tencentcloud-sdk-python-ft +tencentcloud-sdk-python-gaap +tencentcloud-sdk-python-gme +tencentcloud-sdk-python-goosefs +tencentcloud-sdk-python-gs +tencentcloud-sdk-python-gwlb +tencentcloud-sdk-python-habo +tencentcloud-sdk-python-hai +tencentcloud-sdk-python-hasim +tencentcloud-sdk-python-hcm +tencentcloud-sdk-python-hunyuan +tencentcloud-sdk-python-iai +tencentcloud-sdk-python-iap +tencentcloud-sdk-python-ic +tencentcloud-sdk-python-icr +tencentcloud-sdk-python-ie +tencentcloud-sdk-python-ig +tencentcloud-sdk-python-igtm +tencentcloud-sdk-python-ims +tencentcloud-sdk-python-ioa +tencentcloud-sdk-python-iot +tencentcloud-sdk-python-iotcloud +tencentcloud-sdk-python-iotexplorer +tencentcloud-sdk-python-iotvideo +tencentcloud-sdk-python-iotvideoindustry +tencentcloud-sdk-python-irp +tencentcloud-sdk-python-iss +tencentcloud-sdk-python-ivld +tencentcloud-sdk-python-keewidb +tencentcloud-sdk-python-kms +tencentcloud-sdk-python-lcic +tencentcloud-sdk-python-lighthouse +tencentcloud-sdk-python-live +tencentcloud-sdk-python-lke +tencentcloud-sdk-python-lkeap +tencentcloud-sdk-python-lowcode +tencentcloud-sdk-python-mall +tencentcloud-sdk-python-mariadb +tencentcloud-sdk-python-market +tencentcloud-sdk-python-memcached +tencentcloud-sdk-python-mmps +tencentcloud-sdk-python-mna +tencentcloud-sdk-python-mongodb +tencentcloud-sdk-python-monitor +tencentcloud-sdk-python-mps +tencentcloud-sdk-python-mqtt +tencentcloud-sdk-python-mrs +tencentcloud-sdk-python-ms +tencentcloud-sdk-python-msp +tencentcloud-sdk-python-nlp +tencentcloud-sdk-python-npp +tencentcloud-sdk-python-oceanus +tencentcloud-sdk-python-ocr +tencentcloud-sdk-python-omics +tencentcloud-sdk-python-organization +tencentcloud-sdk-python-partners +tencentcloud-sdk-python-postgres +tencentcloud-sdk-python-privatedns +tencentcloud-sdk-python-pts +tencentcloud-sdk-python-rce +tencentcloud-sdk-python-redis +tencentcloud-sdk-python-region +tencentcloud-sdk-python-rum +tencentcloud-sdk-python-scf +tencentcloud-sdk-python-securitylake +tencentcloud-sdk-python-ses +tencentcloud-sdk-python-smh +tencentcloud-sdk-python-smop +tencentcloud-sdk-python-sms +tencentcloud-sdk-python-soe +tencentcloud-sdk-python-sqlserver +tencentcloud-sdk-python-ssa +tencentcloud-sdk-python-ssl +tencentcloud-sdk-python-sslpod +tencentcloud-sdk-python-ssm +tencentcloud-sdk-python-sts +tencentcloud-sdk-python-svp +tencentcloud-sdk-python-taf +tencentcloud-sdk-python-tag +tencentcloud-sdk-python-tat +tencentcloud-sdk-python-tbaas +tencentcloud-sdk-python-tbp +tencentcloud-sdk-python-tcaplusdb +tencentcloud-sdk-python-tcb +tencentcloud-sdk-python-tcbr +tencentcloud-sdk-python-tccatalog +tencentcloud-sdk-python-tchd +tencentcloud-sdk-python-tcm +tencentcloud-sdk-python-tcr +tencentcloud-sdk-python-tcss +tencentcloud-sdk-python-tdcpg +tencentcloud-sdk-python-tdid +tencentcloud-sdk-python-tdmq +tencentcloud-sdk-python-tds +tencentcloud-sdk-python-tem +tencentcloud-sdk-python-teo +tencentcloud-sdk-python-thpc +tencentcloud-sdk-python-tia +tencentcloud-sdk-python-tiia +tencentcloud-sdk-python-tione +tencentcloud-sdk-python-tiw +tencentcloud-sdk-python-tke +tencentcloud-sdk-python-tkgdq +tencentcloud-sdk-python-tms +tencentcloud-sdk-python-tmt +tencentcloud-sdk-python-tourism +tencentcloud-sdk-python-trabbit +tencentcloud-sdk-python-trocket +tencentcloud-sdk-python-trp +tencentcloud-sdk-python-trro +tencentcloud-sdk-python-trtc +tencentcloud-sdk-python-tse +tencentcloud-sdk-python-tsf +tencentcloud-sdk-python-tsi +tencentcloud-sdk-python-tsw +tencentcloud-sdk-python-tts +tencentcloud-sdk-python-vcg +tencentcloud-sdk-python-vclm +tencentcloud-sdk-python-vcube +tencentcloud-sdk-python-vdb +tencentcloud-sdk-python-vm +tencentcloud-sdk-python-vms +tencentcloud-sdk-python-vod +tencentcloud-sdk-python-vpc +tencentcloud-sdk-python-vrs +tencentcloud-sdk-python-vtc +tencentcloud-sdk-python-waf +tencentcloud-sdk-python-wav +tencentcloud-sdk-python-wedata +tencentcloud-sdk-python-weilingwith +tencentcloud-sdk-python-wsa +tencentcloud-sdk-python-wss +tencentcloud-sdk-python-yinsuda +tencentcloud-sdk-python-yunjing +tencentcloud-sdk-python-yunsou +huaweicloudsdkall +qianfan +openai +volcengine-python-sdk +jdcloud_sdk +kingsoftcloud-sdk-python \ No newline at end of file From ba0eb74307a4bddb270a02e22b9cc23bb688ec1f Mon Sep 17 00:00:00 2001 From: qixiaoxin Date: Fri, 5 Sep 2025 00:11:05 +0800 Subject: [PATCH 2/2] =?UTF-8?q?refactor(mzapi):=20=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E5=B9=B6=E6=B7=BB=E5=8A=A0=E6=96=B0=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit -新增目录 baidu,用于存放百度相关代码 - 新增 RecognizeGeneralTextImageWarn 功能 - 重构日志记录,提高安全性 - 更新项目结构,删除冗余代码 - 优化 GitHub Actions 工作流 --- mzapi/__init__.py | 2 +- mzapi/baidu/authorization.py | 2 +- .../ocr/RecognizeGeneralTextImageWarn.py | 4 +-- mzapi/utlis/verification.py | 29 ++++++++++++------- requirements.txt | 1 + setup.py | 2 +- 6 files changed, 25 insertions(+), 15 deletions(-) diff --git a/mzapi/__init__.py b/mzapi/__init__.py index 055eeef..d27d976 100644 --- a/mzapi/__init__.py +++ b/mzapi/__init__.py @@ -7,7 +7,7 @@ 一个MZAPI的python的SDK """ -__version__ = "0.0.5" +__version__ = "0.0.6" __author__ = "祁潇潇" __email__ = "qixiaoxin@stu.sqxy.edu.cn" diff --git a/mzapi/baidu/authorization.py b/mzapi/baidu/authorization.py index 354b85a..cbd8d83 100644 --- a/mzapi/baidu/authorization.py +++ b/mzapi/baidu/authorization.py @@ -8,5 +8,5 @@ def access_token(ak, sk): 'Content-Type': 'application/json', 'Accept': 'application/json' } - response = requests.get(url, headers=headers, data=payload) + response = requests.get(url, headers=headers, data=payload,timeout=30) return response.json().get("access_token") diff --git a/mzapi/tencent/ocr/RecognizeGeneralTextImageWarn.py b/mzapi/tencent/ocr/RecognizeGeneralTextImageWarn.py index c7abcd6..79d4e20 100644 --- a/mzapi/tencent/ocr/RecognizeGeneralTextImageWarn.py +++ b/mzapi/tencent/ocr/RecognizeGeneralTextImageWarn.py @@ -40,12 +40,12 @@ def __init__(self, secret_id=None, secret_key=None, token=None, log_level=None): # 只在没有处理器时添加处理器 if not self.logger.handlers: handler = logging.StreamHandler() - handler.setFormatter(logging.Formatter('%(pastime)s - %(name)s - %(levelness)s - %(message)s')) + handler.setFormatter(logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')) self.logger.addHandler(handler) else: # 确保现有处理器的格式一致 for h in self.logger.handlers: - h.setFormatter(logging.Formatter('%(pastime)s - %(name)s - %(levelness)s - %(message)s')) + h.setFormatter(logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')) self.logger.info("初始化腾讯云OCR客户端,日志级别: %s", logging.getLevelName(log_level)) try: # 实例化认证对象 diff --git a/mzapi/utlis/verification.py b/mzapi/utlis/verification.py index 2697ece..9313749 100644 --- a/mzapi/utlis/verification.py +++ b/mzapi/utlis/verification.py @@ -1,6 +1,6 @@ class Verification: @staticmethod - def sanitize_log_data(data, max_length=100): + def sanitize_log_data(data, max_length=100): """处理日志中的敏感数据 1. 如果是Base64数据,只显示最后10个字符并标记 2. 长字符串自动截断并标记 @@ -10,16 +10,25 @@ def sanitize_log_data(data, max_length=100): if data is None: return None if isinstance(data, str): - if len(data) > max_length and 'base64' in data.lower(): + # 改进的Base64检测逻辑 + is_base64 = ( + # 检测常见Base64前缀 + data.startswith(('data:image/', 'data:application/')) or + # 检测Base64编码特征 + (len(data) > 20 and + all(c in 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=' + for c in data[-20:]) and + len(data) % 4 == 0) + ) + + if len(data) > max_length and is_base64: # 处理Base64数据 - return data[-20:] if len(data) > 100 else data[-10:] + return f"[BASE64...{data[-10:]}]" elif len(data) > max_length: # 处理长字符串 - if isinstance(data, str): - truncated = data[:max_length] - # 确保截断不会破坏UTF-8字符 - while len(truncated.encode('utf-8')) > max_length: - truncated = truncated[:-1] - return truncated - return data + truncated = data[:max_length] + # 确保截断不会破坏UTF-8字符 + while len(truncated.encode('utf-8')) > max_length: + truncated = truncated[:-1] + return f"[TRUNCATED...{truncated}]" return data \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index f4e228e..1b8a1ce 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,3 @@ # 腾讯云SDK依赖 tencentcloud-sdk-python-tiia +tencentcloud-sdk-python-ocr \ No newline at end of file diff --git a/setup.py b/setup.py index f72a2a3..9674a8a 100644 --- a/setup.py +++ b/setup.py @@ -8,7 +8,7 @@ setup( name="mzapi-python", # 安装时使用的名称 - version="0.0.5", + version="0.0.6", author="祁潇潇", author_email="qixiaoxin@stu.sqxy.edu.cn", description="MZAPI的python的SDK",