Как исправить ошибку в коде для вывода информации в Telegram боте на Python, если первого урока нет?
Всем доброго времени суток! :) У меня возникла проблема! Мне нужно получить с помощью библиотеки NetSchoolAPI данные с электронного журнала и вывести их через Telegram-бота. Для входа в систему пользователь вводит логин и пароль в чате с ботом, эти данные отправляются в Базу Данных SQLite. После этого логин и пароль вставляются в поля функции библиотеки NetSchoolAPI для входа в систему и получения оттуда информации с последующим выводом! Повторюсь, что использую библиотеку SQLite, для которой должен быть отдельный файл с Базой Данных! Код для анализа БД хранится в файле db.py. Код кнопок Telegram хранится в файле markups.py. Саму структуру таблицы Базы Данных и всего проекта прикреплю ниже!
Мне нужно вывести расписание на определенный день по нажатию на кнопку с выбором дня недели. **Всё работает стабильно, за исключением того, что если в выбранный день первого урока нет, то программа будет давать сбой и выводить ошибку. В частности это происходит только со Средой, с остальными всё нормально, так как там везде есть 1 **
main.py
import logging
from aiogram import Bot, Dispatcher, executor, types
from aiogram.types import CallbackQuery
import markups as nav
from db import Database
import asyncio
from netschoolapi import NetSchoolAPI
TOKEN = ""
logging.basicConfig(level=logging.INFO)
bot = Bot(token=TOKEN)
dp = Dispatcher(bot)
db = Database('database.db')
@dp.message_handler(commands=['start'])
async def start(message: types.Message):
if (not db.user_exists(message.from_user.id)): #Проверка: Если такого id пользователя нет в базе, то регистрируем
db.add_user(message.from_user.id)
await bot.send_message(message.from_user.id, "Укажите ваш логин и пароль от Электронного Журнала через пробел.\nПример: ИвановТ ivanov2008")
else:
await bot.send_message(message.from_user.id, "Вы уже зарегистрированы!", reply_markup=nav.mainMenu)
async def get_info(user_id, num):
ns = NetSchoolAPI('https://net-school.cap.ru/')
await ns.login(
db.get_nickname(user_id), # Логин пользователя
db.get_password(user_id), # Пароль пользователя
511,
)
info = await ns.diary()
lessons_list = info.schedule[num].lessons
res = []
for l in lessons_list:
res.append(f'{l.number} урок: {l.subject} - {l.room[0:4]} кб')
schedule = '\n'.join(res)
await ns.logout()
return schedule
@dp.message_handler()
async def bot_message(message: types.Message):
if message.chat.type == 'private':
if message.text == '⚙️ Настройки': # Отправка данных из БД
await bot.send_message(message.from_user.id, 'Ну настраивай!) ', reply_markup=nav.otherMenu)
elif message.text == ' Расписание':
await bot.send_message(message.from_user.id, '️ Выберете день недели, на который хотите увидеть расписание:', parse_mode="HTML", reply_markup=nav.ScheduleMenu)
elif message.text == '️ Сбросить настройки':
db.delete_user(message.from_user.id)
await bot.send_message(message.from_user.id, 'Ваши данные удалены! \nДля регистрации напишите: /start', parse_mode="HTML")
elif message.text == ' Мой профиль':
profile_info = "Ваш ник: " + '<b>' + db.get_nickname(message.from_user.id) + '</b>' + "\nВаш пароль: " + '<b>' + db.get_password(message.from_user.id) + '</b>'
await bot.send_message(message.from_user.id, profile_info, parse_mode="HTML")
elif message.text == ' Главное меню' or message.text == '⬅️ Назад':
await bot.send_message(message.from_user.id, 'Ты снова в главном меню!', reply_markup=nav.mainMenu)
elif message.text == 'Понедельник':
info = await get_info(message.from_user.id, 0)
await bot.send_message(message.from_user.id, '✨<u>Расписание на Понедельник: </u> \n' + info, parse_mode="HTML", reply_markup=nav.ScheduleMenu)
elif message.text == 'Вторник':
info = await get_info(message.from_user.id, 1)
await bot.send_message(message.from_user.id, '✨<u>Расписание на Вторник: </u> \n' + info, parse_mode="HTML", reply_markup=nav.ScheduleMenu)
elif message.text == 'Среда':
info = await get_info(message.from_user.id, 2)
await bot.send_message(message.from_user.id, '✨<u>Расписание на Среду: </u> \n' + info, parse_mode="HTML", reply_markup=nav.ScheduleMenu)
elif message.text == 'Четверг':
info = await get_info(message.from_user.id, 3)
await bot.send_message(message.from_user.id, '✨<u>Расписание на Четверг: </u> \n' + info, parse_mode="HTML", reply_markup=nav.ScheduleMenu)
elif message.text == 'Пятница':
info = await get_info(message.from_user.id, 4)
await bot.send_message(message.from_user.id, '✨<u>Расписание на Пятницу: </u> \n' + info, parse_mode="HTML", reply_markup=nav.ScheduleMenu)
else:
if db.get_signup(message.from_user.id) == "setnickname": #Проверка на успешную запись в БД
if (len(message.text) > 60):
await bot.send_message(message.from_user.id, "Пароль и логин не могут превышать 60 символов")
else:
text = message.text.split(' ')
login = text[0]
passw = text[1]
db.set_nickname(message.from_user.id, login)
db.set_password(message.from_user.id, passw)
db.set_signup(message.from_user.id, "done")
await bot.send_message(message.from_user.id, "Регистрация прошла успешно!",
reply_markup=nav.mainMenu)
else:
await bot.send_message(message.from_user.id, "Я вас не понял! :( \nВоспользуйтесь пожалуйста кнопками!")
if __name__ == "__main__":
executor.start_polling(dp, skip_updates=True)
markups.py
from aiogram.types import ReplyKeyboardMarkup, KeyboardButton, InlineKeyboardMarkup, InlineKeyboardButton
btnMain = KeyboardButton(' Главное меню')
# --- Main Menu ---
btnSchedule = KeyboardButton(' Расписание')
btnSettings = KeyboardButton('⚙️ Настройки')
mainMenu = ReplyKeyboardMarkup(resize_keyboard = True)
mainMenu.add(btnSchedule, btnSettings)
# --- Other Menu ---
btnDelete = KeyboardButton('️ Сбросить настройки')
btnProfile = KeyboardButton(' Мой профиль')
otherMenu = ReplyKeyboardMarkup(resize_keyboard = True)
otherMenu.add(btnProfile, btnDelete, btnMain)
# --- Schedule Menu ---
ScheduleMenu = ReplyKeyboardMarkup(resize_keyboard = True, row_width=2)
btnMonday = KeyboardButton('Понедельник')
btnTuesday = KeyboardButton('Вторник')
btnWednesday = KeyboardButton('Среда')
btnThursday = KeyboardButton('Четверг')
btnFriday = KeyboardButton('Пятница')
btnBack = KeyboardButton('⬅️ Назад')
ScheduleMenu.add(btnMonday, btnTuesday, btnWednesday, btnThursday, btnFriday, btnBack)
Вот структура Базы Данных 'database.db': Вот структура Базы Данных 'database.db'
Вот структура проекта: Вот структура проекта:
Вот, как это выглядит через официальный сайт Вот, как это выглядит через официальный сайт
Вот работа на практике, как это выглядит через Telegram: Вот, как это выглядит через официальный сайт
Функция, через которую производится подключение к Электронному Журналу через NetSchoolAPI.
async def get_info(user_id, num):
ns = NetSchoolAPI('https://net-school.cap.ru/')
await ns.login(
db.get_nickname(user_id), # Логин пользователя
db.get_password(user_id), # Пароль пользователя
511,
)
info = await ns.diary()
lessons_list = info.schedule[num].lessons
lessons_shedule = []
for lesson in lessons_list:
less = lesson.subject
lessons_shedule.append(less)
number_shedule = []
for lesson in lessons_list:
less = lesson.number
number_shedule.append(less)
room_shedule = []
for lesson in lessons_list:
less = lesson.room
room_shedule.append(less)
if 1 in number_shedule:
one = ('<i>' + str(number_shedule[0]) + ' урок: ' + '</i>', '<b>' + lessons_shedule[0] + '</b>', ' - ' + str(room_shedule[0][0:4] + 'кб'))
else:
one = ('Нет урока', '', '')
if 2 in number_shedule:
two = ('<i>' + str(number_shedule[1]) + ' урок: ' + '</i>', '<b>' + lessons_shedule[1] + '</b>', ' - ' + str(room_shedule[1][0:4] + 'кб'))
if 3 in number_shedule:
three = ('<i>' + str(number_shedule[2]) + ' урок: ' + '</i>', '<b>' + lessons_shedule[2] + '</b>', ' - ' + str(room_shedule[2][0:4] + 'кб'))
if 4 in number_shedule:
four = ('<i>' + str(number_shedule[3]) + ' урок: ' + '</i>', '<b>' + lessons_shedule[3] + '</b>', ' - ' + str(room_shedule[3][0:4] + 'кб'))
if 5 in number_shedule:
five = ('<i>' + str(number_shedule[4]) + ' урок: ' + '</i>', '<b>' + lessons_shedule[4] + '</b>', ' - ' + str(room_shedule[4][0:4] + 'кб'))
if 6 in number_shedule:
six = ('<i>' + str(number_shedule[5]) + ' урок: ' + '</i>', '<b>' + lessons_shedule[5] + '</b>', ' - ' + str(room_shedule[5][0:4] + 'кб'))
if 7 in number_shedule:
seven = ('<i>' + str(number_shedule[6]) + ' урок: ' + '</i>', '<b>' + lessons_shedule[6] + '</b>', ' - ' + str(room_shedule[6][0:4] + 'кб'))
if 8 in number_shedule:
eight = ('<i>' + str(number_shedule[7]) + ' урок: ' + '</i>', '<b>' + lessons_shedule[7] + '</b>', ' - ' + str(room_shedule[7][0:4] + 'кб'))
if len(lessons_shedule) == 8:
schedule = one[0] + one[1] + one[2] + '\n' + two[0] + two[1] + two[2] + '\n' + three[0] + three[1] + three[2] + '\n' + four[0] + four[1] + four[2] + '\n' + five[0] + five[1] + five[2] + '\n' + six[0] + six[1] + six[2] + '\n' + seven[0] + seven[1] + seven[2] + '\n' + eight[0] + eight[1] + eight[2]
elif len(lessons_shedule) == 7:
schedule = one[0] + one[1] + one[2] + '\n' + two[0] + two[1] + two[2] + '\n' + three[0] + three[1] + three[2] + '\n' + four[0] + four[1] + four[2] + '\n' + five[0] + five[1] + five[2] + '\n' + six[0] + six[1] + six[2] + '\n' + seven[0] + seven[1] + seven[2]
await ns.logout()
return schedule
Вот такая ошибка:
ERROR:asyncio:Task exception was never retrieved
future: <Task finished name='Task-115' coro=<Dispatcher._process_polling_updates()
done, defined at C:\Users\79170\Desktop\ProjectTwo\venv\lib\site-packages\aiogram\dispatcher\dispatcher.py:407> exception=NoResponseFromServer()>
Traceback (most recent call last):
File "C:\Users\79170\Desktop\ProjectTwo\venv\lib\site-packages\aiogram\dispatcher\dispatcher.py", line 415, in _process_polling_updates
for responses in itertools.chain.from_iterable(await self.process_updates(updates, fast)):
File "C:\Users\79170\Desktop\ProjectTwo\venv\lib\site-packages\aiogram\dispatcher\dispatcher.py", line 235, in process_updates
return await asyncio.gather(*tasks)
File "C:\Users\79170\Desktop\ProjectTwo\venv\lib\site-packages\aiogram\dispatcher\handler.py", line 117, in notify
File "C:\Users\79170\Desktop\ProjectTwo\venv\lib\site-packages\aiogram\dispatcher\handler.py", line 117, in notify
response = await handler_obj.handler(*args, **partial_data)
File "C:\Users\79170\Desktop\ProjectTwo\main.py", line 66, in bot_message
info = await get_info(message.from_user.id, 0)
File "C:\Users\79170\Desktop\ProjectTwo\main.py", line 30, in get_info
await ns.login(
File "C:\Users\79170\Desktop\ProjectTwo\venv\lib\site-packages\netschoolapi\netschoolapi.py", line 53, in login
await requester(self._wrapped_client.client.build_request(
File "C:\Users\79170\Desktop\ProjectTwo\venv\lib\site-packages\netschoolapi\async_client_wrapper.py", line 47, in request
raise errors.NoResponseFromServer from None
netschoolapi.errors.NoResponseFromServer