1
+ import json
1
2
import logging
2
3
import os
3
4
import time
12
13
13
14
class ServiceError (Exception ):
14
15
"""Ошибка отсутствия доступа по заданному эндпойнту."""
15
-
16
+ pass
16
17
17
18
class NetworkError (Exception ):
18
19
"""Ошибка отсутствия сети."""
20
+ pass
19
21
20
22
21
23
class EndpointError (Exception ):
22
24
"""Ошибка, если эндпойнт не корректен."""
25
+ pass
23
26
24
27
25
28
class MessageSendingError (Exception ):
26
29
"""Ошибка отправки сообщения."""
30
+ pass
27
31
28
32
29
33
class GlobalsError (Exception ):
30
34
"""Ошибка, если есть пустые глобальные переменные."""
35
+ pass
31
36
32
37
33
38
class DataTypeError (Exception ):
34
39
"""Ошибка, если тип данных не dict."""
40
+ pass
41
+
42
+ class ResponseFormatError (Exception ):
43
+ """Ошибка, если формат response не json."""
44
+ pass
35
45
36
46
37
47
CONNECTION_ERROR = '{error}, {url}, {headers}, {params}'
@@ -43,9 +53,10 @@ class DataTypeError(Exception):
43
53
STATUS_IS_CHANGED = '{verdict}, {homework}'
44
54
STATUS_IS_NOT_CHANGED = 'Статус не изменился, нет записей.'
45
55
FAILURE_TO_SEND_MESSAGE = '{error}, {message}'
46
- GLOBAL_VARIABLE_IS_MISSING = 'Отсутствует глобальная переменная {} '
47
- GLOBAL_VARIABLE_IS_EMPTY = 'Пустая глобальная переменная {} '
56
+ GLOBAL_VARIABLE_IS_MISSING = 'Отсутствует глобальная переменная'
57
+ GLOBAL_VARIABLE_IS_EMPTY = 'Пустая глобальная переменная'
48
58
MESSAGE_IS_SENT = 'Сообщение {} отправлено'
59
+ FORMAT_NOT_JSON = 'Формат не json {}'
49
60
50
61
PRACTICUM_TOKEN = os .getenv ('PRACTICUM_TOKEN' )
51
62
TELEGRAM_TOKEN = os .getenv ('TELEGRAM_TOKEN' )
@@ -55,7 +66,6 @@ class DataTypeError(Exception):
55
66
ENDPOINT = 'https://practicum.yandex.ru/api/user_api/homework_statuses/'
56
67
HEADERS = {'Authorization' : f'OAuth { PRACTICUM_TOKEN } ' }
57
68
58
-
59
69
HOMEWORK_STATUSES = {
60
70
'approved' : 'Работа проверена: ревьюеру всё понравилось. Ура!' ,
61
71
'reviewing' : 'Работа взята на проверку ревьюером.' ,
@@ -72,19 +82,17 @@ def send_message(bot, message):
72
82
error = error ,
73
83
message = message ,
74
84
))
75
- else :
76
- logging .info (f'Message \' { message } \' is sent' )
85
+ logging .info (f'Message \' { message } \' is sent' )
77
86
78
87
79
88
def get_api_answer (current_timestamp ):
80
89
"""Делает запрос к единственному эндпоинту API-сервиса."""
81
90
timestamp = current_timestamp or int (time .time ())
82
91
params = {'from_date' : timestamp }
83
- headers = {'Authorization' : f'OAuth { PRACTICUM_TOKEN } ' }
84
- all_params = dict (url = ENDPOINT , headers = headers , params = params )
92
+ all_params = dict (url = ENDPOINT , headers = HEADERS , params = params )
85
93
try :
86
94
response = requests .get (** all_params )
87
- except telegram . error . TelegramError as error :
95
+ except requests . exceptions . RequestException as error :
88
96
raise telegram .TelegramError (CONNECTION_ERROR .format (
89
97
error = error ,
90
98
** all_params ,
@@ -95,27 +103,28 @@ def get_api_answer(current_timestamp):
95
103
response_status = response_status ,
96
104
** all_params ,
97
105
))
98
- return response .json ()
106
+ try :
107
+ return response .json ()
108
+ except Exception as error :
109
+ raise ResponseFormatError (FORMAT_NOT_JSON .format (error ))
99
110
100
111
101
112
def check_response (response ):
102
113
"""
103
114
Возвращает домашку, если есть.
104
115
Проверяет валидность её статуса.
105
116
"""
106
- try :
107
- return response ['homeworks' ][0 ]
108
- except 'code' in response :
117
+ if 'code' in response :
109
118
raise ServiceError (SERVICE_REJECTION .format (
110
119
code = response .get ('code' ),
111
120
))
121
+ return response ['homeworks' ][0 ]
112
122
113
123
114
124
def parse_status (homework ):
115
125
"""Возвращает текст сообщения от ревьюера."""
116
- data_type = type (homework )
117
- if data_type != dict :
118
- raise DataTypeError (WRONG_DATA_TYPE .format (data_type ))
126
+ if not isinstance (homework , dict ):
127
+ raise DataTypeError (WRONG_DATA_TYPE .format (type (homework )))
119
128
homework_name = homework .get ('homework_name' )
120
129
homework_status = homework .get ('status' )
121
130
@@ -129,17 +138,12 @@ def parse_status(homework):
129
138
130
139
def check_tokens ():
131
140
"""Проверяет доступность переменных окружения."""
132
- for key in (
133
- 'PRACTICUM_TOKEN' ,
134
- 'TELEGRAM_TOKEN' ,
135
- 'TELEGRAM_CHAT_ID' ,
136
- 'ENDPOINT'
137
- ):
138
- if globals ()[key ] is None :
139
- logging .error (GLOBAL_VARIABLE_IS_MISSING .format (key ))
141
+ for key in (PRACTICUM_TOKEN , TELEGRAM_TOKEN , TELEGRAM_CHAT_ID , ENDPOINT ):
142
+ if key is None :
143
+ logging .error (GLOBAL_VARIABLE_IS_MISSING )
140
144
return False
141
- elif not globals ()[ key ] :
142
- logging .error (GLOBAL_VARIABLE_IS_EMPTY . format ( key ) )
145
+ if not key :
146
+ logging .error (GLOBAL_VARIABLE_IS_EMPTY )
143
147
return False
144
148
return True
145
149
@@ -148,8 +152,6 @@ def main():
148
152
"""Основная логика работы бота."""
149
153
if not check_tokens ():
150
154
raise GlobalsError ('Ошибка глобальной переменной. Смотрите логи.' )
151
- check_tokens ()
152
-
153
155
bot = telegram .Bot (token = TELEGRAM_TOKEN )
154
156
current_timestamp = int (time .time ())
155
157
@@ -159,20 +161,19 @@ def main():
159
161
homework = check_response (response )
160
162
message = parse_status (homework )
161
163
send_message (bot , message )
162
- print ( response )
164
+ logging . info ( homework )
163
165
current_timestamp = response .get ('current_date' )
164
- time .sleep (RETRY_TIME )
165
166
166
167
except IndexError :
167
168
message = 'Статус работы не изменился'
168
169
send_message (bot , message )
169
- time . sleep ( RETRY_TIME )
170
+ logging . info ( 'Статус работы не изменился' )
170
171
except Exception as error :
171
172
message = f'Сбой в работе программы: { error } '
172
173
send_message (bot , message )
174
+ finally :
173
175
time .sleep (RETRY_TIME )
174
- else :
175
- logging .info (MESSAGE_IS_SENT .format (message ))
176
+ logging .info (MESSAGE_IS_SENT .format (message ))
176
177
177
178
178
179
if __name__ == '__main__' :
0 commit comments