-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathhomework.py
More file actions
136 lines (113 loc) · 4.58 KB
/
Copy pathhomework.py
File metadata and controls
136 lines (113 loc) · 4.58 KB
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
130
131
132
133
134
135
136
import logging
import os
import sys
import time
from http import HTTPStatus
import requests
import telegram
from dotenv import load_dotenv
from settings import ENDPOINT, HOMEWORK_STATUSES, RETRY_TIME
load_dotenv()
PRACTICUM_TOKEN = os.getenv('PRACTICUM_TOKEN')
TELEGRAM_TOKEN = os.getenv('TELEGRAM_TOKEN')
TELEGRAM_CHAT_ID = os.getenv('TELEGRAM_CHAT_ID')
HEADERS = {'Authorization': f'OAuth {PRACTICUM_TOKEN}'}
logging.basicConfig(
level=logging.INFO,
filename='main.log',
filemode='a',
format='%(asctime)s, %(levelname)s, %(message)s, %(name)s'
)
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
handler = logging.StreamHandler(sys.stdout)
logger.addHandler(handler)
formatter = logging.Formatter(
'%(asctime)s %(levelname)s %(name)s %(message)s'
)
handler.setFormatter(formatter)
def send_message(bot, message):
"""Отправка сообщения в TELEGRAM."""
try:
bot.send_message(TELEGRAM_CHAT_ID, message)
logger.info('Сообщение отправлено в Telegram')
except telegram.TelegramError as error:
logger.error(f'Сбой при отправке сообщения в Telegram: {error}')
def get_api_answer(current_timestamp):
"""Запрос к API сервису Практикума."""
try:
current_timestamp = current_timestamp or int(time.time())
params = {'from_date': current_timestamp}
response = requests.get(ENDPOINT, headers=HEADERS, params=params)
if response.status_code != HTTPStatus.OK:
message = f'ошибочный статус ответа API: {response.status_code}'
logger.error(message, exc_info=True)
raise ConnectionError(message)
except Exception as error:
message = f'Запрос не удался: {error}'
logger.error(message)
raise ValueError(message)
return response.json()
def check_response(response):
"""Проверка ответа API на корректность."""
if not isinstance(response, dict):
message = 'Неверный тип данных'
raise TypeError(message)
if 'homeworks' not in response:
message = 'Ключ homeworks отсутствует'
raise KeyError(message)
homeworks = response['homeworks']
if not isinstance(homeworks, list):
message = 'Неверный тип данных'
raise TypeError(message)
if not homeworks:
message = 'Список homework пуст'
raise ValueError(message)
homework = response['homeworks'][0]
return homework
def parse_status(homework):
"""Извлекаем название и статус домашней работы."""
if 'homework_name' not in homework:
message = 'Ключ homework_name отсутствует'
raise KeyError(message)
homework_name = homework['homework_name']
if 'status' not in homework:
message = 'Ключ status отсутствует'
raise KeyError(message)
homework_status = homework['status']
if not isinstance(homework_name, str):
message = 'Неверный тип данных homework_name'
raise TypeError(message)
if not isinstance(homework_status, str):
message = 'Неверный тип данных homework_status'
raise TypeError(message)
if homework_status in HOMEWORK_STATUSES:
verdict = HOMEWORK_STATUSES[homework_status]
else:
message = (f'Неизвестный статус домашней работы: {homework_status}')
raise KeyError(message)
return f'Изменился статус проверки работы "{homework_name}". {verdict}'
def check_tokens():
"""Проверка Токенов."""
return all([PRACTICUM_TOKEN, TELEGRAM_TOKEN, TELEGRAM_CHAT_ID])
def main():
"""Основная логика работы бота."""
if not check_tokens():
message = 'Необходимые переменные окружения отсутствуют.'
logger.critical(message, exc_info=True)
sys.exit()
bot = telegram.Bot(token=TELEGRAM_TOKEN)
current_timestamp = int(time.time())
try:
response = get_api_answer(current_timestamp)
homework = check_response(response)
message = parse_status(homework)
send_message(bot, message)
time.sleep(RETRY_TIME)
except Exception as error:
message = f'Сбой в работе программы: {error}'
finally:
send_message(bot, message)
time.sleep(RETRY_TIME)
if __name__ == '__main__':
main()