Как залить telegram бота на heroku

от admin

Деплоймент бота на Heroku

Рано или поздно в разработке ботов вы столкнетесь с проблемой хостинга бота. Скорее всего, у вас нет своего собственного сервера, а платить за виртуальный не каждый хочет, да и настройка виртуального сервера может казаться чем-то непосильным для начинающих разработчиков. К счастью, есть много сервисов, предоставляющих хостинг приложений бесплатно. Одним из таких есть Heroku. Сегодня я расскажу, как легко и быстро развернуть простенького бота на данной платформе.

Почему именно Heroku? Она была одной из первых платформ, предоставляющих услуги типа PaaS (Platform as a Service) и есть лидером в этой сфере. Используя такие облачные сервисы, разработчик должен предоставить только приложение. Обо всем остальном – серверное железо, операционная система, интерпретатор языка и база данных, позаботится сервис.

PaaS

По умолчанию, Heroku предлагает до 5 приложений на аккаунт и дает 550 бесплатных дино-часов в месяц. Если же подключить к аккаунту банковскую карту, их к-во расширится до 1000. Подробнее о фри дино-часах можно почитать здесь.

Регистрация и установка клиента Heroku

Прежде всего, для использования Heroku, нужно авторизироваться. Если у вас нет аккаунта, создайте его, перейдя по этой ссылке. Затем нужно установить Heroku Toolbelt. Эта утилита на данный момент поддерживает основные ОС: Windows, macOS и Linux.

Скачать и установить Heroku CLI на Windows или macOS можно прямо отсюда. На Ubuntu/Debian платформах вам понадобится ввести данную комманду:

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

code

Если все работает, логинимся, используя данные, введенные при регистрации:

Создание приложения

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

code

Вывод команды показывает, что приложение было успешно создано и доступно на https://momentumbots.herokuapp.com .

code

Имя momentumbots уже занято мной, так что придумайте свое ��

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

code

Ставим Вебхуки

В прошлых частях мы писали ботов, использующих Long Polling. Суть его в том, что на сервера Телеграмма периодически приходят запросы на получение обновлений. Это ненадежно, т.к. сервера Telegram могут возвращать ошибку 504, вырубая бота. Используя же вебхуки, мы устанаваливаем URL, на который будут приходить обновления автоматически, таким образом избавляясь от этой проблемы. Вебхуки в тг работают только по HTTPS. Благо, Heroku предоставляет доступ к приложению через HTTPS и SSL-сертификат, освободжая нас от заботы о создании сертификатов.

В качестве веб-сервера будем использовать Flask, однако вам не составит труда разобраться с другими фреймворками. На Github-странице pyTelegramBotAPI, помимо Flask’а, есть примеры для aiohttp, CherryPy, CPython и Tornado.

AnshumanFauzdar/telegram-bot-heroku-deploy

If nothing happens, download GitHub Desktop and try again.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching Xcode

If nothing happens, download Xcode and try again.

Launching Visual Studio Code

Your codespace will open once ready.

There was a problem preparing your codespace, please try again.

Latest commit

Git stats

Files

Failed to load latest commit information.

README.md

Intial Deploy to heroku

Intially I was not able to push a simple bot to heroku, but yeah googling a lot made it work!

Very Initial Steps [NOOB Steps]

  1. Install Telegram 🙂
  2. Create a telegram bot by talking to Bot Father
  3. Install python in your computer, if you are on windows follow this
  4. Install git, follow this
  5. Install Heroku account here
  6. Install Heroku CLI from here
  7. Install editor of your choice, I preffer Atom

Step 0 [Optional]:

  • Just git clone this repository and start working by editing the code
  • Create your bot like we have bot.py and write any python code that is intially working on your local machine!
  • Make a folder like telegram-bot and put bot.py in the folder
  • Make a blank python file named
  • Make a Procfile this should be without any extension like .txt, you can go to view -> tick file name extensions and remove any extension
  • Now we have to make a requirements.txt through which heroku will install the dependencies to make our bot work!
  • What to add in requirements.txt
    • Mine looks like this:

    Add anything which you have included in the python code!

    • Change directory to where you have made these files
    • now in git bash CLI, intialize a git
    • Now install heroku CLI
    • Next

    At this point your bot should be running, you can check by

    If it is not running then we have to reset dynos:

    Now it should be running fine! Enjoy 🙂

    If you are trying to lazy which you should not! (Deploying to Heroku)

    Choose App name and deploy! Follow from Step 7 and edit bot.py with your token! And finally deploy!

    Want a video tutorial?

    • Check It Here!

    About

    Detailed guide to initially deploy a simple telegram python bot to heroku

    Пишем бота для Telegram и хостим его на heroku

    Всем привет. Наверняка, если вы умеете программировать, и пользуетесь телеграмом, вам приходила в голову мысль написать своего бота, к тому же мессенджер предоставляет свой API для ботов, с хорошей документацией, а туториалов по всему интернету накидано немало. Но даже если вы и написали бота, то возникает следующая проблема: хостинг. Для "легких" проектов отлично подходит heroku, но у новичков нередко случаются проблемы с заливкой своих проектов туда. Об этом и пойдет речь в этой статье.

    Для нашего бота я решил взять tgbots-module от @aNNiMON. Т.к. бесплатный аккаунт heroku позволяет создать лишь 5 приложений, то использовать одно приложение для запуска нескольких ботов — отличная идея. Но в данной статье мы рассмотрим лишь одно приложение. Создадим в Intellij IDEA новый gradle-проект. Создадим, согласно гайду на гитхабе (ссылка выше) классы ExampleBot и ExampleBotHandler. Заполним build.gradle:

    Проект к деплою на heroku готов, теперь — заливаем его на гитхаб (Я тоже залил, чтобы при возникновении сложностей вы смогли посмотреть, как надо было сделать), регистрируем в телеграме бота, а в хероку — регистрируемся и регистрируем новое приложение. Идем на вкладку Settings, жмем "reveal config vars" и заполняем переменные окружения:
    token — токен бота из телеграма
    username — ник бота без @
    GRADLE_TASK — в значение вписываем shadowJar . Это необходимо, чтобы heroku знало, как нужно собирать проект.
    Переходим на вкладку deploy и жмем connect to github. В поле repo name вводим имя нашего репо с ботом и жмем Search, далее выбираем нужное и жмем Connect. Обновляем страницу . В самом низу страницы появится кнопка Deploy Branch. Так же, вы можете включить автодеплой при каждом коммите (бесплатно). Ждем пока задеплоится, и переходим на вкладку Resources и обновляем страницу . Напротив команды запуска жмем карандашик, переключаем ползунок и жмем Confirm, а затем быстренько жмем More — view logs. И если все хорошо, идем в телеграм и пишем боту!

    Как я Telegram бота на Go писал. Часть третья. Публикация.

    В предыдущих частях был разработан и улучшен бот, помогающий найти заклинания для Dungeon and Dragons.

    Теперь требуется разместить бота на какой-либо платформе. Рассмотрим два варианта: vscale.ru и heroku.

    vscale.ru

    Плюсы

    1. Простота развёртывания для новичка
    2. Отдельный VDS со всеми преимуществами (устанавливай всё, что требуется)
    3. Удобная панель для управления
    4. Минимальный сервер — 200 рублей в месяц
    5. Реферальная программа (при регистрации по реферальной ссылке вам на счёт упадёт 400 рублей)
    6. Документация на русском

    Минусы

    1. Платный (от 200 рублей в месяц (на текущий момент))
    2. Отдельный VDS со всеми недостатками (самостоятельное администрирование)
    3. На сегодняшний день сервера доступны только в Москве и Санкт-Петербурге

    Развёртывание

    Надеюсь, проблем с регистрацией на vscale не возникнет и сразу перейду к главному — к публикации бота.

    Во-первых, требуется создать сервер (на vscale так же их называют «скалет»). Для бота более чем достаточно самой дешёвой конфигурации за 200 рублей: 512 Mb RAM, 20 Gb диск, 1 ядро и 1 Tb трафика. ОС — Ubuntu 16.04.

    Во-вторых. Надеюсь, код бота, который будет работать на этом сервере уже на github или bitbucket?

    В-третьих, необходимо настроить доступ к серверу. Можно воспользоваться инструкцией разработчиков vscale на habrahabr (см. шаг 5 и 6).

    В-четвёртых, подключаемся к серверу и настраиваем окружение. Так как бот написан на Go, то требуется установить его компилятор командой sudo apt-get install golang-stable , задать переменные среды GOPATH, GOROOT и добавить GOROOT в PATH. На habrahabr есть статья, подробно объясняющая как это сделать.

    Далее, в-пятых, клонируем репозиторий на сервер и компилируем.

    В-шестых, наконец-то, запускаем нашего бота командой ./dndspellsbot (ну или как он называется?). Чтобы бот не умирал при отключении от сервера, можно воспользоваться стандартной UNIX утилитой nohup: nohup ./dndspellsbot . На этом всё — можете обращаться к своему новому боту.

    heroku

    Плюсы

    1. Бота можно хостить бесплатно
    2. Если наловчиться, то можно довольно просто публиковать приложения
    3. Широкий выбор дополнительных возможностей (за деньги)

    Минусы

    1. Для бесплатного размещения требуется доработка бота
    2. Практически за всё дополнительное требуют деньги (в USD)
    3. В первый раз довольно сложно разобраться что к чему
    4. Документация на английском

    Развёртывание

    С heroku всё несколько сложнее. В первую очередь, как мне показалось, сервис предназначен для веб-проектов (веб-сайты, веб-приложения и всё такое). Бот — немного (на самом деле ощутимо) отличается от этого и поэтому потребуется немного его доработать. Об этом ниже.

    Создание приложения

    Расскажу про то, как сам публиковал бота (в картинках!). Но для начала не забудьте установить на ваш ПК Heroku CLI — пригодится в дальнейшем.

    Заходим на https://dashboard.heroku.com/ и создаем новое приложение:

    2016-10-20_21-34-53.png

    Задаём ему имя (по этому имени в будущем можно будет обращаться к нашему приложению в браузере) и регион:

    2016-10-20_21-36-37.png

    Для простоты продублировал репозиторий с bitbucket на github (с ним heroku работает «из коробки»). Привязал аккаунт на github к heroku и из списка доступных репозиториев выбрал бота:

    2016-10-20_21-38-13 (2).png

    2016-10-20_21-40-58.png

    2016-10-20_21-54-16.png

    2016-10-20_21-56-38 (2).png

    Теперь доступна возможность заdeployить бота на сервер при помощи соответствующего раздела:

    Однако, ничего не выйдет, т.к. во-первых, необходимо указать buildset и, во-вторых, добавить Godep для того, чтобы heroku знал, как собирать проект.

    С buildset всё просто: идём в настройки приложения и выбираем там тот, который нам подходит (heroku/go, конечно):

    2016-10-20_21-59-21.png

    2016-10-20_22-00-20.png

    Окей, с buildset разобрались, теперь надо понять, что за зверь такой Godep.

    Всё, что было написано в этом разделе можно так же провернуть в Heroku CLI. Однако, не так просто. Для дальнейших манипуляций потребуется воспользоваться этой самой CLI и для этого необходимо залогиниться в heroku командой heroku login , которая запросит логин и пароль от вашего аккаунта.

    Особенность Heroku #1

    Если вкратце, что Godep — это утилита для управления зависимостями (что-то типа npm, nuget, pip и вот это всё). В использовании довольно проста, но иногда выдаёт странные финты.

    Устанавливается как обычный пакет Go командой

    Теперь в консоли должна появится команда godep , которая позволит создать всё требуемое для heroku (в частности Godep.json). Если команда godep не работает, то найти эту утилиту можно в папке bin с установленным Go.

    После выполнения команды godep save в папке проекта будет создана новая директория Godeps с нужными для heroku файлами. Далее добавляем новый remote, указывающий на heroku, для нашего репозитория:

    и pushим все изменения в него: git push heroku master . При этом heroku автоматически попытается собрать проект и запустить его. Если всё сделано правильно, то теперь наш бот будет работать недолго, но счастливо и умрёт через непродолжительное время. Почему? На это есть две причины, про которые ниже.

    Особенность Heroku #2

    Как я понимаю, heroku предполагает, что ваше приложение — веб-сайт (веб-приложение) и пробует к нему подключиться по некоторому порту (из переменной окружения). При неудачной попытке подключиться приложение падает и больше не поднимается. Если взглянете на логи приложения в heroku (командой heroku logs ), то увидите там сообщения приблизительного следующего содержания:

    Это значит, что ваше приложение завершилось по таймауту. Чтобы отложить столь скорую смерть бота на чуть более длительный период, необходимо добавить возможность нашему боту как-то реагировать, если к нему стучаться через HTTP(S).

    Для этого в Go есть решение «из коробки» в пакете «net/http» :

    Код выше необходимо добавить в код бота перед циклом получения обновлений. Не сложно догадаться, что в случае, если к серверу, где живёт бот, будут стучаться по порту означенной в переменной окружения PORT , то бот ответит ему сообщением «Hi there! I’m DndSpellsBot!» . Это можно легко проверить добавив переменную окружения PORT и запустив бота локально. Если открыть браузер по адресу http://localhost:PORT , то браузер должен показать этот ответ.

    Итого: после добавления обработки запросов на указанный порт можно смело заpushить изменения на heroku и посмотреть, что из этого выйдет. А выйдет то, что приложение не будет завершаться так быстро, как в прошлый раз, но, к сожалению, всё равно, будет умирать. Почему? Это еще одна особенность heroku.

    Особенность Heroku #3

    Проблемы с умиранием процесса не было бы, если бы наше приложение было веб-сайтом, если бы мы занесли денег в heroku либо наш бот был написан немного по-другому.

    Затык в том, что бесплатное приложение должно не менее 8 часов в сутки «спать» и платформа «оптимизирует» это убивая его, если к нему никто не обращается по адресу, которое оно (наше приложение) получило. Так как наше приложение — бот, то никто и не должен обращаться к нему через браузер или как-то еще, кроме как через мессенджер. И для решения этого потребуется еще раз доработать бота.

    Если вы читали документацию telegram, то знаете, что получать сообщения можно либо через long pooling (как было реализовано в нашем боте ранее), либо через webhook. Так вот боты, работающие на платформе heroku, будут себя чувствовать гораздо лучше, если будут получать обновления через webhook. Займёмся этим.

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

    Далее требуется объяснить telegramу, что теперь следует общаться с ботом через webhook на определённом адресе. Для этого достаточно перейти в браузере по следующему адресу:

    Таким образом мы говорим, что если боту пришло сообщение, то необходимо отправить запрос на адрес https://ИМЯHEROKUПРИЛОЖЕНИЯ.herokuapp.com/ТОКЕН_БОТА.

    В общем, это, кажется, всё, что было необходимо, чтобы поднять бота на heroku. Осталось только лишь заpushить изменения на сервер heroku и проверить как наш бот работает. Если всё сделано правильно, то бот будет отвечать нам как и прежде.

    Читать:
    Как сделать канал в телеграмме с комментариями

Похожие статьи