send_sms.py 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. import os
  2. import logging
  3. import time
  4. import requests
  5. from .KdeConnect import KDEConnect
  6. from app.schemas.responses import AccessTokenResponse, SMSResponse
  7. def send_sms_from_api(url: str, login: str, pwd: str, device_name: str):
  8. """Connect to sms-server API to retreieve sms to be send and send them using kdeconnect-cli"""
  9. # Log in to API get access token
  10. response = requests.post(
  11. url + "/auth/access-token",
  12. data={"grant_type": "password", "username": login, "password": pwd},
  13. )
  14. authentication = AccessTokenResponse.model_validate(response.json())
  15. headers = {"Authorization": "Bearer " + authentication.access_token}
  16. # Notify the server you are trying to send sms
  17. requests.post(url + "/sms-sender/status", headers=headers)
  18. # List SMS to be sent
  19. response = requests.get(url + "/sms-sender/sms/to-send", headers=headers)
  20. sms_list: list[SMSResponse] = [SMSResponse.model_validate(obj) for obj in response.json()]
  21. logging.info(f"{len(sms_list):5} SMS a envoyer")
  22. # Init KDE Connect
  23. kde = KDEConnect(device_name=device_name)
  24. # send sms & update database
  25. for sms in sms_list:
  26. try:
  27. kde.send_sms(sms.phone_number, sms.content)
  28. requests.post(url + "sms-sender/sms/send-now/" + sms.id, headers=headers)
  29. except Exception as exc:
  30. logging.warning(f"Echec lors de l'envoie du sms {sms.id}\n{str(exc)}")
  31. time.sleep(5)
  32. class InvalidEnvironnementVariable(Exception):
  33. pass
  34. def get_env(key: str) -> str:
  35. """Get a variable from the environment or raise an InvalidEnvironnementVariable"""
  36. value = os.environ.get(key, None)
  37. if value is None:
  38. raise InvalidEnvironnementVariable(key)
  39. return value
  40. def main():
  41. API_URL = get_env("API_URL")
  42. API_LOGIN = get_env("API_LOGIN")
  43. API_PASSWORD = get_env("API_PASSWORD")
  44. DEVICE_NAME = get_env("DEVICE_NAME")
  45. send_sms_from_api(API_URL, API_LOGIN, API_PASSWORD, DEVICE_NAME)
  46. if __name__ == "__main__":
  47. logging.basicConfig(
  48. format="%(asctime)s %(levelname)s - %(message)s",
  49. level=logging.INFO,
  50. filemode="a",
  51. filename="log.txt",
  52. )
  53. while True:
  54. starting_time = time.time()
  55. try:
  56. main()
  57. except Exception:
  58. logging.exception("An error as occured : ")
  59. elapsed_time = time.time() - starting_time
  60. time.sleep(max(180 - elapsed_time, 0))