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: return match.group(1) 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 match = re.search(r'1\d{10}', sim_slot) if match: return match.group(0) return None