-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.py
137 lines (115 loc) · 4.61 KB
/
main.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
130
131
132
133
134
135
136
137
import os
import sys
import time
import requests
import exceptions
import logging
from dotenv import load_dotenv
from telegram import Bot
load_dotenv()
logging.basicConfig(
level=logging.DEBUG,
filename='main.log',
filemode='w',
format='%(asctime)s, %(levelname)s, %(message)s'
)
logger = logging.getLogger(__name__)
handler = logging.StreamHandler(stream=sys.stdout)
logger.addHandler(handler)
PRACTICUM_TOKEN = os.getenv('PRACTICUM_TOKEN')
TELEGRAM_TOKEN = os.getenv('TELEGRAM_TOKEN')
TELEGRAM_CHAT_ID = os.getenv('TELEGRAM_CHAT_ID')
tokens = [PRACTICUM_TOKEN, TELEGRAM_TOKEN, TELEGRAM_CHAT_ID]
RETRY_TIME = 600
PRACTICUM_ENDPOINT = (
'https://practicum.yandex.ru/api/user_api/homework_statuses/'
)
HEADERS = {'Authorization': f'OAuth {PRACTICUM_TOKEN}'}
HOMEWORK_STATUSES = {
'approved': 'Работа проверена: ревьюеру всё понравилось. Ура!',
'reviewing': 'Работа взята на проверку ревьюером.',
'rejected': 'Работа проверена: у ревьюера есть замечания.'
}
def send_message(bot, message):
"""Отправка сообщения в Telegram-чат."""
try:
bot.send_message(chat_id=TELEGRAM_CHAT_ID, text=message)
logging.info(f' Бот отправил сообщение: {message}')
except exceptions.UnableToSendMessage(
f'Ошибка при отправке сообщения: {message}'
) as error:
logging.error(error)
def get_api_answer(current_timestamp):
"""Запрос к API-сервису."""
timestamp = current_timestamp or int(time.time())
params = {'from_date': timestamp}
try:
response = requests.get(
PRACTICUM_ENDPOINT,
headers=HEADERS,
params=params
)
if response.status_code != 200:
logging.info('Статус-код ответа отличается от ожидаемого')
raise exceptions.UnexpectedStatusCode
return response.json()
except requests.exceptions.RequestException as error:
logging.error(error)
def check_response(response):
"""Проверка ответа API."""
if not isinstance(response, dict):
logging.error('Ответ API не соответствует ожидаемому')
raise TypeError
if not isinstance(response.get('homeworks'), list):
logging.error('Ответ API не соответствует ожидаемому')
raise KeyError
try:
return response['homeworks']
except KeyError:
logging.error('Несуществующий ключ')
def parse_status(homework):
"""Получение статуса конкретной домашней работы."""
homework_name = homework.get('homework_name')
homework_status = homework.get('status')
if 'homework_name' not in homework:
logging.error('Несуществующий ключ')
raise KeyError
if 'status' not in homework:
logging.error('Несуществующий ключ')
raise KeyError
if homework_status not in HOMEWORK_STATUSES:
logging.error('Несуществующий ключ')
raise KeyError
verdict = HOMEWORK_STATUSES.get(homework_status)
return f'Изменился статус проверки работы "{homework_name}". {verdict}'
def check_tokens():
"""Проверка переменных окружения."""
if not all([PRACTICUM_TOKEN, TELEGRAM_TOKEN, TELEGRAM_CHAT_ID]):
logging.critical('Отсутствует переменная окружения')
return False
return True
def main():
"""Основная логика работы бота."""
check_tokens()
bot = Bot(token=TELEGRAM_TOKEN)
start_review_stamp = 1630443600
response = get_api_answer(start_review_stamp)
check = check_response(response)
status = check[0]['status']
while True:
try:
response = get_api_answer(start_review_stamp)
check = check_response(response)
if check[0]['status'] != status:
status = check[0]['status']
send_message(bot, parse_status(check[0]))
else:
logging.debug('Отсутствие в ответе нового статуса')
time.sleep(RETRY_TIME)
except Exception as error:
message = f'Сбой в работе программы: {error}'
logging.error(message)
send_message(bot, message)
time.sleep(RETRY_TIME)
if __name__ == '__main__':
main()