Telegram-bot: моя история. Часть первая


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

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

UPD: проект успешно прошел рефакторинг с помощью авторского фреймворка для расписаний занятий университетов — «Rutetider» (статья на Хабрахабре, GitHub). Поэтому некоторые моменты в этой статье могут не совпадать, часть когда может отсутвовать или выглядеть по-другому, но концепция сохранена.

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

Заранее скажу, что языком программирования является Python, что, впрочем, не важно по причине общедоступности и кросс-платформенности как необходимых в этой статье ресурсов, так и большинства прочих, возможных для использования в других проектах. А также упущены легкодоступные пояснения, например, объяснение работы подключаемого модуля (библиотеки), регистрация токена бота-Телеграм или любой другой очевидный момент, расположенный прямиком в гугле по первой ссылке.

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

  • pyTelegramBotAPI — основная библиотека для взаимодействия с API Telegram.
  • Heroku Cloud Application Platform — поддержка внушительного ряда языков, большая и легкая (местами заставляющая монитор лить воду) документация с обучающими инструкциями для новичков, наличие удобного интерфейса для полной работы с приложением, включая доступ через консоль, наличие баз данных. Важным фактором является возможность «крутиться» на сервере круглосуточно.
  • Github — работа с развертыванием приложения на сервере проходит с системой контроля версий Git. Приятный бонус — это без времязатрат совмещать со своим репозиторием.
  • PostgreSQL — базы данных SQL, сказать и нечего.

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

О проекте в целом


Я не всегда имел возможность посмотреть какие предметы необходимо сегодня посетить и в каких именно аудиториях располагаются мои одногруппники. Единственными альтернативами на данный момент является вход на не адаптивный сайт университета от слова «совсем» и посещение паблика в социальных сетях, что абсолютно не устраивает лично меня как пользователя.

Решено — «нутакие» знания одно языка, ноль реального опыта программирования проектов, и еще хуже — отсутствие опыта разработки, я принялся подготавливать дальнейший путь приложения. Мне повезло с бизнес-планом, он находился на сайте расписания, все что мне нужно было или нужно сейчас реализовать — уже реализовано другими, осталось только украсть и немного додумать.


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

1) Сделать возможность в несколько нажатий получить расписание на сегодняшний и завтрашний день — начиная с кнопки «Получить расписание» и заканчивая выбором дня («На сегодня» или «На завтра»), пользователю необходимо выбрать свой факультет, курс и группу.

  • Почему нельзя сделать расписание на всю неделю? Потому что хочу, чтобы моим ботом пользовалось более, чем тридцать человек в сутки (большинство хороших обновлений, которые я никогда не выпущу, плохо влияют на онлайн).

  • Почему нужно жать так много кнопок, нельзя сократить или просто написать свою группу один раз? Я знаю, что удобнее нажать на экран мобильного телефона три раза, чем написать свою группу четко и правильно (от двух букв, двух цифр и дефиса и больше), вызвав экранную клавиатуру, к тому же финальным меню можно воспользоваться и на следующий день.

2) Стикер с временными интервалами пар — стикер это весело, стикер это прикольно, а еще ими можно обмениваться, поэтому на них жмут от трети пользователей каждый день, хотя большой необходимости нет (история чата сохраняется, листать вверх не сложно). На данный момент стикер можно усовершенствовать, добавив в него время перерывов.

3) Функция расписания по подписке — я заведомо, до самой первой строчки кода, знал, что необходимо ввести что-то, что позволит получить расписание в один клик. Необходимость пройти все этапы, в которых указывается все тот же факультет, курс и группа, остались, но делать это постоянно — нет. В конечном меню есть кнопка «Подписаться на эту группу», с помощью которой пользователь, не делая «лишних движений», получает расписание на два дня за один раз.

4) Обратная связь и обновления — это минорные, но очень важные функции, если в первом варианте необходимо иметь возможность услышать своих пользователей (от просьб ввести что-то новое и репортов на баги до похвалы и благодарности), то во втором — научиться сообщать своему коммьюнити о проблемах на сервере, новых релизах и другую важную информацию.

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

6) Сбор статистики — статистика по каждому пользователю и его действиям. В итоге получаем информацию, когда стоит вводить обновления, которые нужно протестировать нагрузочно, а когда «под шумок». На основе данных также можно обозначить рамки релевантности той или иной области.

7) Вся работа должна быть автоматизирована — встроенный CRON в виде подключаемой библиотеке на сервере — это обычный планировщик, выполняющий задачи в заданный период времени.

  • Ежедневное обновление дат — сразу после полуночи доступны обновленные даты расписания на текущий и завтрашний день.
  • Еженедельное обновления расписания — по определенным ресурсным причинам на сервисе отсутствует возможность обновлять его каждый день, поэтому пользователи могут рассчитывать на обновление пар раз в неделю (с 04.12 расписание обновляется ежедневно).

Аспекты развертывания приложения


Здесь я опишу неочевидные инструкции по развертыванию на Heroku Cloud Platform, включая технический код в виде подключения к серверу, внедрения баз данных и оформления приложения. Перед прочтением желательно ознакомиться с обучающими инструкциями для новичков, «пощупать» уже готовый предложенный в нем проект и интерфейс сервиса.

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

Заставляем облачный сервис, на котором уже создан наш проект, увидеть главный скрипт:

import telebot
import os
from flask import Flask, request

bot = telebot.TeleBot(токен вашего бота)
server = Flask(__name__)


@bot.message_handler(commands=['start'])
def start(message):
    bot.reply_to(message, 'Hello, ' + message.from_user.first_name)

@bot.message_handler(func=lambda message: True, content_types=['text'])
def echo_message(message):
    bot.reply_to(message, message.text)


@server.route("/токен бота", methods=['POST'])
def getMessage():
    bot.process_new_updates([telebot.types.Update.de_json(request.stream.read().decode("utf-8"))])
    return "!", 200

@server.route("/")
def webhook():
    bot.remove_webhook()
    bot.set_webhook(url="https://ссылка на приложение/токен вашего бота")
    return "!", 200

server.run(host="0.0.0.0", port=os.environ.get('PORT', 5000))

Все необходимое для подключения доступно в Database Credentials на странице баз данных (имя пользователя, пароль, хост, порт и собственно само название базы данных). Все помещается в маленький скрипт с использованием удобных модулей для разработки:

import dj_database_url
import psycopg2

DATABASELINK = "postgres://username:password@host:port/database"


db_info = dj_database_url.config(default=DATABASELINK)
connection = psycopg2.connect(database=db_info.get('NAME'),
		    		user=db_info.get('USER'),
		    		password=db_info.get('PASSWORD'),
		    		host=db_info.get('HOST'),
		    		port=db_info.get('PORT'))
cursor = connection.cursor()

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

Подробнее
Реклама
Комментарии 11
  • 0
    Кажется что-то сломалось.
    • 0
      Я кажется догадался где баг. Когда подписываешь на определенное расписание и потом пробуешь при помощи кнопки вернуться назад попасть опять на главное меню.
  • 0
    Боюсь, что когда формат публикации расписаний изменится, то бот не сможет рассказать его и выдать правильно. В таких системах единственнй минус в том, что нет какого-то стандартного источника данных и приходится подстраиваться.

    Но за энтузиазм ставлю плюс :)
    Кстати, а какое направление у вас? Надеюсь, не гуманитарий :)? А то жалко, когда таланты теряются не в своей среде.
    • +1
      Других решений по вопросу парсинга расписания на данный момент нет, и, в любом случае, если поменяется html-разметка сайта, касающаяся непосредственно самой таблицы с информацией — придется переписывать.

      Учусь на третьем курсе по специальности «Программная инженерия». Спасибо! :)
    • +1
      О! Единомышленник =)
      Сделал 3(2?) года назад бота в GAE на Go для своей универской группы и кинул бота в общую группу Телеграмм. Никому не нужно было, но это только они изначально так считали, так как после смены расписания полились просьбы обновить базу.
      • 0
        Не оцениваю статью, просто интересно. Множество статей про разработку telegram ботов на хабре. Кто-нибудь реально часто пользуется ими? Несколько раз пробовал, не впечатлило пока. В чем соль их использования?
        • 0
          Часто, думаю, никто, но разработчик с определенными планами, исчерпав свое видение продукта, обязательно должен ознакомиться с альтернативными мнениями как в технической части, так и в «пяти метрах от кода».

          В любом случае, мне интересно пополнить Хабрахабр своей статьей, потренироваться писать текст и выражать мысли.
          • 0

            Я ими часто пользуюсь. Постараюсь совсем кратко:


            1) Инлайн-режим – то, какими и должны быть боты. Не собеседниками, а инструментами, которые помогают людям общаться друг с другом. Грубо говоря, вместо того, чтобы переключаться на YouTube и скинуть ссылку на видеоролик, находишь через инлайн-бота и кидаешь. Расположение кафе — через инлайн. Нужное изображение? Через инлайн. Короче, чтобы не переключаться между кучей приложений, всё сразу под рукой, причём в удобном виде.
            Я себе сделал генератор человекочитаемых паролей (XKCD-style), ибо лезть в KeePass муторно, запоминать веб-сайты для этого лень, а телега почти всегда открыта и висит в трее.


            2) Много различных Telegram-specific ботов, например, для оформления постов в каналы, просмотр статистики, просто какие-нибудь залипалки типа своего баш-бота.

          • +1
            За саму статью определённо можно поставить "+". На счёт того, что много статей про Телеграмм-боты на Хабре; Их делают и этой действительно интересно, как минимум ознакомиться с практикой. Ботов для Телеграмма большое кол-во и оно растёт. Боты развивают и дорабатывают, рано или поздно кто-то сделает их незаменимыми в Телеграмме (Возможно).
            • 0

              Мда, а мою статью про прокси-ботов удалили в своё время :(

            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.