Приветствую, Хабровчане! Недавно я писал статью про то, как написать парсер дневника МРКО, а в конце пообещал написать про интеграцию с Телеграм ботом, о чем очень жалею. Сейчас бот уже готов и полностью функционирует. Хочу рассказать вам, что использовал и с какими трудностями столкнулся в этой работе.
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) в работе и дали свои соображения. Все идеи рассматриваются очень внимательно. Счастливого программирования!
Комментарии (15)
Alex-Stream
16.04.2017 16:13Попробовал.
Понравилась и идея и реализация.
Заходить через браузер каждый раз для проверки оценок ребенка — нудно и долго. Тут все под рукой, причем с автоматическим приходом оповещений о двойках/пятерках перед приходом с работы — позволяет понять как у школьника идут дела в школе. Ну и его мотивирует получать хорошие оценки, зная что они постоянно контролируются.
В целом, концепция использования Телеграм как единой платформы для всего (чатов поддержки, контроля серверов, перевода/обмена денег, доступа к самым различным сервисам) — очень интересна.
Дуров с коллегами последовательно идет в этом направлении. Теперь нужны усилия со стороны разработчиков, чтобы добавитьв эту платформу больше полезных сервисов. И электронный дневник — один из них.
Попробую его использовать на следующей неделе.
Надеюсь на поддержку и развитие проекта!MonsterAndrew
16.04.2017 16:18Спасибо, очень приятно такое слышать:) Надеюсь в будущем мой бот будет еще больше радовать Вас новыми возможностями.
borisovEvg
16.04.2017 18:48очень, очень нужный бот! было удобное приложение для андроида, но оно давно сломалось, а разработчик пропал. Теперь про бота. вбил логин/пароль, запросил расписание, в ответ радостное «сегодня выходной» -ок. запросил понедельник, в ответ получил «завтра понедельник» — все. чяднт?
MonsterAndrew
17.04.2017 16:11Здравствуйте! Сейчас действительно бот не может показывать расписание на след. неделю, т.к. при открытии ссылки на следующую неделю, по непонятной мне причине, отображается пустая страница. Надеюсь скоро удастся обойти это:)
tribesman
17.04.2017 09:17Придётся ставить телеграмм ) пользоваться смогу с 1 сентября по понятным причинам)
RazorBlade
17.04.2017 10:35У меня почему-то не принимает логин, после ввода логина ничего не происходит — бот просто молчит.
И кстати, напрямую войти через mrko.mos.ru я не могу, входит только через аутентификацию pgu.mos.ru, поэтому какой нужен логин, от mrko или pgu?MonsterAndrew
17.04.2017 16:08Здравствуйте! Логин и пароль нужен именно от mrko.mos.ru. Вы можете найти его в этой форме: http://prnt.sc/exfj86
bano-notit
Окей, сразу накидаю проблем, которые появляются передо мной:
MonsterAndrew
Спасибо, что написали! На первую проблему повлиять никак не могу, т.к. Дневник.Бот пока не умеет угадывать пароли:) А если несколько детей, то да, пока такого функционала нет, но очень скоро планирую начать его разрабатывать.
bano-notit
Для меня лично решение первой проблемы является такое: сразу в бд вбить хеш, который сказал пользователь. Я надеюсь, что вы не храните в бд пароли в чистом виде. Поэтому можно теоретиески сделать и некоторый обход этого предхеширования. Но тут сразу же появляется проблема того, что доступ будет иметь почти любой, кто в состоянии поменять
type
в html странице, или сидящий между клиентом и сервером пгу. Так что тут, как мне кажется, вопрос уже этический.MonsterAndrew
Конечно мы не храним пароли в открытом виде. Когда пришел пароль в чистом виде от пользователя он сразу же шифруется и заносится в БД уже в зашифрованном виде. А насчет решения: действительно, если пользователь пришел хэш — сразу занести в БД, а если чистый пароль — сначала зашифровать. Сейчас сяду делать:) Если можете, свяжитесь со мной по телеграму.
bano-notit
А вообще спасибо, что занялись этим. Я, как и писал уже, вроде, раньше сделал дополнение к хрому, которое тупо в один клик входило в электронный дневник и у меня были идеи сделать десктопное приложение с парсером, но Вы перешагнули и обогнали)
MonsterAndrew
Приятно, что кому-нибудь это интересно и главное нужно;) Но пока ботом пользуется 35 человек.
MonsterAndrew
Большинство просто пишут /start и забивают на бота, а эти 35 человек авторизовались.
bano-notit
К сожалению, я отношусь к тем, кто пока что только /start вбил, потому как свои проблемы я уже обнародовал.