diff --git a/.env.example b/.env.example index a993663..43d2f73 100644 --- a/.env.example +++ b/.env.example @@ -15,4 +15,9 @@ LOG_LEVEL=debug # 控制日志级别: debug, info, warning, error, critical # 其他高级选项 # SSL_CERT_PATH=/path/to/cert.pem -# SSL_KEY_PATH=/path/to/key.pem \ No newline at end of file +# SSL_KEY_PATH=/path/to/key.pem + +# OpenAI相关配置 +AI_BASE_URL=https://api.deepseek.com/v1 +AI_KEY=sk-xxxx +AI_MODEL=depseek-chat \ No newline at end of file diff --git a/.gitea/workflows/build-image.yaml b/.gitea/workflows/build-image.yaml new file mode 100644 index 0000000..d2867c2 --- /dev/null +++ b/.gitea/workflows/build-image.yaml @@ -0,0 +1,53 @@ +name: BuildImage + +on: + push: + branches: + - main + +jobs: + build-image: + runs-on: ubuntu-latest + container: + # 使用这个镜像,不然Docker无法打包镜像 + image: catthehacker/ubuntu:act-latest + + steps: + - name: Checkout Code + uses: actions/checkout@v3 + + - name: Gen Tags + id: gen_tags + uses: docker/metadata-action@v5 + with: + images: gitee.ltd/lxh/sms-server + flavor: | + latest=true + tags: | + type=raw,value={{date 'YYYYMMDD' tz='Asia/Shanghai'}} + + - name: Print Tags + run: | + echo "${{ steps.gen_tags.outputs.tags }}" + echo "----------------- labels -----------------" + echo "${{ steps.meta.outputs.labels }}" + + - name: Login to Repository + uses: docker/login-action@v2 + with: + registry: gitee.ltd + username: ${{ secrets.USERNAME }} + password: ${{ secrets.PASSWORD }} + + - name: Build image + uses: docker/build-push-action@v6 + with: + push: true + no-cache: true + tags: ${{ steps.gen_tags.outputs.tags }} + labels: ${{ steps.gen_tags.outputs.labels }} + + - name: Clear images + run: | + docker images | grep "gitee.ltd/lxh/sms-server" + docker rmi -f $(docker images | grep "gitee.ltd/lxh/sms-server" | awk '{print $3}') diff --git a/Dockerfile b/Dockerfile index 8acda87..62108f9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,11 +2,8 @@ FROM python:3.9-slim WORKDIR /app -# 安装 git 用于拉取最新代码 -RUN apt-get update && apt-get install -y git && apt-get clean - -# 拉取最新代码(请确保仓库为public,否则需要处理身份验证) -RUN git clone https://github.com/nmhjklnm/sms_server.git . +# 复制代码 +COPY . . # 安装依赖 RUN pip install --no-cache-dir -r requirements.txt diff --git a/backend/config/settings.py b/backend/config/settings.py index 2761e19..3a3c973 100644 --- a/backend/config/settings.py +++ b/backend/config/settings.py @@ -9,6 +9,9 @@ class Settings(BaseSettings): host: str = os.getenv("HOST", "0.0.0.0") port: int = int(os.getenv("PORT", "8322")) log_level: str = os.getenv("LOG_LEVEL", "info").lower() + ai_base_url: str = os.getenv("AI_BASE_URL", "") + ai_api_key: str = os.getenv("AI_KEY", "") + ai_model: str = os.getenv("AI_MODEL", "") # 数据库配置 db_connect_args: Dict[str, Any] = {"check_same_thread": False} diff --git a/backend/services/functions.py b/backend/services/functions.py index cc49490..4807360 100644 --- a/backend/services/functions.py +++ b/backend/services/functions.py @@ -1,7 +1,21 @@ from typing import Optional import re +from openai import OpenAI + +from backend.config.settings import settings + + def extract_code_with_context(sms_content: str) -> Optional[str]: + # 判断AI相关的三个环境变量是否都有值 + # 如果有值,调用AI接口 + # 如果没有值,调用正则表达式 + if settings.ai_base_url != "" and settings.ai_api_key != "" and settings.ai_model != "": + return _extract_code_with_ai(sms_content) + else: + return _extract_code_with_reg(sms_content) + +def _extract_code_with_reg(sms_content: str) -> Optional[str]: pattern = r'(?:验证码|auth|code)[^0-9]{0,20}(\d{4,8})' match = re.search(pattern, sms_content, re.IGNORECASE) if match: @@ -9,6 +23,24 @@ def extract_code_with_context(sms_content: str) -> Optional[str]: fallback = re.findall(r'(\d{4,8})', sms_content) return fallback[0] if fallback else None +def _extract_code_with_ai(sms_content: str) -> Optional[str]: + client = OpenAI(api_key=settings.api_key, base_url=settings.ai_base_url) + response = client.chat.completions.create( + messages=[ + { + "role": "system", + "content": "你是一个验证码提取助手,我会告诉你短信内容,请将其中的验证码提取给我,只需要返回验证码即可,如果没有验证码,请返回null,不需要返回任何其他无关的内容。", + }, + { + "role": "user", + "content": sms_content, + } + ], + model=settings.ai_model, + ) + code = response.choices[0].message.content + return code if code != "null" else None + def extract_phone_from_sim_slot(sim_slot: Optional[str]) -> Optional[str]: if not sim_slot: return None diff --git a/requirements.txt b/requirements.txt index 9a271d8..8a13ff8 100644 --- a/requirements.txt +++ b/requirements.txt @@ -7,3 +7,4 @@ python-multipart>=0.0.5 aiosqlite>=0.17.0 jinja2>=3.1.6 python-dotenv>=0.19.0 +openai>=1.68.2 \ No newline at end of file