sms_service.py 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. import json
  2. import time
  3. import requests
  4. from typing import List
  5. from fastapi import Depends
  6. from app.schemas.sms import ShortMessageDetail
  7. def save_short_message(redis_client, phone: str, message: str, received_at: str, max_ttl: int) -> ShortMessageDetail:
  8. """
  9. 将短信保存到 Redis。
  10. 键格式: sms:{phone}
  11. 值为 JSON 数组(保存最近多条短信)
  12. """
  13. key = f"sms:{phone}"
  14. # 取出已有数据
  15. existing_data = redis_client.get(key)
  16. if existing_data:
  17. messages = json.loads(existing_data)
  18. else:
  19. messages = []
  20. # 添加新短信
  21. new_msg = ShortMessageDetail(phone=phone, message=message, received_at=received_at)
  22. messages.append(new_msg.dict())
  23. # 最多保留最近 20 条(可调整)
  24. messages = messages[-20:]
  25. # 保存回 Redis
  26. redis_client.setex(key, max_ttl, json.dumps(messages))
  27. return new_msg
  28. def query_short_message(redis_client, phone: str, keyword: str, sent_at: str) -> List[ShortMessageDetail]:
  29. """
  30. 从 Redis 查询短信。
  31. 支持按关键字和时间过滤。
  32. """
  33. key = f"sms:{phone}"
  34. existing_data = redis_client.get(key)
  35. if not existing_data:
  36. return []
  37. messages = [ShortMessageDetail(**m) for m in json.loads(existing_data)]
  38. # 关键字过滤
  39. if keyword:
  40. messages = [m for m in messages if keyword in m.message]
  41. # 时间过滤(如果需要更复杂可转为时间戳比较)
  42. if sent_at:
  43. messages = [m for m in messages if m.received_at >= sent_at]
  44. return messages