Здравствуйте, Хабровчане!
Сегодня я постараюсь поведать вам как школьник может написать бота для хранения домашки для 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
    16.11.2019 21:11
    +1

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


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


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


    1. y_durov Автор
      16.11.2019 21:26
      +6

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


    1. AntonPolyakov
      18.11.2019 10:45

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


      1. kababok
        18.11.2019 10:47

        Boomburum — а ведь что-то в этом есть… :)


  1. astec
    17.11.2019 04:41

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


    1. y_durov Автор
      17.11.2019 13:42

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


  1. Snake266
    17.11.2019 18:43

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


    1. y_durov Автор
      17.11.2019 19:04

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


  1. 2bllk
    17.11.2019 20:24
    +1

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


    1. y_durov Автор
      17.11.2019 20:26

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


  1. I7PAKTuKAHT
    18.11.2019 15:05

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


    1. y_durov Автор
      18.11.2019 15:07

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


  1. LlinelL
    19.11.2019 12:07

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


    1. y_durov Автор
      19.11.2019 12:07

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


  1. bano-notit
    20.11.2019 01:58

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