Сегодня я постараюсь поведать вам как школьник может написать бота для хранения домашки для VK.
Мне написали в личные сообщения, что на протяжении статьи не очень понятно, о каких именно домашних заданиях идёт речь.
Уточню сразу, что все задания, о которых я рассказываю в статье, заполняются как в обычном дневнике, а старые задания «исчезают».
Именно так пользователь получает те задания, которые ему будет нужно сделать.
Бот был написан на PHP, а ради эксперемента я решил получать обновления не с помощью
Из-за того, что я ни разу не писал ботов, используя этот метод получения обновлений, меня терзали смутные сомнения на счёт того, смогу ли я на PHP написать сего бота, но в итоге всё получилось. Теперь перейду к тому, как у меня зарождались идеи и как я их реализовывал.
Первой у меня, вообще, родилась идея написать бота для того, чтобы в нём хранить домашку. Ну как хранить. Что-то по типу заметок, но внутри VK, так как в заметки я редко захожу, да и не очень удобны они для меня.
Для того, чтобы реализовать банального бота с домашкой я создал одну таблицу в базе данных, в которой хранились название предмета, сама домашка и на какое число всё это счастье задано. Это описывать не очень интересно, поэтому опущу этот момент, но приведу мощную ER-диаграмму того, как выглядела база данных в самом начале.
Потом я подумал, а почему бы не дать возможность другим людям пользоваться ботом. Ну и дал людям эту возможность. Немного поменял базу данных, но таблица, вокруг которой всё это крутится осталась почти неизменной.
Из ER-диаграммы можно понять, что каждый пользователь принадлежит какой-то группе. Вход в уже существующую группу осуществляется по токену, а для каждой новой генерируется свой уникальный токен. И сами задания тоже относятся к той или другой группе, чтобы пользователи не видели хаос из своих и чужих заданий.
Дописал код, здесь тоже ничего интересного, в принципе нет. Только сделал ещё так, чтобы старые задания не показывались, дабы не удалять вручную всё это дело, но, думаю, запрос SELECT в SQL написать достаточно просто.
А теперь пришло время для веселья: я начал добавлять функции, которые будут тормозить общую очередь сообщений, поэтому я принял решение выносить их в отдельные скрипты, так как в многопоточность я пока что не могу, но выбрал LongPoll. (И есть ли она при таком использовании PHP?)
И вот эти функции: рассылка сообщений всем участникам группы и генерация QR-кодов, в которых зашифрован ключ для вступления в группу.
Для этого я просто создал ещё одну таблицу в базе данных, в которую заношу текст рассылки и кому она предназначена. База в итоге приняла такой вид.
А генерация QR-кодов вынесена вообще в отдельный процесс, который тоже получает обновления от VK об исходящих сообщениях, и смотрит, в каком из сообщений есть ключ от группы.
Пока всё выглядит всё более-менее адекватно, но потом я пошёл нарушать реляционную модель, занося JSON в базу данных.
Что же за JSON я могу заносить в базу? Я заношу параметр attachments, который получаю от VK, и дальше обрабатываю при рассылках сообщений, дабы не загружать основной процесс.
В итоге всё это дело выглядит вот так.
Примерно таким же методом потом я добавил прикрепление файлов к заданиям в боте. Задание добавляется сразу, а файлы постепенно прикрепляются, если подходят по формату и проходят по размеру для Telegram Bot Api. Файлы я загружаю в Telegram через кластер ботов и сохраняю id файла.
Храню я файлы в Телеграме из-за того, что на сервере, на котором я всё это держу, не очень много места, а расширяться для меня очень сложно финансово.
Вся база начала выглядеть вот так:
Но теперь передо мной встала задача: как я буду отдавать файлы пользователям обратно? Тут я сделал почти такую же логику, как и с добавлением файлов.
Потом ещё добавился и бот для Телеги, но это я описывать пока не буду.
В принципе, я считаю, что структура базы данных неплохая, но что-то мне здесь не нравится. Возможно, кому-то из новичков будет полезно посмотреть как можно проектировать структуру БД по ходу развития идеи, а мне будет интересно послушать критику по организации моей базы и принять что-то на вооружение.
Статейка небольшая, но может на себя обрушить критику.
Все исходники бота выложу на гит после защиты проекта, да и статью не грех будет написать.
Комментарии (15)
Snake266
17.11.2019 18:43Классный проект. Жалко у меня не было воображения для придумывания таких, казалось бы простых и полезных, проектов. Желаю удачи на защите!
y_durov Автор
17.11.2019 19:04Спасибо, только проект не выдуаман, а возник чуть иначе.
У нас в классе, обычно, никто не записывает домашку, а каждый раз в беседу отвечать, которую тоже не листают, уже как-то надоело.
В электронный дневник, естественно, заходить лень, да и учителя его не всегда заполняют.
Сделал сначала бота только для своего класса, а там уже понеслась мысль.
2bllk
17.11.2019 20:24+1О, я вот тоже бота делал, только не для домашнего задания, а для расписания. Бот может выдавать расписание как для школ, так и для вузов/техникумов. Бот при выдаче расписания учитывает числитель/знаменатель, т.е. выдает пары таким образом, что не надо думать «хм, а завтра числитель или знаменатель… хм, если числитель, то такая-то пара». До сих пор пользуемся группой. Для использования бота по назначению нужно добавить его в беседу группы/класса, потом через команду внести расписание и веселиться. Для каждой беседы свое расписание. Правда, популярности бот не получил, ибо я его не рекламил, но в конференциях удалось поучаствовать.
y_durov Автор
17.11.2019 20:26Круто! Кстати, я тоже хочу расписание добавить, но пока думаю как. =)
К тому же я с одним чуваком ещё и сервис VK mini app пилю. Вот нужно подумать как это в API реализовать ещё.
И киньте ссылочку в ЛС на вашего бота. =)
I7PAKTuKAHT
18.11.2019 15:05Первая таблица прямо просится чтобы ее нормализовали и вынесли lessons в отдельный справочник предметов) А так, по-моему, отлично)
y_durov Автор
18.11.2019 15:07Хм, а это идея. =)
Просто я пока не задавался эти вопросом, т.к. пользователи могут, к примеру, заносить как и «Английский язык», так и просто «англ».
bano-notit
20.11.2019 01:58Когда пошло хранение бд в ботах для телеги и рассказ про хранение файлов в них меня начало прорывать :D
"В какой-то момент что-то пошло куда-то не туда")
kababok
[смотрит на оценки поста]
… в нас пропал дух авантюризма… мы перестали помнить, что все когда-то были школьниками — даже те, кто ещё сами школьники...
[включает трек "Сплина" из саундтрека к "Брату-2"]
y_durov Автор
Спасибо, мне этого комментария как раз и не хватало.
Значит, всё же буду дальше продолжать мутить что-то подобное.
AntonPolyakov
Кстати, к постам на Хабре не хватает меток типа «для новичков», «хардкор» т.д. Тогда бы все сразу расставлялось по местам.
kababok
Boomburum — а ведь что-то в этом есть… :)