Heroku Telegram bot как

В предыдущих частях был разработан и улучшен бот, помогающий найти заклинания для 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.

Самый Быстрый Способ Задеплоить Discord Python Бота На Heroku

Во-вторых. Надеюсь, код бота, который будет работать на этом сервере уже на 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 — пригодится в дальнейшем.

ДЕПЛОЙ БОТА ► Деплой Telegram Python бота на Heroku

Заходим на 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 командой

Еще по теме:  Не работает трансляция в Телеграмме

go get github.com/tools/godep

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

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

git remote add heroku https://git.heroku.com/dndspellsbot.git

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

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

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

2016-10-22T10:58:18.996167+00:00 heroku[web.1]: Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 60 seconds of launch 2016-10-22T10:58:18.996167+00:00 heroku[web.1]: Stopping process with SIGKILL 2016-10-22T10:58:19.116590+00:00 heroku[web.1]: State changed from starting to crashed 2016-10-22T10:58:19.110450+00:00 heroku[web.1]: Process exited with status 137

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

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

import ( . «net/http» . ) func MainHandler(resp http.ResponseWriter, _ *http.Request) < resp.Write([]byte(«Hi there! I’m DndSpellsBot!»)) >func main() < . http.HandleFunc(«/», MainHandler) go http.ListenAndServe(«:»+os.Getenv(«PORT»), nil) . >

Код выше необходимо добавить в код бота перед циклом получения обновлений. Не сложно догадаться, что в случае, если к серверу, где живёт бот, будут стучаться по порту означенной в переменной окружения PORT , то бот ответит ему сообщением «Hi there!

I’m DndSpellsBot!» . Это можно легко проверить добавив переменную окружения PORT и запустив бота локально. Если открыть браузер по адресу http://localhost:PORT , то браузер должен показать этот ответ.

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

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

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

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

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

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

// Для получения через long pooling. Сейчас нам это не нужно. // updates, err := bot.GetUpdatesChan(u) // Для получения через webhook updates := bot.ListenForWebhook(«/» + bot.Token)

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

https://api.telegram.org/botТОКЕН_БОТА/setWebhook?url=https://ИМЯ_HEROKU_ПРИЛОЖЕНИЯ.herokuapp.com/ТОКЕН_БОТА

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

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

Полный код бота можно найти bitbucket.

Источник: ashirobokov.wordpress.com

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

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

Еще по теме:  Источники просмотров в Телеграмме каналы что это такое

Отслеживать

5,668 3 3 золотых знака 21 21 серебряный знак 44 44 бронзовых знака

задан 22 окт 2018 в 8:00

518 1 1 золотой знак 6 6 серебряных знаков 17 17 бронзовых знаков

Официальную документацию читали? devcenter.heroku.com/articles/getting-started-with-python

22 окт 2018 в 8:17

3 ответа 3

Сортировка: Сброс на вариант по умолчанию

  • Первым делом создайте 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/.
  • Теперь наша папка выглядит приблизительно так: Procfile main.py requirements.txt

Отслеживать

ответ дан 22 окт 2018 в 8:14

Pavel Durmanov Pavel Durmanov

5,668 3 3 золотых знака 21 21 серебряный знак 44 44 бронзовых знака

22 окт 2018 в 8:50

22 окт 2018 в 8:54

Нет, у меня там web написано

22 окт 2018 в 8:55

22 окт 2018 в 8:56

Не подскажете почему на серваке вываливается ошибка? 2018-10-23T15:06:30.166700+00:00 app[bot.1]: File «/app/.heroku/python/lib/pytho n3.6/site-packages/aiogram/utils/exceptions.py», line 116, in detect 2018-10-23T15:06:30.166702+00:00 app[bot.1]: raise err(cls.text or description) 2018-10-23T15:06:30.166712+00:00 app[bot.1]: aiogram.utils.exceptions.Terminated ByOtherGetUpdates: Conflict: terminated by other getupdates request; make sure t hat only one bot instance is running

Источник: ru.stackoverflow.com

Telegram-бот на Java для самых маленьких — от старта до бесплатного размещения на heroku

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

Предыстория

Когда моя дочь начала изучать арифметику, я между делом накидал алгоритм генерации простых примеров на сложение и вычитание вида «5 + 7 =», чтобы не придумывать и не гуглить для неё задания.

И тут на глаза попалась новость, что Telegram выпустил новую версию Bot API 5.0. Ботов я раньше не писал, и потому решил попробовать поднять бота как интерфейс для своей поделки. Все примеры, которые мне удалось найти, показались либо совсем простыми (нужные мне функции не были представлены), либо очень сложными для новичка. Также мне не хватало объяснений, почему выбран тот или иной путь.

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

Что в статье есть, чего нет

В статье есть про:

  • создание бекенда не-инлайн бота на Java 11 с использованием Telegram Bot Api 5.0;
  • обработка команд вида /dosomething;
  • обработка текстовых сообщений, не являющихся командами (т.е. не начинающихся с «/»);
  • отправку пользователю текстовых сообщений и файлов;
  • деплой и запуск бота на heroku.
  • использование функций ботов, не перечисленных выше (например, создание клавиатур — я их сначала добавил, но в итоге они мне просто не пригодились);
  • создание списка заданий;
  • работу с Word-документом;
  • обеспечивающие функции — логирование, тесты и т.п.;
  • общение с BotFather (создание бота, получение его токена и формирование списка команд подробно и понятно описано во многих источниках, вот первый попавшийся мануал).

Бизнес-функции бота

Очень кратко, чтобы проще было воспринимать код. Бот позволяет:

  • выдавать пользователю справочную текстовую информацию в ответ на команды /start , /help и /settings ;
  • обрабатывать и запоминать пользовательские настройки, направленные текстовым сообщением заданного формата. Настроек три — минимальное + максимальное число, используемые в заданиях, и количество страниц выгружаемого файла;
  • оповещать пользователя о несоблюдении им формата сообщения;
  • формировать Word-файл с заданиями на сложение, вычитание или вперемешку в ответ на команды /plus , /minus и /plusminus с использованием дефолтных или установленных пользователем настроек.

Общий порядок действий

  • разобраться с зависимостями;
  • создать класс бота и реализовать обработку текстовых сообщений пользователя, не являющихся командами;
  • создать классы команд;
  • прописать запуск приложения;
  • задеплоить на heroku.

Зависимости

Для управления зависимостями использовался Apache Maven. Нужные зависимости — собственно Telegram Bots и Lombok, использовавшийся для упрощения кода (заменяет стандартные java-методы аннотациями).

Вот что вышло в

Еще по теме:  Как создать новый аккаунт в Телеграмме чтобы никто не знал

pom.xml

*** *** 1.0-SNAPSHOT *** *** jar 11 $ $ UTF-8 1.18.16 4.1.2 5.0.1 org.telegram telegrambots $ org.telegram telegrambotsextensions $ org.projectlombok lombok $ compile $ org.apache.maven.plugins maven-compiler-plugin 3.8.1 $ org.projectlombok lombok $ org.apache.maven.plugins maven-dependency-plugin 3.1.2 copy-dependencies package copy-dependencies org.apache.maven.plugins maven-surefire-plugin 3.0.0-M5

Класс бота и обработка текстовых сообщений

Мой класс Bot унаследован от TelegramLongPollingCommandBot, который, в свою очередь, наследуется от более распространённого в примерах TelegramLongPollingBot.

CommandBot хорош тем, что в нём уже реализованы приём и обработка команд — то есть сообщений, начинающихся с «/». Можно создавать отдельные классы команд (подробнее о них ниже), инициализировать их в конструкторе бота и уже в них писать логику их обработки.

В классе Bot таким образом остаётся только логика обработки текстовых сообщений, не являющихся командами. В моём случае это пользовательские настройки или мусорные сообщения, не соответствующие формату. Для лаконичности логику их обработки тоже стоит вынести в отдельный вспомогательный класс, вызывая его метод из переопределенного метода processNonCommandUpdate(Update update) класса Bot.

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

Получился вот такой

Bot.java

Класс обработки текстовых сообщений
NonCommand.java

Классы команд

Все классы команд наследуются от BotCommand.

Команды в моём боте делятся на 2 группы:

  • Сервисные — возвращают справочную информацию;
  • Основные — формируют файл с заданиями.

Начнём с более простых Сервисных команд. В абстрактный суперкласс вынесен метод отправки пользователю ответа, а в классах команд формируется текст ответа.

Абстрактный суперкласс Сервисных команд

ServiceCommand.java

import org.telegram.telegrambots.extensions.bots.commandbot.commands.BotCommand; import org.telegram.telegrambots.meta.api.methods.send.SendMessage; import org.telegram.telegrambots.meta.bots.AbsSender; import org.telegram.telegrambots.meta.exceptions.TelegramApiException; /** * Суперкласс для сервисных команд */ abstract class ServiceCommand extends BotCommand < ServiceCommand(String identifier, String description) < super(identifier, description); >/** * Отправка ответа пользователю */ void sendAnswer(AbsSender absSender, Long chatId, String commandName, String userName, String text) < SendMessage message = new SendMessage(); //включаем поддержку режима разметки, чтобы управлять отображением текста и добавлять эмодзи message.enableMarkdown(true); message.setChatId(chatId.toString()); message.setText(text); try < absSender.execute(message); >catch (TelegramApiException e) < //логируем сбой Telegram Bot API, используя commandName и userName >> >

Класс Сервисной команды на примере
StartCommand.java

В суперклассе Основных команд, помимо аналогичного метода отправки ответов, содержится формирование Word-документа.

OperationCommand.java

Класс Основной команды на примере
PlusMinusCommand.java

Приложение

В методе main инициализируется TelegramBotsApi, в котором и регистрируется Bot.

TelegramBotsApi в качестве параметра принимает Class. Если нет никаких заморочек с прокси, можно использовать DefaultBotSession.class.

Чтобы получать имя и токен бота как переменные окружения, необходимо использовать System.getenv().

Получаем вот такой

MentalCalculationApplication.java

import org.telegram.telegrambots.meta.TelegramBotsApi; import org.telegram.telegrambots.meta.exceptions.TelegramApiException; import org.telegram.telegrambots.updatesreceivers.DefaultBotSession; import ru.taksebe.telegram.mentalCalculation.telegram.Bot; import java.util.Map; public class MentalCalculationApplication < private static final Mapgetenv = System.getenv(); public static void main(String[] args) < try < TelegramBotsApi botsApi = new TelegramBotsApi(DefaultBotSession.class); botsApi.registerBot(new Bot(getenv.get(«BOT_NAME»), getenv.get(«BOT_TOKEN»))); >catch (TelegramApiException e) < e.printStackTrace(); >> >

Деплой на heroku

Для начала нужно создать в корне проекта файл Procfile и написать в него одну строку:
worker: java -Xmx300m -Xss512k -XX:CICompilerCount=2 -Dfile.encoding=UTF-8 -cp ./target/classes:./target/dependency/*
, где worker — это тип процесса.

Если в проекте используется версия Java, отличная от 8, также необходимо создать в корне проекта файл system.properties и прописать в нём одну строку:
java.runtime.version=

Далее порядок такой:

  1. Регистрируемся на heroku и идём в консоль;
  2. mvn clean install ;
  3. heroku login — после выполнения потребуется нажать любую клавишу и залогиниться в открывшемся окне браузера;
  4. heroku create — создаём приложение на heroku;
  5. git push heroku master — пушим в репозиторий heroku;
  6. heroku config:set BOT_NAME= — добавляем имя бота в переменные окружения;
  7. heroku config:set BOT_TOKEN= — добавляем токен бота в переменные окружения;
  8. heroku config:get BOT_NAME (аналогично BOT_TOKEN) — убеждаемся, что переменные окружения установлены верно;
  9. heroku ps:scale worker=1 — устанавливаем количество контейнеров (dynos) для типа процесса worker (ранее мы выбрали этот тип в Procfile), при этом происходит рестарт приложения;
  10. В интерфейсе управления приложением в личном кабинете на heroku переходим к логам (прячутся под кнопкой «More» в правом верхнем углу) и убеждаемся, что приложение запущено;
  11. Тестируем бота через Telegram.

Вместо заключения

Как выяснилось, не только лишь все видели чудесный советский мультик про козлёнка, который учился считать до 10.

Источник: temofeev.ru

Рейтинг
( Пока оценок нет )
Загрузка ...