-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathhomework.py
More file actions
139 lines (115 loc) · 4.79 KB
/
Copy pathhomework.py
File metadata and controls
139 lines (115 loc) · 4.79 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
137
138
139
import logging
import os
import sys
import time
from http import HTTPStatus
import requests
import telegram
from dotenv import load_dotenv
from requests import RequestException
from exceptions import TelegramNotResponse
load_dotenv()
PRACTICUM_TOKEN = os.getenv('PRACTICUM_TOKEN')
TELEGRAM_TOKEN = os.getenv('TELEGRAM_TOKEN')
TELEGRAM_CHAT_ID = os.getenv('TELEGRAM_CHAT_ID')
RETRY_TIME = 1740
ENDPOINT = 'https://practicum.yandex.ru/api/user_api/homework_statuses/'
HEADERS = {'Authorization': f'OAuth {PRACTICUM_TOKEN}'}
HOMEWORK_STATUSES = {
'approved': 'Работа проверена: ревьюеру всё понравилось. Ура!',
'reviewing': 'Работа взята на проверку ревьюером.',
'rejected': 'Работа проверена: у ревьюера есть замечания.'
}
logger = logging.getLogger(__name__)
logging.basicConfig(
stream=sys.stdout,
level=logging.INFO,
format=('%(asctime)s - %(name)s - %(levelname)s - '
'%(lineno)s - %(funcName)s - %(message)s')
)
handler = logging.StreamHandler()
logger.addHandler(handler)
def send_message(bot, message):
"""Бот отправляет сообщение."""
try:
bot.send_message(chat_id=TELEGRAM_CHAT_ID, text=message)
except TelegramNotResponse:
logger.error('С серверами телеграм что-то не так.')
logger.info(f'Отправка сообщения: {message}')
def get_api_answer(current_timestamp):
"""Запрос данных к API."""
timestamp = current_timestamp or int(time.time())
params = {'from_date': timestamp}
try:
response_hw_status = requests.get(
ENDPOINT, headers=HEADERS, params=params
)
logger.info('Сервер работает.')
if response_hw_status.status_code == HTTPStatus.OK:
logger.info('Ответ получен.')
response = response_hw_status.json()
return response
raise Exception('Ошибка состояния статуса HTTP.')
except RequestException as error:
logger.error('Ошибка ответа сервера.')
raise error
def check_response(response):
"""Проверка ответа API на корректность."""
try:
homeworks = response['homeworks']
if not isinstance(homeworks, list):
assert False
except KeyError:
raise KeyError('В ответе отсутствует ключ "homeworks".')
except TypeError:
raise TypeError('Недопустимый тип данных.')
return homeworks
def parse_status(homework: dict) -> str:
"""Функция возвращает статус домашней работы."""
homework_name = homework['homework_name']
homework_status = homework['status']
try:
verdict = HOMEWORK_STATUSES[homework_status]
except homework_status not in HOMEWORK_STATUSES:
logger.error('Неизвестный статус д.з.')
raise KeyError(f'Неизвестный статус: {homework_status}')
except homework_status not in homework:
logger.error('Отсутствует статус д.з.')
raise KeyError(f'Отсутствует статус: {homework_status}')
return f'Изменился статус проверки работы "{homework_name}". {verdict}'
def check_tokens():
"""Проверка переменных TOKENS."""
logger.info(all)
return all([PRACTICUM_TOKEN, TELEGRAM_TOKEN, TELEGRAM_CHAT_ID])
def main():
"""Основная логика работы бота."""
if not check_tokens:
logger.critical('Отсутствуют обязательные переменные окружения.')
return SystemExit
def __init__(self, bot):
self.bot = bot
bot = telegram.Bot(token=TELEGRAM_TOKEN)
current_timestamp = 1635750000
while True:
try:
response = get_api_answer(current_timestamp)
homework = check_response(response)
logger.info('Домашняя работа.')
if isinstance(homework, list) and homework:
status = parse_status(homework[0])
send_message(bot, status)
else:
logger.info('Нет домашней работы.')
current_timestamp = response['current_date']
time.sleep(RETRY_TIME)
except Exception as error:
message = f'Сбой в работе программы: {error}'
logger.error(message)
send_message(bot, message)
time.sleep(RETRY_TIME)
if __name__ == '__main__':
try:
main()
except KeyboardInterrupt:
print('Остановка программы.')
raise SystemExit