sms_service.py 1.5 KB

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