matacoder

Untitled

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