Как выложить телеграмм бота на сервер heroku
Перейти к содержимому

Как выложить телеграмм бота на сервер heroku

  • автор:

Пишем Telegram бота на Python + хостинг на Heroku

Приветствую вас, программисты! Сегодня я расскажу вам о том, как написать бота в Telegram с нуля и запустить его на бесплатной платформе по хостингу Heroku.

На просторах интернета похожих статей я не видел, поэтому, то, что вы прочитаете в этой статье будет являться уникальным контентом.

Что мы будем использовать?

  • Библиотеку python-telegram-bot(ссылка на GitHub репозиторий) с помощью которой мы сможем использовать Telegram Bot API
  • Visual Studio Code(VS Code) в качестве текстового редактора, где мы будем писать код
  • Для хостинга сервис — heroku.com. Вам нужно будет создать там учётную запись
  • Интерпретатор Python, который вы можете скачать здесь
  • Аккаунт в Telegram, для того, чтобы создать бота и тестировать его

ОЧЕНЬ ВАЖНО! В этом туториале я использую операционную систему Windows, поэтому некоторые моменты могут отличаться, в зависимости от вашей ОС.

Что будет делать бот?

Бот, которого мы будем писать будет помогать пользователям с изучением академических слов из теста SAT. Он будет иметь две функции:

  • Отправлять случайные слова из списка из 262 академических слов
  • Отправлять вопросы и варианты ответа для того, чтобы пользователь смог проверить своё знание академических слов

Этот бот будет полезен подписчикам моего телеграм канала @satprepare.

Этап 1. Подготовка к написанию бота

Для начала нам необходимо создать директорию(папку) с нашим проектом. В моём случае она называется SATVocabularyBot и находится на рабочем столе. Поэтому её расположение следующее: C:\Users\HP\Desktop\SATVocabularyBot

Далее заходим в эту папку в Visual Studio Code через File — Open Folder. После этого давайте сразу создадим Python файл с расширением .py в нашем проекте и назовём его main.py. Он у меня уже есть, но выглядеть это будет примерно так:

На этом же скриншоте под окном вы можете увидеть открытый терминал. Вам нужно тоже его открыть через View — Terminal. Далее, через этот терминал вам необходимо установить библиотеку python-telegram-bot. Сделать это можно написав:

Это будет выглядеть так:

И заметьте, что я использую тот интерпретатор Python, который установил сам, а не тот который предлагает VS Code. Это помогло мне избежать кучу ошибок при установке библиотеки.

Лучше использовать Python версии 3.7.0 и выше!

После того, как вы нажмёте Enter, у вас установится библиотека и мы сможем начать писать код.

Но, как писать бота, которого у нас нет?

Этап 2. Создание бота

Теперь нам необходимо создать самого бота в Telegram. Поэтому заходим в Telegram и открываем переписку с "ботом для создания ботов" — @BotFather.

На скриншоте я скрыл от вас TOKEN бота, так как имея доступ к нему можно делать с ботом всё, что угодно. Поэтому и вы никому не показывайте токен своего бота, пока что просто скопируйте его.

Теперь у нас есть бот и можно начать его программировать. Кстати, в этом туториале я не буду показывать, как поставить аватарку или приветственный текст для вашего бота, так как вы можете сделать это сами с помощью команды Edit Bot у @BotFather.

Этап 3. Написание бота

На этом этапе мы уже начнём писать самого бота, то есть его функционал.

В файле main.py пишем следующее:

Давайте разберёмся с тем, что это значит.

В самом начале мы импортируем различные библиотеки:

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

Далее, мы создаём логгер, который будет выводить ошибки в терминале.

После этого мы создаём метод main, который будет всё время вызываться первым благодаря этим строчкам кода, которые мы записали в конце предыдущего блока кода:

Коротко об объектах и обработчиках

В самом же методе main мы создаём объекты:

  • updater — с его помощью мы соединимся нашим ботом в телеграме, поэтому в одинарные кавычки вам нужно скопировать и вставить токен вашего бота.
  • dispatcher — все обновления будут идти через него, то есть он будет отвечать за обновления в непосредственно самом Telegram, текстовые команды и обработчики событий(handlers).
  • conv_handler — является объектом Conversation Handler, который является сложным обработчиком событий. Он включает в себя 4 разных коллекций обработчиков событий: список entry_points, словарь states, список fallbacks и список timed_out_behavior. В нашем боте мы будем использовать только первые три.

Если говорить подробнее о коллекциях обработчиков, то можно сказать, что entry_points используется для того, чтобы начать переписку с ботом. Поэтому мы вносим в неё CommandHandler — обработчик команд на команду ‘start‘. Таким образом, когда пользователь напишет ‘/start‘ боту, у нас вызовется метод start, который мы напишем чуть позже.

States может содержать несколько обработчиков событий, которые отвечают за различные состояния переписки. Например, в нашем случае мы имеем два состояния: ACTION и ANSWER. Первое отвечает за то, какое действие выберет пользователь, а второе за то, какой ответ напишет пользователь при выполнении теста. RegexHandler в первом состоянии обрабатывает строки ‘Learn new words’ или ‘Check yourself’ и далее передаёт один из них в метод action. MessageHandler во втором состоянии обрабатывает любой текст, поэтому мы написали Filters.text, но он также может обрабатывать и другие типы сообщений. В конце статьи я дам ссылку на документацию, где всё это есть.

Поэтому за пределами метода main(можно после создания логгера)пишем следующие строки кода:

Fallbacks используется для того, чтобы выйти из текущего состояния, поэтому при нажатии на ‘/cancel‘ пользователь сможет выйти на предыдущее состояние.

Далее, через эти строки мы добавляем обработчик событий conv_handler и error_handler, отвечающий за ошибки в dispatcher:

Следующие строки кода начинают принимать обновления с нашего Telegram бота:

Но я не совсем уверен в последнем (просто увидел, как это используется в примерах в официальном репозитории библиотеки)

Polling и Webhooks

Небольшое отступление от темы:

Продолжаем писать нашего бота.

Метод start

В первую очередь напишем метод (функцию) start, который, как я и говорил будет вызываться командой ‘/start‘:

Здесь мы используем time, поэтому не забудьте импортировать библиотеку time в самом начале:

bot.send_chat_action — предназначен для того, чтобы бот показывал действие, как здесь:

time.sleep(1) — для того, чтобы он делал это на протяжении 1 секунды. Без этого вы не увидите этой надписи на скриншоте.

Далее, мы создаём кастомную клавиатуру (custom_keyboard), состоящую из двух кнопок на выбор.

reply_markup — это разметка, которая будет отправляться в ответ на сообщение пользователя. В неё мы добавляем нашу кастомную клавиатуру.

one_time_keyboard = False — означает то, что клавиатура не исчезнет после того, как пользователь отправит сообщение.

bot.send_message — для того, чтобы бот отправил соответствующее сообщение пользователю в чат. В нашем случае принимает параметры (может принимать больше):

  • chat_id — уникальный идентификатор чата в формате @username
  • text — определённый текст в одинарных кавычках
  • reply_markup — разметка, которую должен отправить бот, то есть клавиатуру

Последняя строка в методе отправляет состояние ACTION, которое далее перехватывает RegexHandler, о котором говорилось раньше.

Кстати, не забудьте добавить этот метод в код, так как возможно без него у вас не будет работать bot.send_action (взял этот код в Wiki Pages репозитория, поэтому понятия не имею, что он делает):

Поэтому нужно еще импортировать следующее:

Файл dictionaries.py

Перед тем, как начать писать метод action необходимо создать 3 списка, которые будут источником информации для бота. Нужно создать список слов, описаний слов и типов слов, то есть words, description и type.

Я решил занести эти списки в новый файл dictionaries.py, чтобы эти данные не мешали в нашем главном файле. По скриншоту ниже вы поймёте почему��:

Говнокод? Возможно. Просто мне лень париться насчёт различных баз данных для хранения всей информации.

Не забудьте написать это, чтобы мы смогли пользоваться этими списками в файле main.py:

Методы action и learn

Следующий шаг — это написание метода action, который вызывается RegexHandler-ом. Вот как он будет выглядеть:

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

Здесь всё понятно — создаётся рандомное число и бот отправляет всю информацию из списка по индексу этого числа о нём в виде одного сообщения.

Рандом? Нужно импортировать следующее:

parse_mode — нужен для того, чтобы бот превратил нужные слова в кавычках в bold или italic. Для этого используется Markdown mode.

Возвращаемся к методу action.

Здесь также создаётся случайное число через метод generate_correct_answer:

Также в этом методе будет использоваться глобальная переменная correct_word, поэтому добавьте её вне всех методов:

Для доступа к ней вне метода action я написал метод get_correct_word:

Далее в методе action мы создаём три неправильных случайных ответа и распределяем все ответы тоже в случайном порядке. Думаю здесь не нужно объяснений — всё и так предельно ясно.

Ну и в конце метода возвращается состояние ANSWER, которое перехватывается MessageHandler-ом, после чего вызывается метод answer_check.

Метод answer_check

Этот метод будет отвечать за то, чтобы проверять ответы введённые пользователем. Он выглядит так:

Здесь есть два условия: если ответ правильный и если нет. В соответствии с этим будут отображаться соответствующие сообщения от бота.

В конце оба условия возвращают состояние ACTION, чтобы продолжить диалог с пользователем.

Еще есть два метода cancel и error, которые вызываются из метода main и играют незначительную часть нашего кода (комментировать их не буду):

Итак, мы написали нашего бота но он работает только тогда, когда мы нажимаем на кнопку run. Но как сделать так, чтобы он работал постоянно?

Часть 4. Хостинг бота

Надеюсь вы уже создали аккаунт в Heroku. Всё, что вам требуется сейчас сделать это войти в свой аккаунт и увидеть этот экран:

Не обращайте внимание на мои проекты, вместо них у вас ничего не будет.

Далее, вам необходимо скачать Heroku Command Line Interface (CLI) по этой ссылке и Git по этой ссылке.

После того, как вы всё установили, перейдите в терминал в VS Code. Напишите туда следующее:

Нажмите на любую кнопку (кроме q) и вас перекинет в браузер, где вам нужно нажать на кнопку Log in:

Далее можно вернуться обратно в VS Code. Перед тем, как загрузить нашего бота на Heroku, нам следует добавить еще два файла: requirements.txt и Procfile. Заметьте, что у Procfile нет никакого расширения.

В Procfile напишем эту строку:

Это означает, что тип нашего dyno (так называется что-то на подобии сервера в Heroku) — worker будет работать с файлом main.py. Он будет работать всегда и без передышки. Web dyno будет иногда выключаться, но нам этого не надо.

В файл requirements.txt пишет эти строки:

Это различные требования для работы нашего бота на Heroku. Возможно некоторые из них вовсе не нужны, попробуйте проверить :D.

Теперь у нас всё готово для загрузки бота на Heroku!

Возвращаемся в терминал, где мы залогинились на Heroku, помните? Пишем туда:

После этого у нас создаётся проект на Heroku. Зайдите на сайт и посмотрите его имя. Например, у меня создался проект и он называется agile-refuge-53805.

Далее, в терминале следует написать:

Потом делаете свой первый коммит:

И затем делаете деплой своего кода на Heroku:

Вам нужно будет подождать немного (обычно от 1 до 3 минут) и потом написать следующее в терминал, чтобы запустить вашего worker dyno:

Готово! Проверьте своего бота — теперь он должен работать постоянно.

Кстати, Heroku не полностью бесплатный сервис, поэтому иногда они будут присылать вам сообщения о том, что ваши dyno перестанут работать надо заплатить. Я обычно игнорю такие сообщения, а боты работают как ни в чем не бывало 🙂

Я надеюсь вам понравился мой туториал и вы написали своего бота в Telegram! Если вам понравилась статья, то не поленитесь поставить лайк или написать мне "Спасибо!". Это будет мотивировать меня писать для вас статьи!

Деплой бота на сервере Heroku

Может кто—нибудь дать инструкцию, как развернуть бота на сервере heroku (написанном на python )? Спасибо заранее.

user avatar

  • Первым делом создайте Git репозиторий в папке с ботом: git init
  • Войдите в аккаунт Heroku : heroku login
  • Создайте приложение: heroku create appname —region eu

Создайте файл Procfile с содержимым: bot: python main.py

  • Если бот на веб-хуках, замените bot на web . Но на бесплатном тарифе, бот будет засыпать каждые 30 минут если не будет подключений, по этому на Heroku free лучше держать ботов на лонг-поллинге. Но проблема с засыпанием веб приложения решается с помощью http://kaffeine.herokuapp.com/.

Теперь нужно упаковать все зависимости проекта: pip freeze > requirements.txt

  • Теперь наша папка выглядит приблизительно так: Procfile main.py requirements.txt

Коммитим изменения: git add . затем git commit -m ‘commit’

Пушим на Heroku : git push heroku master

Запускаем бота: heroku ps:scale bot=1

Смотрим логи: heroku logs -t

user avatar

В папке с проектом должны быть такие 3 файла:

Proc

requirements.txt

+ другие модули (сгенерировать этот файл можно так: pip freeze > requirements.txt )

runtime.txt

или другая версия python

Из папки, где находится проект, запускаете такие команды:

Дополнительно рекомендую установить токен как переменную: heroku config:set TOKEN=7593654323:AAlkjHjhDZiWUD7Th4Dl_uPlkjpdorpoHGhgdsPVjQ (также можно установить переменные и на сайте Хероку) и обращаться к ней из программы

Создаем телеграм-бот с вебхуками на Heroku

Поделюсь своим опытом разработки телеграм-бота для большого количества пользователей: разберу свои ошибки и шаги для их решения.

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

Начнём с создания эхо бота на aiogram, тут нет ничего сложного, возьмём пример из документации:

Однако преимущество aiogram над python-telegram-bot и pyTelegramBotAPI в том, что он асинхронный, а значит, может обрабатывать несколько запросов почти единовременно. Стандартная база данных sqlite отлично подходит для несложных проектов и уже входит в стандартную библиотеку питона, поэтому для начала я решил использовать её.

Через несколько часов работы приложение было написано, и мы с коллегами решили протестировать на себе его работоспособность. Бот запускался с использование технологии long polling, и запускался он на локальном компьютере. Для небольшого количества человек этого вполне достаточно: 3-4 человека в секунду бот выдерживает без особых проблем.

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

Решением этой проблемы стал переход на вебхуки. И для обеспечения бесперебойной работы разместим его на удалённом сервере. Отличным решением для этого является heroku: здесь можно управлять запуском приложения как с компьютера, так и с мобильного приложения, отслеживать логи и, что является наиболее важным для нас, настраивать вебхуки.

Алгоритм для реализации эхо бота в данном случае занимает больше времени, но он достаточно прост:

Как разместить Telegram-бота на сервере?

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

Я разбил статью на 5 глав. Как я сказал ранее, статья будет короткой. И с помощью этой навигации будет проще ориентироваться по требуемой информации.

Создание бота

Статью о том, как написать своего Telegram-бота на NodeJS я уже писал. Думаю я объяснил там всё достаточно понятно. Изучить её, если у вас еще нету бота и вы хотите его разработать на NodeJS. Если вы написали своего бота не на JavaScript, то можете пропускать эту часть и приступать ко второй главе.

Размещение бота на Heroku

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

Особой разницы в размещении бота на Heroku или на отдельном сервере нету. Тут всё достаточно просто.

  1. Зарегистрируйтесь на сайте Heroku

  1. Войдите в свой аккаунт и создайте первый проект, нажав на \"Create new app\".

Придумайте название своему проекту. Название должно быть уникальным. Выбор региона не принципиален.

После создания проекта, вам будет предложены варианты деплоя (размещения) вашего проекта на Heroku.

Тут есть несколько вариантов. Я опишу только первые два.

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

Я буду пользоваться первым вариантом.

Следуя простой инструкции, указанной в разделе \"Deploy\", можно загрузить свой проект на сервер Heroku.

  1. Скачайте Heroku CLI для работы с Herokue сервером.
  2. Войдите в аккаунт Heroku через CLI.

  1. Зайдите в папку вашего проекта через консоль (терминал).
  1. И выполните эти две команды по очереди. (Если вы уже инициализировали Git, то первую команду выполнять не надо).

Первая — инициализирует Git в вашей папке. Вторая — установит ссылку на репозиторий Heroku, для деплоя (размещения) вашего проекта на сервере.

Когда внесли все правки и убедились, что всё должно работать нормально, создайте в папке с вашим проектом — Procfile. Без расширения, просто — Procfile.

Внутри этого файла, вам нужно указать команду, которая будет выполняться при запуске вашего проекта на Heroku. То есть, Heroku должен знать, что ему нужно запускать. В файле Procfile указана соответствующая команда, которая запустит бота.

В моем случае, это npm start . Так как у меня код написан на ES6, мне нужно конвертировать ES6 в ES5 с помощью Babel. И только после этого, у меня запускается команда запуска бота, типа: node index.js .

Запуск бота на сервере Heroku

Почти готово. Вам осталось теперь просто запушить вашего бота на сервер Heroku и запустить бота.

Если вам лень каждый раз вбивать эти команды, пропишите в package.json в scripts, следующую команду:

Если же бот не запустился после пуша, выполните последнюю команду для запуска бота на Heroku и готово!

Размещение бота на своём сервере

Тут тоже достаточно всё просто. Если вы не хотите публиковать своего бота на GitHub\'e, вы можете использовать BitBucket.

Регестрируемся. Создаем репозиторий, нажав на плюсик слева.

Называем репозиторий как хотим, тут всё так же, как и на GitHub.

После чего, заходим так же в свой проект с ботом. И добавляем в Git, ссылку на этот репозиторий.

У вас должна быть другая ссылка на репозиторий. Кликните на \"I have an existing project\" и ниже указана команда с вашим репозиторием.

Пушим всё на BitBucket репозиторий. На своём сервере клонируем репозиторий с BitBucket и любые изменения просто скачиваем командой:

Запуск бота на своём сервере

После того как вы склонировали репозиторий и установили все зависимости на вашем сервере, вам остается запустить бота в фоновом режиме — Запуск Node.js в фоновом режиме.

Или же есть еще два варианта запуск бота:

    — следит за любыми изменениями в файле и перезапускает бота (скрипт). — более сложный, но грамотный вариант для запуска бота. При правильной настройке Docker-контейнера, можно поставить автоматически запуск при фейле бота.

Если у вас бот не запустился, проверьте логи, командой heroku logs .

Если вы рассчитываете на халяву от Heroku и ожидаете, что ваш бот будет хоститься на их сервере, то мне придётся вас огорчить. Ваш бот будет работать 30 секунд, после чего отключается. Переодично включается, когда как. В общем, Heroku подходит для теста бота в «боевом режиме».

Это уже 6 или 7 статья по разработке телеграм ботов. Думаю, мой блог скоро превратится в \"блог о программировании телеграм ботов\". Что самое странное, я написал больше 55 статей про разные темы, но 90% запросов из поисковых систем, связаны с телеграм ботами. Тем не менее приложу к этой статье несколько своих статей по Telegram.

Добавить комментарий

Ваш адрес email не будет опубликован.