troov_service.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. import json
  2. import time
  3. import requests
  4. from typing import List
  5. from fastapi import Depends
  6. from app.schemas.troov import TroovRate
  7. def pop_redis_value_session(redis_client):
  8. lua_script = '''
  9. local keys = redis.call('keys', 'session:*')
  10. local max_ttl = -1
  11. local max_key = nil
  12. for _, key in ipairs(keys) do
  13. local ttl = redis.call('ttl', key)
  14. if ttl > max_ttl then
  15. max_ttl = ttl
  16. max_key = key
  17. end
  18. end
  19. if max_key then
  20. local value = redis.call('get', max_key)
  21. redis.call('del', max_key)
  22. return {max_key, value, max_ttl}
  23. else
  24. return nil
  25. end
  26. '''
  27. result = redis_client.eval(lua_script, 0)
  28. return result
  29. def fetch_rate(session_dic, date):
  30. url = f"https://api.consulat.gouv.fr/api/team/621540d353069dec25bd0045/reservations/availability?name=Visas&date={date}&places=-5&matching=&maxCapacity=-5&sessionId={session_dic['session_id']}"
  31. headers = {
  32. 'accept': 'application/json, text/plain, */*',
  33. 'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8',
  34. 'origin': 'https://consulat.gouv.fr',
  35. 'referer': 'https://consulat.gouv.fr/en/ambassade-de-france-en-irlande/appointment?name=Visas',
  36. 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36',
  37. 'x-gouv-app-id': session_dic['x_gouv_app_id'],
  38. 'x-gouv-web': 'fr.gouv.consulat'
  39. }
  40. try:
  41. response = requests.get(url, headers=headers)
  42. return response.text
  43. except Exception as e:
  44. return f'Exception info={e}'
  45. def get_rate_by_date(redis_client, date: str) -> List[TroovRate]:
  46. """
  47. 核心业务逻辑:根据日期返回 Troov 预约信息
  48. """
  49. result = None
  50. while True:
  51. result = pop_redis_value_session(redis_client)
  52. if not result:
  53. time.sleep(1)
  54. continue
  55. break
  56. session_data = result[1]
  57. session_dic = json.loads(session_data)
  58. res = fetch_rate(session_dic, date)
  59. return json.loads(res)