'aiogram bot stops answering messages several minutes after the bot was run
I am new to aiogram and I have a problem: several minutes after running a bot my bot stops reacting to the messages. Is it because of the problems in my code, or does telegram simply 'drop' my bot (I haven't loaded my bot to the server yet).
I also get a warning: warnings.warn(msg, FutureWarning)
Commands handler:
async def messages_commands(mes:types.Message):
global languages
if mes.text=="/start":
await bot.send_message(mes.from_user.id,'''Добро пожаловать в бот, помогающий отслеживать ваши успехи в учёбе! Этот бот принимает данные о вашей успеваемости и возвращает визуализацию полученных данных!
Список команд:
/from_scratch - Бот обновляет данные о вашей школьной успеваемости. Пр вызове этой команды бот будет анализировать только новые полученный от вас данные, забыв обо всем, что было им получено от вас раньше.
/update - К уже отправленным данным будут добавлены новые.
/come_back - бот вернется к состоянию, в котором он находился до последнего вами вызова команды /from_scratch
/distribution - получите свое распределение оценок по всем или конкретному предмету (график и характеристики)!
/dynamics - получите динамику изменения своих оценок!
/between_lesson - узнайте о своих отличиях в успеваемости по разным предметам!
/overall_distribution - Распределение оценок по всем предметам!
/by_lesson - Вся информация о вашей успеваемости по любому интересующему вас предмету!
/one_update_back - Ввели неправильные данные? Не беда, отмените результат последнего апдейта!
/remove_lessons - удалите данные по одному из предметов!'''
'')
await bot.send_message(mes.from_user.id, '''Формат отправления данных следующий:
урок: оценка, оценка, оценка (в любом количестве)
Пример:
"Математика: 1, 2, 4, 5, 4, 2, 2, 2
Химия: 5,5,5,5,5,3,4,5
Английский язык: 1,2,3,4,5"'''
'')
try:
cur.execute(f'INSERT INTO Users (user_id,updates,mode) VALUES("{mes.chat.id}",NULL,0)')
except IntegrityError:
pass
elif mes.text=="/update":
await bot.send_message(chat_id=mes.chat.id,text='Отошлите новые данные!')
update('update',mes.chat.id)
elif mes.text=='/from_scratch':
await bot.send_message(mes.chat.id,'Очищаю базу данных!')
rename(f'{mes.chat.id}_current_data.json',f'{mes.chat.id}_come_back.json')
update('from_scratch', mes.chat.id)
elif mes.text == '/come_back':
await bot.send_message(mes.chat.id,'Восстанавливаю данные!')
update('come_back', mes.chat.id)
elif mes.text == '/dynamics':
update('dynamics', mes.chat.id)
lessons = types.InlineKeyboardMarkup()
jsn = open(f'{mes.chat.id}_current_data.json')
await bot.send_message(chat_id=mes.chat.id,text=f'Динамика по какому предмету вас интересует? Список ваших предметов: {json.load(jsn).keys()}')
update('dynamics',mes.chat.id)
jsn.close()
elif mes.text=='/by_lesson':
update('by_lessons', mes.chat.id)
jsn = open(f'{mes.chat.id}_current_data.json')
await bot.send_message(chat_id=mes.chat.id,
text=f'Информация по какому предмету вас интересует? Список ваших предметов: {json.load(jsn).keys()}')
jsn.close()
elif mes.text=='/remove_lessons':
update('remove_lessons', mes.chat.id)
with open(f'{mes.chat.id}_current_data.json','r') as f:
jsn = json.load(f)
await bot.send_message(chat_id=mes.chat.id,
text=f'Какой предмет удалить? Список ваших предметов: {jsn.keys()}')
#print(cur.execute(f'''SELECT mode FROM USERS WHERE user_id == "{mes.chat.id}"''').fetchall())
elif mes.text=='/distribution':
update('distribution', mes.chat.id)
with open(f'{mes.chat.id}_current_data.json','r') as f:
jsn = json.load(f)
await bot.send_message(chat_id=mes.chat.id,
text=f'Какой предмет вас интересует? Список ваших предметов: {jsn.keys()}')
Text messages handler:
@dp.message_handler()
async def send_message(mes: types.Message):
if len(cur.execute(f"SELECT mode from Users where user_id=='{mes.chat.id}'").fetchall())!=0 and cur.execute(f"SELECT mode from Users where user_id=='{mes.chat.id}'").fetchall()[0][0] == 'update':
await bot.send_message(mes.chat.id, 'Обновляю ваши данные!')
try:
name = f'{mes.chat.id}_current_data.json'
write_json(name, mes.text,exists(name))
with open(name) as f:
print(json.load(f))
#name = f'{mes.chat.id}_last_update.json'
#write_json(name,mes.text, False)
copyfile(f"{mes.chat.id}_current_data.json", f"{mes.chat.id}_last_update.json")
cur.execute(f'UPDATE Users SET updates = updates + 1 WHERE user_id = "{mes.chat.id}"')
except:
await bot.send_message(mes.chat.id, 'Произошли помехи. Возможно, что-то не так с введенными данными...')
elif len(cur.execute(f"SELECT mode from Users where user_id=='{mes.chat.id}'").fetchall())!=0 and cur.execute(f"SELECT mode from Users where user_id=='{mes.chat.id}'").fetchall()[0][0] == 'remove_lessons':
js = open(f"{mes.chat.id}_current_data.json")
copyfile(f"{mes.chat.id}_current_data.json",f"{mes.chat.id}_last_update.json")
lessons = json.load(js)
js.close()
try:
lessons.pop(mes.text)
with open(f"{mes.chat.id}_current_data.json",'w') as f:
json.dump(lessons,f)
await bot.send_message(mes.chat.id,
'Предмет удален!')
except:
await bot.send_message(mes.chat.id,'Что-то пошло не по плану... Возможно, введенного вами предмета нет в базе данных')
elif len(cur.execute(f"SELECT mode from Users where user_id=='{mes.chat.id}'").fetchall()) != 0 and cur.execute(f"SELECT mode from Users where user_id=='{mes.chat.id}'").fetchall()[0][0] == 'dynamics':
plotter = Plotter(mes.chat.id,mes.text,'current_data')
picture = plotter.plot_marks(None)
await bot.send_photo(photo=open(picture,'rb'),chat_id=mes.chat.id)
elif len(cur.execute(f"SELECT mode from Users where user_id=='{mes.chat.id}'").fetchall()) != 0 and cur.execute(f"SELECT mode from Users where user_id=='{mes.chat.id}'").fetchall()[0][0] == 'distribution':
try:
plotter = Plotter(mes.chat.id, mes.text, 'current_data')
picture = plotter.distribution(None)
await bot.send_photo(photo=open(picture, 'rb'), chat_id=mes.chat.id)
marks = plotter.get_marks()
await bot.send_message(mes.chat.id, text=f'Стандартное отклонение: {statistics.stdev(marks)}\nСреднее значение:{statistics.mean(marks)}\nМода:{statistics.mode(marks)}\nМедиана:{statistics.median(marks)}\n Наклон распределения:{skew(marks)}')
except:
await bot.send_message(mes.chat.id,
'Что-то пошло не по плану... Возможно, вы ввели некорректные данные.')
starting the loop
#dp.loop.create_task(send_users_answers())
executor.start_polling(dp,skip_updates=True)
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|