matacoder

Untitled

Sep 27th, 2020
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.83 KB | None | 0 0
  1. import os
  2. import requests
  3. import telegram
  4. import time
  5. from datetime import datetime
  6. from dotenv import load_dotenv
  7.  
  8. load_dotenv()
  9.  
  10.  
  11. PRACTICUM_TOKEN = os.getenv("PRACTICUM_TOKEN")
  12. TELEGRAM_TOKEN = os.getenv("TELEGRAM_TOKEN")
  13. CHAT_ID = os.getenv("TELEGRAM_CHAT_ID")
  14. quit_program = 0
  15.  
  16.  
  17. def parse_homework_status(homework):
  18.     homework_name = homework.get["homework_name"]
  19.     status = homework.get["status"]
  20.     if homework_name is None or status is None:
  21.         return "Ошибка распарсивания ответа от Практикума"
  22.  
  23.     if status != "approved":
  24.         verdict = "К сожалению в работе нашлись ошибки."
  25.     else:
  26.         verdict = ("Ревьюеру всё понравилось, можно"
  27.                    " приступать к следующему уроку.")
  28.         # если все хорошо, закрываем программу
  29.         global quit_program
  30.         quit_program = 1
  31.     return f'У вас проверили работу "{homework_name}"!\n\n{verdict}'
  32.  
  33.  
  34. def get_homework_statuses(current_timestamp):
  35.     url = "https://praktikum.yandex.ru/api/user_api/homework_statuses/"
  36.     headers = {"Authorization": f"OAuth {PRACTICUM_TOKEN}"}
  37.     params = {
  38.         "from_date": current_timestamp
  39.     }
  40.     try:
  41.         homework_statuses = requests.get(
  42.             url=url,
  43.             params=params,
  44.             headers=headers
  45.         )
  46.     except Exception as e:
  47.         send_message(f"Бот упал с ошибкой (получение статусов): {e}")
  48.     return homework_statuses.json()
  49.  
  50.  
  51. def send_message(message):
  52.     bot = telegram.Bot(TELEGRAM_TOKEN)
  53.     return bot.send_message(CHAT_ID, message)
  54.  
  55.  
  56. def friendly_date(timestamp):
  57.     return datetime.fromtimestamp(
  58.                 timestamp
  59.             ).strftime('%Y-%m-%d %H:%M:%S')
  60.  
  61.  
  62. def main():
  63.     send_message("Program is started successfully")
  64.     # по умолчанию проверям с начала дня,
  65.     # чтобы поймать случайно пропущенные статусы
  66.     # повторно в выдаче их уже не будет (период другой)
  67.     today = str(datetime.today().date())
  68.     current_timestamp = int(datetime.strptime(today, "%Y-%m-%d").timestamp())
  69.  
  70.     # эта версия была в прекоде
  71.     # current_timestamp = int(time.time())
  72.  
  73.     while True:
  74.         try:
  75.             new_homework = get_homework_statuses(current_timestamp)
  76.             # .get проверит тут, что API вернул нужный ответ
  77.             if new_homework.get("homeworks"):
  78.                 send_message(
  79.                     parse_homework_status(new_homework.get("homeworks")[0])
  80.                 )
  81.                 if (quit_program == 1):
  82.                     break
  83.             period_start = friendly_date(current_timestamp)
  84.             # проверим, корректный ли ответ сервера по дате
  85.             if new_homework.get("current_date") is not None:
  86.                 current_timestamp = new_homework.get("current_date")
  87.             # если некорректный, не будем обновлять переменную
  88.             period_end = friendly_date(current_timestamp)
  89.             send_message(f"Checked from {period_start} to {period_end}")
  90.             time.sleep(1200)  # опрашивать раз в 20 минут
  91.  
  92.         except Exception as e:
  93.             # так как неоднократно ловились разные варианты
  94.             # исключений, принято решение не использовать тут RequestException
  95.             send_message(f"Бот упал с ошибкой: {e}")
  96.             time.sleep(3)
  97.             continue
  98.  
  99.  
  100. if __name__ == "__main__":
  101.     main()
  102.  
Add Comment
Please, Sign In to add comment