История о том, как парсер превратился в полноценного МРКО бота для Телеграм

Приветствую, Хабровчане! Недавно я писал статью про то, как написать парсер дневника МРКО, а в конце пообещал написать про интеграцию с Телеграм ботом, о чем очень жалею. Сейчас бот уже готов и полностью функционирует. Хочу рассказать вам, что использовал и с какими трудностями столкнулся в этой работе.


Python и Телеграм

Для создания моего бота (@mrkorobot), я решил использовать библиотеку pyTelegramBotAPI. Она проста в установке, удобна в использовании и для нее даже написали хорошую книгу. В боте я использую следующие библиотеки:


  • Tornado для вебхука
  • Requests для работы с вебом
  • BeautifulSoup для извлечения данных из дневника
  • Redis для работы с БД Redis
  • pyTelegramBotAPI для взаимодействия с Телеграмом
  • crontab для ежедневных уведомлений

Для доступа к дневнику нужны логин и пароль. Первым делом нужно запросить их у пользователя и положить в базу данных. Раз логин и пароль нужны каждый раз, как пользователь обращается к боту, надо было выбрать быструю БД. Мой выбор пал на Redis, а для работы с ней в Питоне было решено использовать одноименную библиотеку. Предварительно зашифровав пароль в md5 с помощью встроенной в Питон библиотеки hashlib, я положил их в БД под ключ, имя которого просто id пользователя в Телеграме. Вот наглядное представление:


{
  "id_пользователя": ["логин", "пароль_в_MD5"]
}

При использовании такой схемы, можно сразу проверить, если ячейка с таким id есть, значит пользователь авторизован, если нет — нет.


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


Ежедневные уведомления

В принципе, на данный момент реализация просмотра домашнего задания заканчивается, но мне захотелось пойти еще дальше и сделать ежедневные уведомления об оценках. Подумав, мне удалось написать простенький скрипт, который я добавил в cron, сгенерировав выражение здесь. Логика до боли проста: сначала добываем список всех авторизованных пользователей (предоставивших боту логин и пароль) и проверяем, если пользователь включил ежедневные уведомления, если да — отправляем оценки в таком формате:


Дневник.Бот


Никогда еще проверка дневника не была такой легкой!


Личные сообщения

Еще мне захотелось реализовать функцию просмотра личных сообщений. «Почему бы и нет?» — подумал я и написал метод, позволяющий просматривать входящие сообщения. Ничего сложного, на удивление, здесь не было. Просто обращаться надо было не к mrko.mos.ru/dnevnik/services/dnevnik.php? r=1&first=1, а к mrko.mos.ru/dnevnik/services/mail.php? r=0. Потом привычный парсинг и вот все готово:


Дневник.Бот


Дневник.Бот


Кстати, с хостингом были проблемы: с сервера на Google Cloud Platform был недоступен по непонятной мне причине домен mrko.mos.ru, поэтому пришлось на время разместить бота у товарища.


Для меня очень важно, чтобы вы попробовали Дневник.Бота
(@mrkorobot) в работе и дали свои соображения. Все идеи рассматриваются очень внимательно. Счастливого программирования!

Комментарии (4)

  • 15 апреля 2017 в 22:54

    0

    Окей, сразу накидаю проблем, которые появляются передо мной:


    1. Я не знаю пароля. То есть, бумажка, с логином-паролем была у меня в руках 2 года назад, после этого она конечно же потерялась. Единственное, что я могу получить из формы на сайте пгу: логин в чистом виде и пароль в хешированном.
    2. У меня несколько детей. А такое реально есть, когда на один и тот же аккаунт pgu прикреплено несколько детей.
    • 16 апреля 2017 в 16:16

      0

      Спасибо, что написали! На первую проблему повлиять никак не могу, т.к. Дневник.Бот пока не умеет угадывать пароли:) А если несколько детей, то да, пока такого функционала нет, но очень скоро планирую начать его разрабатывать.
  • 16 апреля 2017 в 16:13

    0

    Попробовал.
    Понравилась и идея и реализация.
    Заходить через браузер каждый раз для проверки оценок ребенка — нудно и долго. Тут все под рукой, причем с автоматическим приходом оповещений о двойках/пятерках перед приходом с работы — позволяет понять как у школьника идут дела в школе. Ну и его мотивирует получать хорошие оценки, зная что они постоянно контролируются.

    В целом, концепция использования Телеграм как единой платформы для всего (чатов поддержки, контроля серверов, перевода/обмена денег, доступа к самым различным сервисам) — очень интересна.
    Дуров с коллегами последовательно идет в этом направлении. Теперь нужны усилия со стороны разработчиков, чтобы добавитьв эту платформу больше полезных сервисов. И электронный дневник — один из них.
    Попробую его использовать на следующей неделе.
    Надеюсь на поддержку и развитие проекта!

    • 16 апреля 2017 в 16:18

      0

      Спасибо, очень приятно такое слышать:) Надеюсь в будущем мой бот будет еще больше радовать Вас новыми возможностями.

© Habrahabr.ru