Бот перестал отвечать на соообщения,что делать?
Такая проблема,попытался добавить калькулятор кв. уравнений, терминал ошибки не видит,но сам бот в тг не отвечает, в чем проблема? В расположении хэндлеров? Кидаю два кусочка кода(в питоне не сильно силен).
import telebot
from telebot import types
import time
import math
from urllib.request import urlopen
import sqlite3
from pymongo import MongoClient
# Создаем экземпляр бота
bot = telebot.TeleBot('5444586254:AAHYDxQGU94cGXqZYDo1vAP51CMyBQUwtws')
# Функция, обрабатывающая команду /start
cur_state = None
cluster = MongoClient("mongodb+srv://palladium:[email protected]/mathbot?retryWrites=true&w=majority")
db = cluster["mathbot"]
user = db["users"]
def Handler_SquareRoot(message: types.Message):
global cur_state
a, b, c = [int(num) for num in message.text.split(' ')]
D = b * b - 4 * a * c
if D < 0:
mess = "Дискриминант меньше нуля, корней нет"
elif D == 0:
x = -b / (2 * a)
mess = f"Дискриминант равен нулю, единственный корень:\nx = {x:.5f}"
else:
x1 = (-b + math.sqrt(D)) / (2 * a)
x2 = (-b - math.sqrt(D)) / (2 * a)
mess = f"Дискриминант больше нуля, корни:\nx1 = {x1:.5f}, x2 = {x2:.5f}"
cur_state = None
bot.send_message(message.chat.id, mess)
# States
state_SquareRootGet = "SquareRootGet"
state_handlers = {
state_SquareRootGet: Handler_SquareRoot
}
already_added = False
# Функция, обрабатывающая команду /start
@bot.message_handler(commands=["start"], chat_types=['private'])
def start(message: types.Message):
if user.find_one({"user_id": message.from_user.id}):
return
else:
user.insert_one({"user_id": message.from_user.id, "user_name": f"{message.from_user.username}"})
markup = types.ReplyKeyboardMarkup(resize_keyboard=True, row_width=2)
markup.add('Начать поиск?:', 'Связь с разработчиком', 'Поддержать разработку?',
'Список сокращений:', 'Быстрый поиск?:', 'Калькулятор кв. уравнений?')
bot.send_message(chat_id=message.chat.id,
text=f'Привет, {message.from_user.first_name}!\n'
f'Я формулознайка, наилучший бот - помощник в поиске формул по математике ?, '
f'выбери что ты хочешь:',
# parse_mode='html',
reply_markup=markup)
@bot.message_handler(commands=["checkuser"], func=lambda msg: msg.from_user.id == 1219000385)
def check_user(message: types.Message):
users = user.find({})
coutn_users = user.count_documents({})
bot.send_message(message.chat.id, f"Кол-во пользователей, которые используют Ваш бот: {coutn_users}")
for user_ in users:
bot.send_message(message.chat.id, f"ID = {user_['user_id']}\nUsername = @{user_['user_name']}")
# во-первых делайте для каждого вашего if одтельный хендлер
# не и всякие content_types=["text"] который стоят по-умолчанию смысла писать нет
# также рекомендую указывть аннотации, они облегчат написание кода
# к примеру message: types.Message, если вы юзате pycharm
# то он будет давать подсказки если вы напишете message. (с точкой)
# вместо ваших ифов делаете такую конструкцию, вы будете смотреть на хендлер
# и сразу поймете что он делает и при каких условиях срабатывает
@bot.message_handler(func=lambda msg: msg.text == "Калькулятор кв. уравнений?")
def func(message: types.Message):
global cur_state
# даже pycharm ругается на эту запись
# if not cur_state is None:
# делайте так. Так даже понятнее, типа такой-то стейт является не None
if cur_state is not None:
state_handlers[cur_state](message)
print("Changed state to ", cur_state)
else:
# зачем вы создаете переменную mess? Оно же только мешает восприятию
# mess = "Введи a, b, c из a*x*x + b*x + c = 0"
# просто сделайте перенос строки
bot.send_message(
chat_id=message.chat.id,
text="Введи a, b, c из a*x*x + b*x + c = 0",
# зачем вам указывать parse_mode? Вы же не пользуетесь им.
# parse_mode='html',
reply_markup=types.ReplyKeyboardRemove())
cur_state = state_SquareRootGet
print("Changed state to ", cur_state)
# здесь у вас была просто функция без декоратора, потому бот не видел её
# я разбил её на два хендлера
# ах и ещё вместо ифа if message.chat.type == 'private'
# я сделал это условия в самом хендлере
@bot.message_handler(func=lambda msg: msg.text == 'Поддержать разработку?', chat_types=["private"])
def support(message: types.Message):
bot.send_message(
chat_id=message.chat.id,
text='Поддержите разработку если считаете это нужным, это поможет проэкту существовать и развиваться? '
'Карта ПриватБанка: 5168 7559 0884 1170 Спасибо заранее!')
@bot.message_handler(chat_types=['private'], func=lambda msg: msg.text == 'Быстрый поиск?:')
def fast_search(message: types.Message):
markup = types.ReplyKeyboardMarkup(resize_keyboard=True, row_width=2)
markup.add('Алгебра?', 'Геометрия♾️', 'Вернуться в главное меню⬅️')
bot.send_message(message.chat.id, 'Выбери предмет:', reply_markup=markup)
@bot.message_handler(chat_types=['private'], func=lambda msg: msg.text == 'Геометрия♾️')
def geometry(message: types.Message):
markup = types.ReplyKeyboardMarkup(resize_keyboard=True, row_width=2)
markup.add('Квадрат?', 'Прямоугольник⬜', 'Круг?',
'Треугольник?', 'Ромб?', 'Трапеция⏢', 'Вернуться в быстрый выбор⬅️')
bot.send_message(message.chat.id, 'Выбери фигуру:', reply_markup=markup)
@bot.message_handler(chat_types=['private'], func=lambda msg: msg.text == 'Вернуться в быстрый выбор⬅️')
def back_to_fast_search(message: types.Message):
markup = types.ReplyKeyboardMarkup(resize_keyboard=True, row_width=2)
markup.add('Алгебра?', 'Геометрия♾️', 'Вернуться в главное меню⬅️')
bot.send_message(message.chat.id,
f'Ты в быстром поиске,{message.from_user.first_name}! Выбери что ты хочешь:',
reply_markup=markup)
@bot.message_handler(chat_types=['private'], func=lambda msg: msg.text == 'Алгебра?')
def algebra(message: types.Message):
markup = types.ReplyKeyboardMarkup(resize_keyboard=True, row_width=2)
markup.add('Вернуться назад⬅️', 'Таблица умножения', 'Квадратное уравнение', 'Графики')
bot.send_message(message.chat.id,
'Ты в разделе Алгебра?, выбери что ты хочешь:',
reply_markup=markup)
@bot.message_handler(chat_types=['private'], func=lambda msg: msg.text == 'Вернуться назад⬅️')
def back(message: types.Message):
markup = types.ReplyKeyboardMarkup(resize_keyboard=True, row_width=2)
markup.add('Алгебра?', 'Геометрия♾️', 'Вернуться в главное меню⬅️')
bot.send_message(message.chat.id,
f'Ты в быстром поиске,{message.from_user.first_name}! Выбери что ты хочешь:',
reply_markup=markup)
@bot.message_handler(chat_types=['private'], func=lambda msg: msg.text == 'Вернуться в главное меню⬅️')
def back_to_main_menu(message: types.Message):
markup = types.ReplyKeyboardMarkup(resize_keyboard=True, row_width=2)
markup.add('Начать поиск?', 'Связь с разработчиком', 'Поддержать разработку?',
'Список сокращений', 'Быстрый поиск?', 'Калькулятор кв. уравнений?')
bot.send_message(message.chat.id,
f'Ты в главном меню,{message.from_user.first_name}! Выбери что ты хочешь:',
reply_markup=markup)
@bot.message_handler(chat_types=['private'], func=lambda msg: msg.text == 'Графики')
def graphic(message: types.Message):
markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
markup.add('Линейная', 'Квадратическая', 'Степенная', 'Обратно-пропорциональная', 'Логарифмическая',
'Функция в модуле', 'Другие функции(sin,cos)', 'Вернуться назад⬅️')
bot.send_message(message.chat.id,
f'Ты в поиске графиков,{message.from_user.first_name}! Выбери какой график тебе нужен:',
reply_markup=markup)
@bot.message_handler(chat_types=['private'], func=lambda msg: msg.text == 'Другие функции(sin,cos)')
def other_funcs(message: types.Message):
markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
markup.add('sin', 'cos', 'tg', 'ctg', 'Вернуться назад⬅️')
bot.send_message(message.chat.id,
f'Ты в поиске графиков,{message.from_user.first_name}! Выбери какой график тебе нужен:',
reply_markup=markup)
@bot.message_handler(chat_types=['private'], func=lambda msg: msg.text == 'Список сокращений')
def list_abbreviations(message: types.Message):
bot.send_message(
message.chat.id,
'Треуг.(Тр.)➡️Треугольник\nКв.➡️Квадрат\nПрямоуг.➡️Прямоугольник(-ый)\nОкр.➡️Окружность(круг)\n'
'Впис.➡️Вписанный\nОпис.➡️Описанный\nПрил.➡️Прилежащая\nРавноб.➡️Равнобедренный\nКат.➡️Катет\n'
'Гипот.➡️Гипотенуза\nСтор.➡️Стороны\nИзв.➡️Изввестный(-ая)\nH(h)➡️Высота в общей геометрии\n'
'S(s)➡️Площадь в общей геометрии\nL➡️Сторона в общей геометрии\nM(m)➡️Медиана в общей геометрии\n'
'Произв.➡️Произвольный(ого)\nПолуп.➡️Полупериметр\nОсн.➡️Основние/основа\nЧ/з➡️Через\nР-но➡️Ровно\n'
'Равтост.➡️Равносторонний')
@bot.message_handler(chat_types=['private'], func=lambda msg: msg.text == 'Связь с разработчиком')
def contact(message: types.Message):
bot.send_message(message.chat.id, 'Связь с разработчиком: @MarcoPopa')
@bot.message_handler(chat_types=['private'], func=lambda msg: msg.text == 'Начать поиск?')
def start_search(message: types.Message):
bot.send_message(message.chat.id, 'P.s после каждого ответа бота можете сразу продолжать искать другие формулы. '
'Введи название формулы ниже?')
@bot.message_handler(chat_types=['private'], func=lambda msg: msg.text in [
'Таблица умножения', 'Табличка умножения', 'таблица умножения', 'табличка множения'])
def multiplication_table(message: types.Message):
photo1 = open('png/3ebc0dfa867e344cf30d81409cfd7558.jpg', 'rb')
bot.send_photo(message.chat.id, photo1)
@bot.message_handler(chat_types=['private'], func=lambda msg: msg.text in [
'теорема пифагора', 'Теорема Пифагора', 'теорема Пифагора'])
def pythagoras_theorem(message: types.Message):
photo1 = open('png/maxresdefault.jpg', 'rb')
bot.send_photo(message.chat.id, photo1)
if __name__ == '__main__':
bot.infinity_polling(skip_pending=True)
elif message.text =='Список сокращений:':
bot.send_message(message.chat.id, mess2)
elif message.text == 'Связь с разработчиком':
bot.send_message(message.chat.id, mess3)
elif message.text == 'Начать поиск?:':
bot.send_message(message.chat.id, mess4)
elif message.text in ['Таблица умножения', 'Табличка умножения','таблица умножения','табличка множения']:
photo1 = open('png/3ebc0dfa867e344cf30d81409cfd7558.jpg', 'rb')
bot.send_photo(message.chat.id, photo1)
elif message.text in ['теорема пифагора','Теорема Пифагора','теорема Пифагора']:
photo1 = open('png/maxresdefault.jpg', 'rb')
bot.send_photo(message.chat.id, photo1)
elif message.text == 'свойства степени':
photo1 = open('png/shk-1355-osnovnyie-svojstva-stepenej-kornej-1x1.png', 'rb')
bot.send_photo(message.chat.id, photo1)
elif message.text == 'степень':
photo1 = open('png/shk-1355-osnovnyie-svojstva-stepenej-kornej-1x1.png', 'rb')
bot.send_photo(message.chat.id, photo1)
elif message.text == 'свойства степеней':
photo1 = open('png/shk-1355-osnovnyie-svojstva-stepenej-kornej-1x1.png', 'rb')
bot.send_photo(message.chat.id, photo1)
elif message.text == 'преобразование степеней':
photo1 = open('png/shk-1355-osnovnyie-svojstva-stepenej-kornej-1x1.png', 'rb')
bot.send_photo(message.chat.id, photo1)
elif message.text == 'свойства корней':
photo1 = open('png/img_user_file_5da7f96abe2fa_5.jpg', 'rb')
bot.send_photo(message.chat.id, photo1)
elif message.text == 'корневые свойства':
photo1 = open('png/img_user_file_5da7f96abe2fa_5.jpg', 'rb')
bot.send_photo(message.chat.id, photo1)
elif message.text == 'основные свойства корней':
photo1 = open('png/img_user_file_5da7f96abe2fa_5.jpg', 'rb')
bot.send_photo(message.chat.id, photo1)
elif message.text == 'многочлен':
photo2 = open('png/ggvp1.jpg','rb')
bot.send_photo(message.chat.id, photo2)
elif message.text == 'теорема Безу':
photo1 = open('png/slide-7.jpg', 'rb')
bot.send_photo(message.chat.id, photo1)
elif message.text == 'Безу':
photo1 = open('png/slide-7.jpg', 'rb')
bot.send_photo(message.chat.id, photo1)
elif message.text == 'теорема безу':
photo1 = open('png/slide-7.jpg', 'rb')
bot.send_photo(message.chat.id, photo1)
elif message.text == 'Квадратное уравнение':
mess8 = '''Квадратное уравнение — это уравнение вида ax2 + bx + c = 0, где a — первый или старший коэффициент, не равный нулю, b — второй коэффициент, c — свободный член. Дискриминант квадратного уравнения — это выражение, равное b2 − 4ac.\nДискриминант в переводе с латинского означает «отличающий» или «различающий» и обозначается буквой D.'''
bot.send_message(message.chat.id, mess8)
bot.send_media_group(message.chat.id, [telebot.types.InputMediaPhoto(open('png/дискриминант.jpg', 'rb')), telebot.types.InputMediaPhoto(open('png/slide-17.jpg', 'rb')) ])
elif message.text == 'дискриминант':
mess8 = '''Квадратное уравнение — это уравнение вида ax2 + bx + c = 0, где a — первый или старший коэффициент, не равный нулю, b — второй коэффициент, c — свободный член. Дискриминант квадратного уравнения — это выражение, равное b2 − 4ac.\nДискриминант в переводе с латинского означает «отличающий» или «различающий» и обозначается буквой D.'''
bot.send_message(message.chat.id, mess8)
bot.send_media_group(message.chat.id, [telebot.types.InputMediaPhoto(open('png/дискриминант.jpg', 'rb')), telebot.types.InputMediaPhoto(open('png/slide-17.jpg', 'rb')) ])
elif message.text == 'квадратное уравнение':
mess8 = '''Квадратное уравнение — это уравнение вида ax2 + bx + c = 0, где a — первый или старший коэффициент, не равный нулю, b — второй коэффициент, c — свободный член. Дискриминант квадратного уравнения — это выражение, равное b2 − 4ac.\nДискриминант в переводе с латинского означает «отличающий» или «различающий» и обозначается буквой D.'''
bot.send_message(message.chat.id, mess8)
bot.send_media_group(message.chat.id, [telebot.types.InputMediaPhoto(open('png/дискриминант.jpg', 'rb')), telebot.types.InputMediaPhoto(open('png/slide-17.jpg', 'rb')) ])
elif message.text.lower() == 'таблица степеней':
photo1 = open('png/table-degrees-1-1.png', 'rb')
bot.send_photo(message.chat.id, photo1)
elif message.text.lower() == 'степенная таблица':
photo1 = open('png/table-degrees-1-1.png', 'rb')
bot.send_photo(message.chat.id, photo1)
elif message.text.lower() in ['таблица производных', 'производные', 'свойства производной', 'свойства производных']:
photo1 = open('png/proiz_2.gif', 'rb')
bot.send_photo(message.chat.id, photo1)
elif message.text.lower() in ['функция в модуле', 'модульная функция','модульный график', 'функция в модуле']:
mess9 = ('График функции y = |x| выглядит следующим образом:')
photo1 = open('png/298.png', 'rb')
bot.send_message(message.chat.id, mess9)
bot.send_photo(message.chat.id, photo1)
elif message.text.lower() in ['гипербола', 'ветки гиперболы','обратно-пропорциональная зависимость','обратно-пропорциональный график', 'обратно пропорциональная зависимость', 'обратно-пропорциональная']:
mess10 = 'Обратно пропорциональной зависимостью называют функцию, заданную формулой: y= k/x. В зависимости от знака числа k график обратно пропорциональной зависимости может иметь два принципиальных варианта:'
photo1 = open('png/282.png', 'rb')
bot.send_message(message.chat.id, mess10)
bot.send_photo(message.chat.id, photo1)
elif message.text.lower() in ['график логарифма', 'логарифмическая функция','логарифм', 'логарифмическая']:
photo1 = open('png/286.png', 'rb')
mess11 = 'Логарифмической функцией называют функцию, заданную формулой: y = logX В зависимости от того больше или меньше единицы число a график логарифмической функции может иметь два принципиальных варианта:'
bot.send_message(message.chat.id, mess11)
bot.send_photo(message.chat.id, photo1)
elif message.text.lower() in ['линейная функция', 'функция линии','график линии','линейный график', 'линейная']:
mess12 = 'Линейная функция — это функция вида y = kx + b, где х — независимая переменная, k, b — некоторые числа'
bot.send_message(message.chat.id, mess12)
photo1 = open('png/277.png', 'rb')
bot.send_photo(message.chat.id, photo1)
elif message.text.lower() in ['квадратическая функция', 'график параболы','парабола','функция параболы', 'квадратическая']:
mess = 'График параболы задается квадратичной функцией:x=y^2. Квадратичная функция, как и любая другая функция, пересекает ось ОХ в точках являющихся её корнями: (x1; 0) и (x2; 0). Если корней нет, значит квадратичная функция ось ОХ не пересекает, если корень один, значит в этой точке (x0; 0) квадратичная функция только касается оси ОХ, но не пересекает её. Квадратичная функция всегда пересекает ось OY в точке с координатами: (0; c). График квадратичной функции (парабола) может выглядеть следующим образом (на рисунке примеры, которые далеко не исчерпывают все возможные виды парабол):'
bot.send_message(message.chat.id, mess)
photo1 = open('png/278.png', 'rb')
bot.send_photo(message.chat.id, photo1)
elif message.text.lower() in ['степенная функция', 'функция степени','функция третьей степени','функция четвертой степени', 'степенная']:
mess = 'Степенной функцией называют функцию, заданную формулой:Формула степенной функцииПриведем несколько примеров графиков степенных функций:'
bot.send_message(message.chat.id, mess)
photo1 = open('png/280.png', 'rb')
bot.send_photo(message.chat.id, photo1)
elif message.text.lower() in ['формулы сокращенного умножения', 'фсу','формула сокращенного умножения','сокращенное умножение']:
mess = 'Формулы сокращенного умножения:'
bot.send_message(message.chat.id, mess)
photo1 = open('png/fsu-1.png', 'rb')
bot.send_photo(message.chat.id, photo1)
elif message.text.lower() in ['график синуса', 'синусоида','sin', 'периодическая функция']:
mess = 'Большинство примеров периодических функций - это тригонометрические функции. Приведем графики основных тригонометрических функций. На следующем рисунке изображена часть графика функции y = sinx (весь график неограниченно продолжается влево и вправо), график функции y = sinx называют синусоидой:'
photo1 = open('png/290.png', 'rb')
bot.send_message(message.chat.id, mess)
bot.send_photo(message.chat.id, photo1)
print('Бот запущен')
bot.polling(none_stop=True)
Ответы (2 шт):
Автор решения: amidaslav
→ Ссылка
Проверьте токен на правильность, вдруг не от того бота указали токен
bot = telebot.TeleBot('5374997789:AAH_eMyDtaeB_N0xPure_DR574Cnl9VD-b8')
Автор решения: oleksandrigo
→ Ссылка
У вас есть вот этот код.
@bot.message_handler(content_types=["text"])
def func(message):
global cur_state
if not cur_state is None:
state_handlers[cur_state](message)
print("Changed state to ", cur_state)
else:
if(message.text == "Калькулятор кв. уравнений?"):
mess = "Введи a, b, c из a*x*x + b*x + c = 0"
bot.send_message(message.chat.id, mess, parse_mode='html', reply_markup=clear_markup)
cur_state = state_SquareRootGet
print("Changed state to ", cur_state)
def bot_message(message):
mess2 = '''Треуг.(Тр.)➡️Треугольник\nКв.➡️Квадрат\nПрямоуг.➡️Прямоугольник(-ый)\nОкр.➡️Окружность(круг)\nВпис.➡️Вписанный\nОпис.➡️Описанный\nПрил.➡️Прилежащая\nРавноб.➡️Равнобедренный\nКат.➡️Катет\nГипот.➡️Гипотенуза\nСтор.➡️Стороны\nИзв.➡️Изввестный(-ая)\nH(h)➡️Высота в общей геометрии\nS(s)➡️Площадь в общей геометрии\nL➡️Сторона в общей геометрии\nM(m)➡️Медиана в общей геометрии\nПроизв.➡️Произвольный(ого)\nПолуп.➡️Полупериметр\nОсн.➡️Основние/основа\nЧ/з➡️Через\nР-но➡️Ровно\nРавтост.➡️Равносторонний'''
mess1 = 'Поддержите разработку если считаете это нужным, это поможет проэкту существовать и развиваться? Карта ПриватБанка: 5168 7559 0884 1170 Спасибо заранее!'
mess3 = 'Связь с разработчиком: @MarcoPopa'
mess4 = 'P.s после каждого ответа бота можете сразу продолжать искать другие формулы. Введи название формулы ниже?'
mess5 = 'Введи ниже переменную а'
mess6 = 'Введи переменную b'
mess7 = 'Введи переменную с'
if message.chat.type == 'private':
if message.text == 'Поддержать разработку?':
bot.send_message(message.chat.id, mess1)
if message.text =='Быстрый поиск?:':
markup = types.ReplyKeyboardMarkup(resize_keyboard = True, row_width=2)
algebra = types.KeyboardButton('Алгебра?')
geoma = types.KeyboardButton('Геометрия♾️')
nazadbistr = types.KeyboardButton('Вернуться в главное меню⬅️')
markup.add(algebra, geoma, nazadbistr)
bot.send_message(message.chat.id, 'Выбери предмет:', parse_mode = 'html', reply_markup = markup)
Это ужас. Немного потыкал, поменял на вот это
# во-первых делайте для каждого вашего if одтельный хендлер
# не и всякие content_types=["text"] который стоят по-умолчанию смысла писать нет
# также рекомендую указывть аннотации, они облегчат написание кода
# к примеру message: types.Message, если вы юзате pycharm
# то он будет давать подсказки если вы напишете message. (с точкой)
# вместо ваших ифов делаете такую конструкцию, вы будете смотреть на хендлер
# и сразу поймете что он делает и при каких условиях срабатывает
@bot.message_handler(func=lambda msg: msg.text == "Калькулятор кв. уравнений?")
def func(message: types.Message):
global cur_state
# даже pycharm ругается на эту запись
# if not cur_state is None:
# делайте так. Так даже понятнее, типа такой-то стейт является не None
if cur_state is not None:
state_handlers[cur_state](message)
print("Changed state to ", cur_state)
else:
# зачем вы создаете переменную mess? Оно же только мешает восприятию
# mess = "Введи a, b, c из a*x*x + b*x + c = 0"
# просто сделайте перенос строки
bot.send_message(
chat_id=message.chat.id,
text="Введи a, b, c из a*x*x + b*x + c = 0",
# зачем вам указывать parse_mode? Вы же не пользуетесь им.
# parse_mode='html',
reply_markup=clear_markup)
cur_state = state_SquareRootGet
print("Changed state to ", cur_state)
# здесь у вас была просто функция без декоратора, потому бот не видел её
# я разбил её на два хендлера
# ах и ещё вместо ифа if message.chat.type == 'private'
# я сделал это условия в самом хендлере
@bot.message_handler(func=lambda msg: msg.text == 'Поддержать разработку?', chat_types=["private"])
def support(message: types.Message):
# mess2 = '''Треуг.(Тр.)➡️Треугольник\nКв.➡️Квадрат\nПрямоуг.➡️Прямоугольник(-ый)\nОкр.➡️Окружность(круг)\nВпис.➡️Вписанный\nОпис.➡️Описанный\nПрил.➡️Прилежащая\nРавноб.➡️Равнобедренный\nКат.➡️Катет\nГипот.➡️Гипотенуза\nСтор.➡️Стороны\nИзв.➡️Изввестный(-ая)\nH(h)➡️Высота в общей геометрии\nS(s)➡️Площадь в общей геометрии\nL➡️Сторона в общей геометрии\nM(m)➡️Медиана в общей геометрии\nПроизв.➡️Произвольный(ого)\nПолуп.➡️Полупериметр\nОсн.➡️Основние/основа\nЧ/з➡️Через\nР-но➡️Ровно\nРавтост.➡️Равносторонний'''
# mess3 = 'Связь с разработчиком: @MarcoPopa'
# mess4 = 'P.s после каждого ответа бота можете сразу продолжать искать другие формулы. Введи название формулы ниже?'
# mess5 = 'Введи ниже переменную а'
# mess6 = 'Введи переменную b'
# mess7 = 'Введи переменную с'
bot.send_message(
chat_id=message.chat.id,
text='Поддержите разработку если считаете это нужным, это поможет проэкту существовать и развиваться? '
'Карта ПриватБанка: 5168 7559 0884 1170 Спасибо заранее!')
@bot.message_handler(func=lambda msg: msg.text == 'Быстрый поиск?:', chat_types=["private"])
def support(message: types.Message):
markup = types.ReplyKeyboardMarkup(resize_keyboard=True, row_width=2)
# смысла создвать кнопки таким образом особого нет, рекомендую просто сделать так.
# algebra = types.KeyboardButton()
# geoma = types.KeyboardButton('Геометрия♾️')
# nazadbistr = types.KeyboardButton('Вернуться в главное меню⬅️')
markup.add('Алгебра?', 'Геометрия♾️', 'Вернуться в главное меню⬅️')
bot.send_message(
chat_id=message.chat.id,
text='Выбери предмет:',
# parse_mode='html',
reply_markup=markup)
UPD1. Попробуйте вот это
from telebot import TeleBot, types
import math
from pymongo import MongoClient
import config
bot = TeleBot(config.BOT_TOKEN)
# CONTENT_TYPES = ["text", "audio", "document", "photo", "sticker", "video", "video_note", "voice", "location", "contact",
# "new_chat_members", "left_chat_member", "new_chat_title", "new_chat_photo", "delete_chat_photo",
# "group_chat_created", "supergroup_chat_created", "channel_chat_created", "migrate_to_chat_id",
# "migrate_from_chat_id", "pinned_message"]
cur_state = None
cluster = MongoClient("mongodb+srv://palladium:[email protected]/mathbot?retryWrites=true&w=majority")
db = cluster["mathbot"]
user = db["users"]
def Handler_SquareRoot(message: types.Message):
global cur_state
a, b, c = [int(num) for num in message.text.split(' ')]
D = b * b - 4 * a * c
if D < 0:
mess = "Дискриминант меньше нуля, корней нет"
elif D == 0:
x = -b / (2 * a)
mess = f"Дискриминант равен нулю, единственный корень:\nx = {x:.5f}"
else:
x1 = (-b + math.sqrt(D)) / (2 * a)
x2 = (-b - math.sqrt(D)) / (2 * a)
mess = f"Дискриминант больше нуля, корни:\nx1 = {x1:.5f}, x2 = {x2:.5f}"
cur_state = None
bot.send_message(message.chat.id, mess)
# States
state_SquareRootGet = "SquareRootGet"
state_handlers = {
state_SquareRootGet: Handler_SquareRoot
}
already_added = False
# Функция, обрабатывающая команду /start
@bot.message_handler(commands=["start"], chat_types=['private'])
def start(message: types.Message):
if user.find_one({"user_id": message.from_user.id}):
return
else:
user.insert_one({"user_id": message.from_user.id, "user_name": f"{message.from_user.username}"})
markup = types.ReplyKeyboardMarkup(resize_keyboard=True, row_width=2)
markup.add('Начать поиск?:', 'Связь с разработчиком', 'Поддержать разработку?',
'Список сокращений:', 'Быстрый поиск?:', 'Калькулятор кв. уравнений?')
bot.send_message(chat_id=message.chat.id,
text=f'Привет, {message.from_user.first_name}!\n'
f'Я формулознайка, наилучший бот - помощник в поиске формул по математике ?, '
f'выбери что ты хочешь:',
# parse_mode='html',
reply_markup=markup)
@bot.message_handler(commands=["checkuser"], func=lambda msg: msg.from_user.id == 1219000385)
def check_user(message: types.Message):
users = user.find({})
coutn_users = user.count_documents({})
bot.send_message(message.chat.id, f"Кол-во пользователей, которые используют Ваш бот: {coutn_users}")
for user_ in users:
bot.send_message(message.chat.id, f"ID = {user_['user_id']}\nUsername = @{user_['user_name']}")
# во-первых делайте для каждого вашего if одтельный хендлер
# не и всякие content_types=["text"] который стоят по-умолчанию смысла писать нет
# также рекомендую указывть аннотации, они облегчат написание кода
# к примеру message: types.Message, если вы юзате pycharm
# то он будет давать подсказки если вы напишете message. (с точкой)
# вместо ваших ифов делаете такую конструкцию, вы будете смотреть на хендлер
# и сразу поймете что он делает и при каких условиях срабатывает
@bot.message_handler(func=lambda msg: msg.text == "Калькулятор кв. уравнений?")
def func(message: types.Message):
global cur_state
# даже pycharm ругается на эту запись
# if not cur_state is None:
# делайте так. Так даже понятнее, типа такой-то стейт является не None
if cur_state is not None:
state_handlers[cur_state](message)
print("Changed state to ", cur_state)
else:
# зачем вы создаете переменную mess? Оно же только мешает восприятию
# mess = "Введи a, b, c из a*x*x + b*x + c = 0"
# просто сделайте перенос строки
bot.send_message(
chat_id=message.chat.id,
text="Введи a, b, c из a*x*x + b*x + c = 0",
# зачем вам указывать parse_mode? Вы же не пользуетесь им.
# parse_mode='html',
reply_markup=types.ReplyKeyboardRemove())
cur_state = state_SquareRootGet
print("Changed state to ", cur_state)
# здесь у вас была просто функция без декоратора, потому бот не видел её
# я разбил её на два хендлера
# ах и ещё вместо ифа if message.chat.type == 'private'
# я сделал это условия в самом хендлере
@bot.message_handler(func=lambda msg: msg.text == 'Поддержать разработку?', chat_types=["private"])
def support(message: types.Message):
bot.send_message(
chat_id=message.chat.id,
text='Поддержите разработку если считаете это нужным, это поможет проэкту существовать и развиваться? '
'Карта ПриватБанка: 5168 7559 0884 1170 Спасибо заранее!')
@bot.message_handler(chat_types=['private'], func=lambda msg: msg.text == 'Быстрый поиск?:')
def fast_search(message: types.Message):
markup = types.ReplyKeyboardMarkup(resize_keyboard=True, row_width=2)
markup.add('Алгебра?', 'Геометрия♾️', 'Вернуться в главное меню⬅️')
bot.send_message(message.chat.id, 'Выбери предмет:', reply_markup=markup)
@bot.message_handler(chat_types=['private'], func=lambda msg: msg.text == 'Геометрия♾️')
def geometry(message: types.Message):
markup = types.ReplyKeyboardMarkup(resize_keyboard=True, row_width=2)
markup.add('Квадрат?', 'Прямоугольник⬜', 'Круг?',
'Треугольник?', 'Ромб?', 'Трапеция⏢', 'Вернуться в быстрый выбор⬅️')
bot.send_message(message.chat.id, 'Выбери фигуру:', reply_markup=markup)
@bot.message_handler(chat_types=['private'], func=lambda msg: msg.text == 'Вернуться в быстрый выбор⬅️')
def back_to_fast_search(message: types.Message):
markup = types.ReplyKeyboardMarkup(resize_keyboard=True, row_width=2)
markup.add('Алгебра?', 'Геометрия♾️', 'Вернуться в главное меню⬅️')
bot.send_message(message.chat.id,
f'Ты в быстром поиске,{message.from_user.first_name}! Выбери что ты хочешь:',
reply_markup=markup)
@bot.message_handler(chat_types=['private'], func=lambda msg: msg.text == 'Алгебра?')
def algebra(message: types.Message):
markup = types.ReplyKeyboardMarkup(resize_keyboard=True, row_width=2)
markup.add('Вернуться назад⬅️', 'Таблица умножения', 'Квадратное уравнение', 'Графики')
bot.send_message(message.chat.id,
'Ты в разделе Алгебра?, выбери что ты хочешь:',
reply_markup=markup)
@bot.message_handler(chat_types=['private'], func=lambda msg: msg.text == 'Вернуться назад⬅️')
def back(message: types.Message):
markup = types.ReplyKeyboardMarkup(resize_keyboard=True, row_width=2)
markup.add('Алгебра?', 'Геометрия♾️', 'Вернуться в главное меню⬅️')
bot.send_message(message.chat.id,
f'Ты в быстром поиске,{message.from_user.first_name}! Выбери что ты хочешь:',
reply_markup=markup)
@bot.message_handler(chat_types=['private'], func=lambda msg: msg.text == 'Вернуться в главное меню⬅️')
def back_to_main_menu(message: types.Message):
markup = types.ReplyKeyboardMarkup(resize_keyboard=True, row_width=2)
markup.add('Начать поиск?', 'Связь с разработчиком', 'Поддержать разработку?',
'Список сокращений', 'Быстрый поиск?', 'Калькулятор кв. уравнений?')
bot.send_message(message.chat.id,
f'Ты в главном меню,{message.from_user.first_name}! Выбери что ты хочешь:',
reply_markup=markup)
@bot.message_handler(chat_types=['private'], func=lambda msg: msg.text == 'Графики')
def graphic(message: types.Message):
markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
markup.add('Линейная', 'Квадратическая', 'Степенная', 'Обратно-пропорциональная', 'Логарифмическая',
'Функция в модуле', 'Другие функции(sin,cos)', 'Вернуться назад⬅️')
bot.send_message(message.chat.id,
f'Ты в поиске графиков,{message.from_user.first_name}! Выбери какой график тебе нужен:',
reply_markup=markup)
@bot.message_handler(chat_types=['private'], func=lambda msg: msg.text == 'Другие функции(sin,cos)')
def other_funcs(message: types.Message):
markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
markup.add('sin', 'cos', 'tg', 'ctg', 'Вернуться назад⬅️')
bot.send_message(message.chat.id,
f'Ты в поиске графиков,{message.from_user.first_name}! Выбери какой график тебе нужен:',
reply_markup=markup)
@bot.message_handler(chat_types=['private'], func=lambda msg: msg.text == 'Список сокращений')
def list_abbreviations(message: types.Message):
bot.send_message(
message.chat.id,
'Треуг.(Тр.)➡️Треугольник\nКв.➡️Квадрат\nПрямоуг.➡️Прямоугольник(-ый)\nОкр.➡️Окружность(круг)\n'
'Впис.➡️Вписанный\nОпис.➡️Описанный\nПрил.➡️Прилежащая\nРавноб.➡️Равнобедренный\nКат.➡️Катет\n'
'Гипот.➡️Гипотенуза\nСтор.➡️Стороны\nИзв.➡️Изввестный(-ая)\nH(h)➡️Высота в общей геометрии\n'
'S(s)➡️Площадь в общей геометрии\nL➡️Сторона в общей геометрии\nM(m)➡️Медиана в общей геометрии\n'
'Произв.➡️Произвольный(ого)\nПолуп.➡️Полупериметр\nОсн.➡️Основние/основа\nЧ/з➡️Через\nР-но➡️Ровно\n'
'Равтост.➡️Равносторонний')
@bot.message_handler(chat_types=['private'], func=lambda msg: msg.text == 'Связь с разработчиком')
def contact(message: types.Message):
bot.send_message(message.chat.id, 'Связь с разработчиком: @MarcoPopa')
@bot.message_handler(chat_types=['private'], func=lambda msg: msg.text == 'Начать поиск?')
def start_search(message: types.Message):
bot.send_message(message.chat.id, 'P.s после каждого ответа бота можете сразу продолжать искать другие формулы. '
'Введи название формулы ниже?')
@bot.message_handler(chat_types=['private'], func=lambda msg: msg.text in [
'Таблица умножения', 'Табличка умножения', 'таблица умножения', 'табличка множения'])
def multiplication_table(message: types.Message):
photo1 = open('png/3ebc0dfa867e344cf30d81409cfd7558.jpg', 'rb')
bot.send_photo(message.chat.id, photo1)
@bot.message_handler(chat_types=['private'], func=lambda msg: msg.text in [
'теорема пифагора', 'Теорема Пифагора', 'теорема Пифагора'])
def pythagoras_theorem(message: types.Message):
photo1 = open('png/maxresdefault.jpg', 'rb')
bot.send_photo(message.chat.id, photo1)
if __name__ == '__main__':
bot.infinity_polling(skip_pending=True)