Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import asyncio
- import logging
- import aiohttp
- import sqlite3
- from aiogram.types import ReplyKeyboardMarkup, KeyboardButton
- from aiogram import Bot
- from aiogram.dispatcher import Dispatcher
- from aiogram.utils.executor import start_polling
- # токен бота
- API_TOKEN = "557867522:AAEjA7-GQoT4NROcYx4N-Z3scI-28i8Kxl8"
- # прокси
- PROXY_URL = 'http://51.15.69.7:3128'
- # вроде тоже для прокси
- logging.basicConfig(level=logging.INFO)
- loop = asyncio.get_event_loop()
- # необходимо для более удобной работы с ботом
- bot = Bot(token=API_TOKEN, loop=loop, proxy=PROXY_URL)
- dp = Dispatcher(bot)
- # создаётся база данных и курсор (необходим для работы с базой)
- conn = sqlite3.connect("bd.db")
- cursor = conn.cursor()
- # создаётся столбцы в таблице и таблица
- # try необходим тк при повторном создании таблицы выдаётся ошибка
- # можно заменить Exception на реальную ошибку тк Exception ловит все ошибки
- try:
- cursor.execute("CREATE TABLE database (id integer, classes integer)")
- except Exception:
- pass
- # присоединение к прокси
- async def fetch(url, proxy=None, proxy_auth=None):
- async with aiohttp.ClientSession() as session:
- async with session.get(url, proxy=proxy, proxy_auth=proxy_auth) as response:
- return await response.text()
- # что надо делать боту при команде start
- @dp.message_handler(commands=['start'])
- async def crutch(message):
- # создание клавиатуры
- keyboard = ReplyKeyboardMarkup()
- # создание кнопок для клавы
- kl_7 = KeyboardButton('7 класс')
- kl_8 = KeyboardButton('8 класс')
- kl_9 = KeyboardButton('9 класс')
- kl_10 = KeyboardButton('10 класс')
- kl_11 = KeyboardButton('11 класс')
- # добавление кнопок к клаве
- keyboard.add(kl_7, kl_8, kl_9, kl_10, kl_11)
- # отправка сообщения человеку и отправка клавы(для более удобной работы человека
- await bot.send_message(message.chat.id, text="В каком вы классе?", reply_markup=keyboard)
- # можно сделать карутину и тогда можно будет уменьшить и украсить код, но это по желанию
- # update работает и ладно, костыль, но из-за него придётся придумать работающую структуру и переписать уюму кода
- # ДЭДЛАЙН БЛИЗКО не до этого
- async def change_class(nam, from_id, id_chat):
- # берём id из сообшения
- id_user = from_id
- # поиск в таблице по id класс человека (тут создание текста запроса)
- sql = "SELECT classes FROM database WHERE id=?"
- # сам запрос
- cursor.execute(sql, [id_user])
- # сохранение результатов запроса
- class_fetchone = cursor.fetchone()
- if class_fetchone is None:
- # обработка исключения если класс ещё не введён
- await bot.send_message(id_chat, text="Вы ещё не ввели свой класс")
- else:
- if class_fetchone[0] == nam:
- # обработка исключения если класс и так какой он просит
- await bot.send_message(id_chat, text="Ваш класс и так %s" % nam)
- else:
- # даём человеку знать что его класс изменён (для красоты)
- await bot.send_message(id_chat, text="Ваш класс изменён на %s" % nam)
- # изменение класса человека на тот что он просит
- sql = """UPDATE database SET classes = %d WHERE id = '%s'""" % (nam, from_id)
- cursor.execute(sql)
- conn.commit()
- # для этой и последующих детырёх функций вфполняем действия описанные в функции change_class
- @dp.message_handler(commands=['7_class'])
- async def change_class_7(message):
- await change_class(nam=7, from_id=message['from'].id, id_chat=message.chat.id)
- @dp.message_handler(commands=['8_class'])
- async def change_class_8(message):
- await change_class(nam=8, from_id=message['from'].id, id_chat=message.chat.id)
- @dp.message_handler(commands=['9_class'])
- async def change_class_9(message):
- await change_class(nam=9, from_id=message['from'].id, id_chat=message.chat.id)
- @dp.message_handler(commands=['10_class'])
- async def change_class_10(message):
- await change_class(nam=10, from_id=message['from'].id, id_chat=message.chat.id)
- @dp.message_handler(commands=['11_class'])
- async def change_class_11(message):
- await change_class(nam=11, from_id=message['from'].id, id_chat=message.chat.id)
- # обработка остальных сообщений (отличных от команд)
- @dp.message_handler()
- async def foundation(message):
- # для примерного представления кто написал
- print(message)
- # создаём список где находится вся информация по теоремам
- theorems = [["аксиома", 7, 0, ["прям", "перпендикуляр", "аксиома"],
- "Две прямые, перпендикулярные третьей, не пересекаются"],
- ["теорема", 7, 0, ["прям", "точк", "перпендикуляр", "провести"],
- """Из точки,
- не лежащей на данной прямой можно провести перпендикуляр к этой прямой и притом только один"""],
- ["теорема", 7, 0,
- ["прям", "секущ", "углы", "накрест лежащие", "соответственные", "пересеч", "параллель", "угол"],
- """Если при пересечении двух прямых секущей накрест лежащие/
- соответственные углы равны, то такие прямые параллельны"""],
- ["теорема", 7, 0, ["односторонни", "угол", "углы", "пересеч", "секущ", "сумма", "параллель"],
- """Если при пересечении двух прямых секущей сумма односторонних углов
- равна 180 градусов, то прямые параллельны"""],
- ["аксиома", 7, 0, ["точк", "прямая", "проходит", "одна", "любые"],
- "Через любые две точки проходит прямая, и притом только одна"],
- ["аксиома", 7, 0, ["отрезок", "луч", "равный", "люб", "равный"],
- "На любом луче можно отложить отрезок, равный данному, и притом только один"],
- ["аксиома", 7, 0, ["луч", "сторон", "угол", "равный", "неразвёрнут"],
- """От любого луча в заданную сторону можно отложить угол,
- равный данному неразвёрнутому углу, и притом только один"""],
- ["аксиома", 7, 0, ["точк", "параллель", "прям", "равноудален"],
- "Все точки каждой из двух параллельных прямых равноудалены от другой прямой"],
- ["аксиома", 7, 0, ["точк", "прям", "проходит", "параллель", "следствие", "пересека"],
- """"Через точку, не лежащую на данной прямой, проходит только одна прямая, параллельная данной.
- Следствия: 1. Если прямая пересекает одну из параллельных прямых, тона пересекает и другую.
- 2. Если две прямые параллельны третьей прямой, то они параллельны"""],
- ["теорема", 7, 0, ["вертикальн", "равн", "угл", "угол"], "Вертикальные углы равны"],
- ["теорема", 7, 0, ["точк", "биссектрис", "неразвёрнут", "сторон", "равноудал"],
- "Каждая точка биссектрисы неразвёрнутого угла равноудалена от его сторон"],
- ["другое", 7, 0, ["сумм", "смежны", "градус", "180", "угол", "угл"],
- "Сумма смежных углов равна 180 градусов"],
- ["теорема", 7, 0, ["первый", "признак", "сторон", "угол", "угл", "треугольник", "рав", "катет"],
- """Если две стороны и угол между ними одного треугольника соответственно равны двум сторонам
- и углу между ними другого треугольника, то такие треугольники равны.
- Если катеты одного прямоугольного треугольника соответственно равны катетам другого,
- то такие треугольники равны"""],
- ["теорема", 7, 0, ["второй", "признак", "рав", "треугольник", "сторон", "угл"],
- """Если сторона и два прилежащих к ней угла одного треугольника соответственно равны
- стороне и двум прилежащим к ней углам другого треугольника, то такие треугольники равны"""],
- ["теорема", 7, 0, ["третий", "признак", "рав", "треугольник", "три", "сторон"],
- """Если три стороны одного треугольника соответственно равны
- трём сторонам другого треугольника, то такие треугольники равны"""],
- ["теорема", 7, 0, ["ервый", "признак", "подоб", "треугольник", "угл", "равн"],
- """Если два угла одного треугольника соответственно равны
- двум углам другого треугольника, то такие треугольники равны"""],
- ["теорема", 7, 0, ["торой", "признак", "подоб", "треугольник", "пропорци", "угл"],
- """Если две стороны одного треугольника пропорциональны двум сторонам другого треугольника и углы,
- заключённые между этими сторонами, равны, то такие треугольники подобны"""],
- ["теорема", 7, 0, ["третий", "признак", "подоб", "треугольник", "три", "пропорци"],
- """Если три стороны одного треугольника пропорциональны трём сторонам другого,
- то такие треугольники подобны"""],
- ["теорема", 7, 0, ["треугольник", "равнобедренн", "углы", "основани"],
- "В равнобедренном треугольнике углы при основании равны"],
- ["теорема", 7, 0, ["равнобедренн", "биссектрисс", "основани", "медиан", "высот", "треугольник"],
- "В равнобедренном треугольнике биссектриса, проведённая к основанию, является медианой и высотой"],
- ["теорема", 7, 0, ["треугольник", "медиан", "пересек", "точк", "отношен", "высот", "биссектрис"],
- """В любом треугольнике медианы пересекаются в одной точке и этой точкой делятся в отношении 2:1,
- считая от вершины; биссектрисы пересекаются в одной точке и каждая из них делит его стороны на части,
- пропорциональные двум другим сторонам; высоты или их продолжения пересекаются в одной точке"""],
- ["теорема", 7, 0, ["биссектрис", "угл", "сторон", "неразвёрнут", "угл"],
- "Каждая точка биссектрисы неразвёрнутого угла равноудалена от его сторон"],
- ["теорема", 7, 0, ["угл", "треугольник", "остр", "тупой", "прямой"],
- "В любом треугольнике либо все углы острые, либо два угла острые , а третий угол тупой или прямой"],
- ["теорема", 8, 0, ["треугольник"], "угол", "угл", "внешн", "сумм", "смежн",
- "Внешний угол треугольника равен сумме двух углов треугольника, не смежных с ним"],
- ["теорема", 9, 0, ["срединн", "перпендикуляр", "отрез", "кон", "следствие", "треугольник", "пересек"],
- """Каждая точка срединного перпендикуляра к отрезку равноудалена от концов этого отрезка.
- Следствие: Срединные перпендикуляры к сторонам треугольника пересекаются в одной точке"""],
- ["теорема", 7, 0, ["Теорема о соотношении между сторонами и углами прямоугольного треугольника"],
- """В треугольнике против большей стороны лежит больший угол.
- Следствия: 1) В прямоугольном треугольнике гипотенуза больше катета
- 2) Если два треугольника равны, то треугольник равнобедренный"""],
- ["теорема", 7, 0, ["сторон", "сумм", "треугольник"],
- "Каждая сторона треугольника меньше суммЫ двух других сторон"],
- ["теорема", 9, 0, ["Теорема синусов", "сторон", "треугольник", "синус", "угл", "пропорци"],
- "Стороны треуольника пропорциональны синусам противолежащих углов"],
- ["теорема", 9, 0, ["Теорема косинусов"],
- """Квадрат стороны треугольника равен сумме квадратов двух других сторон
- минус удвоенное произведение этих сторон на косинус угла между ними"""],
- ["теорема", 8, 0, ["гипотенуз", "катет", "сумм", "треугольник"],
- "Катет прямоугольного треугольника, лежащий против угла в 30 градусов, равен половие гипотенузы"],
- ["теорема", 8, 0, ["уг", "треугольник", "синус", "косинус", "тангенс", "котангенс"],
- """Если острый угол одного треугольника равен острому углу другого треугольника,
- то синусы, косинусы, тангенсы и котангенсы этих углов равны"""],
- ["теорема", 7, 0, ["теорема", "Пифагора", "квадрат", "гипотенуз", "катет", "сумм", "треугольник"],
- "В прямоугольном треугольнике квадрат гипотенузы равен сумме квадратов катетов"],
- ["другое", 8, 0, ["средняя", "линия", "трапец", "основан", "полусумм"],
- "Средняя линия трапеции параллельна основаниям и равна их полусумме"],
- ["другое", 8, 0, ["средняя", "линия", "треугольник", "основан", "половин"],
- "Средняя линия треугольника параллельна основанию и равна его половине"],
- ["другое", 8, 0, ["диагонал", "прямоугольник", "параллелограмм", "биссектрис"],
- """Диагонали прямоугольника равны, взаимно перпендикулярны и точкой пересечения делятся пополам.
- Диагональ параллелограмма является биссектрисой для углов, из которых исходит"""],
- ["теорема", 8, 0, ["высот", "треугольник", "площад", "основани", "равн", "относ"],
- "Если высоты двух треугольников равны, то их площади относятся как основания"],
- ["теорема", 8, 0, ["равен", "треугольник", "уг", "площад", "относятся", "произведен", "заключающ"],
- """Если угол одного треугольника равен углу другого треугольника,
- то площади этих треугольников относятся как произведения сторон заключающих равные углы"""],
- ["теорема", 8, 0, ["отношение", "площад", "подоб", "треугольник", "квадрат", "коэффициент"],
- "Отношение площадей двух подобных треугольников равно квадрату коэффициента подобия"],
- ["теорема", 9, 0, ["касательн", "окружност", "перпендикуляр", "радиус", "точк", "отрез"],
- """Касательная к окружности перпендикулярна радиусу, проведённому в точку касания.
- Следствие: Отрезки касательных к окружности, проведённые из одной точки ,
- равны и составляют равные углы с прямой, проходящей через эту точку и центр окружности"""],
- ["теорема", 9, 0, ["вписанн", "угол", "половин", "дуг", "опирает", "полуокружност", "прямой"],
- """Вписанный угол измеряется половиной дуги,
- на которую он опирается. Вписанный угол, опирающийся на полуокружность – прямой"""],
- ["теорема", 9, 0, ["вписанн", "угл", "опира", "дуг"],
- "Вписанные углы, опирающиеся на одну и ту же дугу, равны"],
- ["теорема", 10, 0, ["произведен", "отрез", "хорд", "произведен", "пересекающ"],
- "Произведение отрезков одной из двух пересекающихся хорд равно произведению отрезков другой хорды"],
- ["теорема", 9, 0, ["угол", "кас", "хорд", "точк", "половин", "дуг", "заключ"],
- """Угол между касательной и хордой, проходящей через точку касания,
- измеряется половиной заключённой в нём дуги"""],
- ["теорема", 9, 0, ["квадрат", "касательн", "произведен", "отрез", "секущ"],
- "Квадрат касательной равен произведению отрезков секущей"],
- ["теорема", 10, 0, ["угол", "хорд", "полусумм", "дуг", "пересек", "заключ"],
- "Угол между пресекающимися хордами равен полусумме заключённых в них дуг"],
- ["теорема", 10, 0, ["угол", "полуразност", "дуг", "секущ", "заключ"],
- "Угол между секущими равен полуразности е заключённых в нём дуг"],
- ["теорема", 10, 0, ["угол", "касательн", "секущ", "полуразност", "дуг", "заключен"],
- "Угол между касательной и секущей равен полуразности заключённых в нём дуг"],
- ["теорема", 10, 0, ["угол", "касательн", "полуразност", "заключ", "дуг"],
- "Угол между касательными равен полуразности заключённых в нём дуг"],
- ["теорема", 10, 0,
- ["теорема", "Птолемея", "произведени", "диагонал", "вписанн", "четырёхугольник", "сумм",
- "противоположн", "сторон"],
- "Произведение диагоналей вписанного четырёхугольника равно сумме произведений противоположных сторон"],
- ["другое", 9, 0, ["треугольник", "вписать", "окружност", "люб"],
- "В любой треугольник можно вписать окружность "],
- ["другое", 9, 0, ["около", "люб", "треугольник", "описать", "окружност"],
- "Около любого треугольника можно описать окружность "],
- ["другое", 9, 0, ["описанн", "четырёхугольник", "сумм", "противоположн", "сторон", "равн"],
- "В любом описанном четырёхугольнике суммы противоположных сторон равны"],
- ["теорема", 9, 0, ["люб", "четырёхугольник", "сумм", "угл", "равн", "180"],
- "В любом вписанном четырёхугольнике сумма противоположных углов равна 180 градусов"],
- ["аксиома", 9, 0, ["около", "правильн", "многоугольник", "описать", "окружность", "люб"],
- "Около любого правильного многоугольника можно описать окружность, и притом только одну"],
- ["аксиома", 9, 0, ["правильн", "многоугольнк", "вписать", "окружност"],
- "В любой правильный многоугольник можно вписать окружность, и притом только одну"],
- ["другое", 9, 0, ["окружност", "вписанн", "правильн", "многоугольник", "касается", "сторон", "середин"],
- "Окружность, вписанная в правильный многоугольник, касается сторон многоугольника в их серединах"],
- ["теорема", 9, 0,
- ["центр", "окружност", "вписанн", "правильн", "многоугольник", "совпадает", "вписанн", "описанн"],
- """Центр окружности, вписанной в правильный многоугольник,
- совпадает с центром окружности, описанной вокруг этого же многоугольника"""],
- ["аксиома", 10, 0, ["аксиома", "а1", "плоскость", "определ", "точк", "прям", "лежащ"],
- """Любая плоскость определяется 3мя точками, не лежащими на данной прямой
- / прямой и не лежащей на ней точкой / двумя пересекающимися прямыми / двумя параллельными прямыми"""],
- ["аксиома", 10, 0, ["2", "точк", "прям", "лежат", "плоскост", "аксиома", "а2"],
- "Если 2 точки прямой лежат в одной плоскости, то все точки лежат в этой плоскости"],
- ["аксиома", 10, 0, ["плоскост", "пересек", "прям", "аксиома", "а3"],
- "Две плоскости пересекаются по прямой"],
- ["теорема", 10, 0, ["прям", "плоскость", "параллель", "пересек", "лемма"],
- "Если одна из двух параллельных прямых пересекает плоскость, то и другая прямая её пересекает"]]
- # берём id из сообшения
- id_user = message['from'].id
- # берём такст сообщения
- phrase = str(message.text)
- # разбиваем фразу по пробемам при желании можно через запятую добавить другие символы
- phrase = phrase.split(' ')
- # создание клавы как при команде старт
- keyboard = ReplyKeyboardMarkup()
- # поиск в таблице по id класс человека (тут создание такста запроса)
- sql = "SELECT classes FROM database WHERE id=?"
- # сам запрос
- cursor.execute(sql, [id_user])
- # сохранение результатов запроса
- class_fetchone = cursor.fetchone()
- # если класса по id нет (человека нет в базе)
- if class_fetchone is None:
- # ждём пока 1 слово фразы человека будет числом
- # (пробует преобразовать в число и если это не цифры то получаем ошибку)
- try:
- # если у нас тут возникае ошибка (1 слово не число),
- # то мы переходим к исключению, иначе смотрим что за класс он написал
- if (int(phrase[0]) == 7) or (int(phrase[0]) == 8) or (int(phrase[0]) == 9) or (int(phrase[0]) == 10) or (
- int(phrase[0]) == 11):
- # если класс соответствует нашим запросам, то добавляем человеку в базу
- cursor.execute("INSERT INTO database VALUES ('%i', '%i')" % (id_user, int(phrase[0])))
- # созраняем изменения в базе
- conn.commit()
- # чисто для красоты пишем человеку
- await bot.send_message(message.chat.id, text="Запомнил")
- # добавляем кнопки в клаву
- kl_1 = KeyboardButton("аксиомы")
- kl_2 = KeyboardButton("теоремы")
- kl_3 = KeyboardButton("другое")
- keyboard.add(kl_1, kl_2, kl_3)
- # говорим человеку о возможностях бота
- await bot.send_message(message.chat.id,
- text="""Что вам надо?\n
- Вы можете выбрать кнопками и тогда вам отправится весь доступный вам материал
- или вы можите ввести вручную что вы ищите""",
- reply_markup=keyboard)
- # что мы делаем если человк вписал не нужное нам число
- else:
- # создание кнопок для клавы
- kl_7 = KeyboardButton('7 класс')
- kl_8 = KeyboardButton('8 класс')
- kl_9 = KeyboardButton('9 класс')
- kl_10 = KeyboardButton('10 класс')
- kl_11 = KeyboardButton('11 класс')
- # добавление кнопок к клаве
- keyboard.add(kl_7, kl_8, kl_9, kl_10, kl_11)
- # просим ввести в каком он классе
- await bot.send_message(message.chat.id, text="В каком вы классе? (7-11)", reply_markup=keyboard)
- # если это не число, то возникает ошибка и в таком случае мы снова просим ввести в каком он классе
- except Exception:
- # аналог команде старт
- kl_7 = KeyboardButton('7 класс')
- kl_8 = KeyboardButton('8 класс')
- kl_9 = KeyboardButton('9 класс')
- kl_10 = KeyboardButton('10 класс')
- kl_11 = KeyboardButton('11 класс')
- keyboard.add(kl_7, kl_8, kl_9, kl_10, kl_11)
- await bot.send_message(message.chat.id, text="В каком вы классе? (7-11)", reply_markup=keyboard)
- # что мы делаем если человек есть в базе
- else:
- # добавляем в клаву 3 кнопки предварительно создав их
- kl_1 = KeyboardButton("аксиомы")
- kl_2 = KeyboardButton("теоремы")
- kl_3 = KeyboardButton("другое")
- keyboard.add(kl_1, kl_2, kl_3)
- # тк по 1 id может быть только 1 человек мы берём из списка только 1 значение (оно там и так 1)
- class_fetchone = class_fetchone[0]
- # отправляем текст теорем/аксиом/другого
- # в зависимости от того что человек попросит
- if len(phrase) == 1:
- if phrase[0] == "аксиомы":
- for i in theorems:
- if i[0] == "аксиома" and i[1] <= class_fetchone:
- await bot.send_message(message.chat.id, text=i[4])
- elif phrase[0] == "теоремы":
- for i in theorems:
- if i[0] == "теорема" and i[1] <= class_fetchone:
- await bot.send_message(message.chat.id, text=i[4])
- elif phrase[0] == "другое":
- for i in theorems:
- if i[0] == "другое" and i[1] <= class_fetchone:
- await bot.send_message(message.chat.id, text=i[4])
- # смотрим количество совпадений фразы и ключевых слов и записываем это в переменную
- for i in theorems:
- for q in phrase:
- for r in i[3]:
- if r in q:
- i[2] += 1
- # убираем возможность узнать человеку темы из класса привосходящего его класс
- # (Например: так человек из 8 класса не может узнать аксиому из 10)
- for i in theorems:
- if i[1] > class_fetchone:
- i[2] = 0
- # отправляем текст каждой теоремы где совпадениё больше 1
- for i in theorems:
- if i[2] >= 2:
- await bot.send_message(message.chat.id, text=i[4])
- if __name__ == '__main__':
- start_polling(dp, loop=loop, skip_updates=True)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement