Как я писал бота для школьных д-з и менял базу данных

в 15:41, , рубрики: api, backend, mysql, telegram

Здравствуйте, Хабровчане!
Сегодня я постараюсь поведать вам как школьник может наговнокодить написать бота для хранения домашки для VK.

Осторожно

Сразу обращу внимание, что для серьёзных проектов так строить инфраструктуру нельзя, весь этот проект создавался только для развлечения и убивания времени, ну и презентации на всяких школьных псевдо проектных конференциях.


Бот был написан на PHP, а ради эксперемента я решил получать обновления не с помощью вебхуков CallBack API, а используя LongPoll.

Из-за того, что я ни разу не писал ботов, используя этот метод получения обновлений, меня терзали смутные сомнения на счёт того, смогу ли я на PHP написать сего бота, но в итоге всё получилось. Теперь перейду к тому, как у меня зарождались идеи и как я их реализовывал.

Первой у меня, вообще, родилась идея написать бота для того, чтобы в нём хранить домашку. Ну как хранить. Что-то по типу заметок, но внутри VK, так как в заметки я редко захожу, да и не очень удобны они для меня.

Для того, чтобы реализовать банального бота с домашкой я создал одну таблицу в базе данных, в которой хранились название предмета, сама домашка и на какое число всё это счастье задано. Это описывать не очень интересно, поэтому опущу этот момент, но приведу мощную ER-диаграмму того, как выглядела база данных в самом начале.

image

Потом я подумал, а почему бы не дать возможность другим людям пользоваться ботом. Ну и дал людям эту возможность. Немного поменял базу данных, но таблица, вокруг которой всё это крутится осталась почти неизменной.

image

Из ER-диаграммы можно понять, что каждый пользователь принадлежит какой-то группе. Вход в уже существующую группу осуществляется по токену, а для каждой новой генерируется свой уникальный токен. И сами задания тоже относятся к той или другой группе, чтобы пользователи не видели хаос из своих и чужих заданий.

Дописал код, здесь тоже ничего интересного, в принципе нет. Только сделал ещё так, чтобы старые задания не показывались, дабы не удалять вручную всё это дело, но, думаю, запрос SELECT в SQL написать достаточно просто.

А теперь пришло время для веселья: я начал добавлять функции, которые будут тормозить общую очередь сообщений, поэтому я принял решение выносить их в отдельные скрипты, так как в многопоточность я пока что не могу, но выбрал LongPoll. (И есть ли она при таком использовании PHP?)

И вот эти функции: рассылка сообщений всем участникам группы и генерация QR-кодов, в которых зашифрован ключ для вступления в группу.

Для этого я просто создал ещё одну таблицу в базе данных, в которую заношу текст рассылки и кому она предназначена. База в итоге приняла такой вид.

image

А генерация QR-кодов вынесена вообще в отдельный процесс, который тоже получает обновления от VK об исходящих сообщениях, и смотрит, в каком из сообщений есть ключ от группы.

Пока всё выглядит всё более-менее адекватно, но потом я пошёл нарушать реляционную модель, занося JSON в базу данных.

Что же за JSON я могу заносить в базу? Я заношу параметр attachments, который получаю от VK, и дальше обрабатываю при рассылках сообщений, дабы не загружать основной процесс.

В итоге всё это дело выглядит вот так.

image

Примерно таким же методом потом я добавил прикрепление файлов к заданиям в боте. Задание добавляется сразу, а файлы постепенно прикрепляются, если подходят по формату и проходят по размеру для Telegram Bot Api. Файлы я загружаю в Telegram через кластер ботов и сохраняю id файла.

Храню я файлы в Телеграме из-за того, что на сервере, на котором я всё это держу, не очень много места, а расширяться для меня очень сложно финансово.

Вся база начала выглядеть вот так:

image

Но теперь передо мной встала задача: как я буду отдавать файлы пользователям обратно? Тут я сделал почти такую же логику, как и с добавлением файлов.

image

Потом ещё добавился и бот для Телеги, но это я описывать пока не буду.

В принципе, я считаю, что структура базы данных неплохая, но что-то мне здесь не нравится. Возможно, кому-то из новичков будет полезно посмотреть как можно проектировать структуру БД по ходу развития идеи, а мне будет интересно послушать критику по организации моей базы и принять что-то на вооружение.

Статейка небольшая, но может на себя обрушить критику.

Клац 1

«Фулл до 5 вечера у меня на столе!»
Все исходники бота выложу на гит после защиты проекта, да и статью не грех будет написать.

Клац 2

Некоторые идеи, которые касаются работы с файлами, мне подсказали в чате Хабра в телеге, меня часто можно там увидеть.

Клац 3

Потыкать живого бота можно тут. Буду рад фидбэку.

Автор: y_durov

Источник


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js