[Из песочницы] Telegram-bot: моя история. Часть первая

96adcfa8724345a6ba3e601d216628e5.png

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

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

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

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

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

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

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

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

89bc7cb6c27347bdaf8f3ebad8dc670c.png

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

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

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

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

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

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

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

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

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

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

Аспекты развертывания приложения
Здесь я опишу неочевидные инструкции по развертыванию на 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()

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

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

© Habrahabr.ru