-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathhomework.py
129 lines (110 loc) · 5.03 KB
/
homework.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
import datetime
import os
import logging
import requests
import telegram
import time
from http import HTTPStatus
from dotenv import load_dotenv
from telegram import TelegramError
from exceptions import (
HomeworkStatusNotExist,
ResponseStatusCodeError,
WrongAPIKeys
)
load_dotenv()
PRACTICUM_TOKEN = os.getenv('PRACTICUM_TOKEN')
TELEGRAM_TOKEN = os.getenv('TELEGRAM_TOKEN')
TELEGRAM_CHAT_ID = os.getenv('TELEGRAM_CHAT_ID')
RETRY_TIME = 1200
ONE_MONTH = 60 * 60 * 24 * 30
ONE_MINUTE = 60
ENDPOINT = 'https://practicum.yandex.ru/api/user_api/homework_statuses/'
HEADERS = {'Authorization': f'OAuth {PRACTICUM_TOKEN}'}
HOMEWORK_STATUSES = {
'approved': 'Работа проверена: ревьюеру всё понравилось. Ура!',
'reviewing': 'Работа взята на проверку ревьюером.',
'rejected': 'Работа проверена: у ревьюера есть замечания.'
}
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s, %(levelname)s, %(message)s')
logger = logging.getLogger(__name__)
handler = logging.StreamHandler(stream=None)
logger.addHandler(handler)
def send_message(bot, message):
"""Отправляет сообщение в Telegram чат."""
try:
bot.send_message(chat_id=TELEGRAM_CHAT_ID, text=message)
logger.info(f'Вам письмо: {message}')
except telegram.error.TelegramError as error:
logger.error(f'Сбой отправки сообщения в бот {error}')
raise TelegramError(f'Сбой отправки сообщения в бот {error}')
def get_api_answer(current_timestamp):
"""Делает запрос к единственному эндпоинту API-сервиса."""
timestamp = current_timestamp or int(time.time())
params = {'from_date': timestamp}
try:
homework_statuses = requests.get(ENDPOINT,
headers=HEADERS, params=params)
if homework_statuses.status_code != HTTPStatus.OK:
logging.error('Ошибка сервера, код не равен 200')
raise ResponseStatusCodeError(
'Неправильный ответ сервера: '
f'status_code: {homework_statuses.status_code}'
)
return homework_statuses.json()
except requests.RequestException as error:
logging.error(f'Ошибка запроса сервера. {error}')
def check_response(response):
"""Проверяет ответ API на корректность."""
if isinstance(response['homeworks'], list):
logging.info('Начинаем проверку API')
return response['homeworks']
else:
raise WrongAPIKeys('Нет нужных ключей')
def parse_status(homework):
"""Извлекает из информации о конкретной домашней работе её статус."""
homework_name = homework['homework_name']
homework_status = homework['status']
if homework['status'] not in HOMEWORK_STATUSES:
logging.error('Какой-то непонятный статус проверки :(')
raise HomeworkStatusNotExist(
'Такой статус не существует: '
f'{homework["status"]}'
)
verdict = HOMEWORK_STATUSES[f'{homework_status}']
return f'Изменился статус проверки работы "{homework_name}". {verdict}'
def check_tokens():
"""Проверяет доступность переменных окружения."""
return all((PRACTICUM_TOKEN, TELEGRAM_TOKEN, TELEGRAM_CHAT_ID))
def main():
"""Описана основная логика работы программы."""
try:
bot = telegram.Bot(token=TELEGRAM_TOKEN)
except Exception as error:
logging.critical('Введен неправильный токен или токен отсутствует: '
f'{error}'
)
current_timestamp = int(time.time()) - ONE_MONTH # минус месяц
while True:
try:
response = get_api_answer(current_timestamp - ONE_MINUTE)
chk_response = check_response(response)
my_time = (datetime.datetime.utcfromtimestamp(
current_timestamp + 10800+RETRY_TIME).strftime('%Y-%m-%d %H:%M:%S')
)
if len(chk_response) == 0:
send_message(bot, f"На время {my_time} ничего нового нет")
else:
for i in range(len(chk_response)):
sts = f"{parse_status(chk_response[i])} {my_time}"
send_message(bot, sts)
current_timestamp = response['current_date']
except Exception as error:
message = f'Сбой в работе программы: {error}'
send_message(bot, message)
logging.critical(message)
finally:
time.sleep(RETRY_TIME)
if __name__ == '__main__':
main()