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



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

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

Замечание
17.11.2019 15:55
Мне написали в личные сообщения, что на протяжении статьи не очень понятно, о каких именно домашних заданиях идёт речь.
Уточню сразу, что все задания, о которых я рассказываю в статье, заполняются как в обычном дневнике, а старые задания «исчезают».
Именно так пользователь получает те задания, которые ему будет нужно сделать.


Бот был написан на 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
Потыкать живого бота можно тут. Буду рад фидбэку.

Вы можете помочь и перевести немного средств на развитие сайта

Теги:



Комментарии (15):

  1. kababok
    /#20894214 / +1

    [смотрит на оценки поста]


    … в нас пропал дух авантюризма… мы перестали помнить, что все когда-то были школьниками — даже те, кто ещё сами школьники...


    [включает трек "Сплина" из саундтрека к "Брату-2"]

    • y_durov
      /#20894242 / +6

      Спасибо, мне этого комментария как раз и не хватало.
      Значит, всё же буду дальше продолжать мутить что-то подобное.

    • AntonPolyakov
      /#20897404

      Кстати, к постам на Хабре не хватает меток типа «для новичков», «хардкор» т.д. Тогда бы все сразу расставлялось по местам.

  2. astec
    /#20894742

    Насколько востребован? Если не секрет.

    • y_durov
      /#20895288

      Сейчас в боте около 2к пользователей. Потихоньку новые юзеры приходят.
      Сейчас с ещё одним чуваком из школы мутим сервис в ВК, чтобы тем, кто не привык к формату бота, не пришлось думать что же такое эти боты.

  3. Snake266
    /#20895966

    Классный проект. Жалко у меня не было воображения для придумывания таких, казалось бы простых и полезных, проектов. Желаю удачи на защите!

    • y_durov
      /#20896018

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

  4. 2bllk
    /#20896174 / +1

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

    • y_durov
      /#20896180

      Круто! Кстати, я тоже хочу расписание добавить, но пока думаю как. =)
      К тому же я с одним чуваком ещё и сервис VK mini app пилю. Вот нужно подумать как это в API реализовать ещё.
      И киньте ссылочку в ЛС на вашего бота. =)

  5. I7PAKTuKAHT
    /#20898414

    Первая таблица прямо просится чтобы ее нормализовали и вынесли lessons в отдельный справочник предметов) А так, по-моему, отлично)

    • y_durov
      /#20898428

      Хм, а это идея. =)
      Просто я пока не задавался эти вопросом, т.к. пользователи могут, к примеру, заносить как и «Английский язык», так и просто «англ».

  6. LlinelL
    /#20901748

    Мб вопрос будет глупый, но на чем написана база данных

    • y_durov
      /#20901752

      Всё на старом-добром MySQL. =)

  7. bano-notit
    /#20905196

    Когда пошло хранение бд в ботах для телеги и рассказ про хранение файлов в них меня начало прорывать :D
    "В какой-то момент что-то пошло куда-то не туда")