Задеплоить Телеграм бот без ssh

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

  1. Настройка
  2. Создание Telegram-бота
  3. Деплой на Heroku
  4. Заключение

Настройка

  • свой токен;
  • адрес Telegram API (https://api. telegram .org/bot);
  • ссылку на документацию.

Далее начните беседу с ботом. Введите в поисковой строке его имя и нажмите /start . Отправьте любое сообщение: оно станет первым обновлением, которое получит бот.

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

https://api. telegram .org/bot /getUpdates

Так вы отправите запрос на сервер Telegram , и он ответит вам в формате JSON:

< «ok»:true, «result»:[< «update_id»:523349956, «message»:< «message_id»:51, «from»:< «id»:303262877, «first_name»:»YourName» >, «chat»:< «id»:303262877, «first_name»:»YourName», «type»:»private» >, «date»:1486829360, «text»:»Hello» > >] >

Если вы откроете раздел метода /sendMessage , то увидите, что он принимает два параметра: chat_id и text . Вы можете создавать цепочки параметров в адресной строке браузера, используя ? для первого параметра и text=test

Попробуйте получить ответ от вашего бота, подставив в качестве chat_id значение, полученное после вызова /getUpdates (в нашем примере это 303262877 ). Текст сообщения может быть любым. Запрос должен выглядеть так:

Создаем TELEGRAM бота на PYTHON и заливаем на БЕСПЛАТНЫЙ ХОСТИНГ за 5 МИНУТ


https://api.telegram.org/bot/sendMessage?chat_id=303262877 ? Вы можете сделать то же самое, добавив словарь в качестве второго дополнительного параметра в функциях get / post из пакета requests.

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

Чтобы бот слушал сервер и получал обновления, нужно запустить основной цикл. После import requests добавьте from time import sleep и замените две последние строки на следующий код:

def main(): update_id = last_update(get_updates_json(url))[‘update_id’] while True: if update_id == last_update(get_updates_json(url))[‘update_id’]: send_mess(get_chat_id(last_update(get_updates_json(url))), ‘test’) update_id += 1 sleep(1) if __name__ == ‘__main__’: main()

Хотя мы и добавили таймаут в 1 секунду, пример выше можно использовать только в обучающих целях, поскольку он использует частые опросы (short polling), что плохо влияет на сервер Telegram .

Есть ещё два способа получения обновлений через API — длинные опросы (long polling) и вебхуки (webhooks). Если мы будем использовать способ получения обновлений через getUpdates без параметров, то запросы будут происходить слишком часто.

Переключимся на длинные опросы. Сперва изменим первую функцию, добавив в неё параметр timeout . Сам по себе он не уменьшит частоту проверки обновлений и будет работать только в том случае, когда обновлений нет. Чтобы помечать уже просмотренные обновления, нужно добавить параметр сдвига offset :

def get_updates_json(request): params = response = requests.get(request + ‘getUpdates’, data=params) return response.json()

Теперь Telegram-бот на Python должен работать нормально, но его всё ещё можно улучшить. Давайте инкапсулируем все функции в один класс. Должно получиться что-то вроде этого:

import requests import datetime class BotHandler: def __init__(self, token): self.token = token self.api_url .format(token) def get_updates(self, offset=None, timeout=30): method = ‘getUpdates’ params = resp = requests.get(self.api_url + method, params) result_json = resp.json()[‘result’] return result_json def send_message(self, chat_id, text): params = method = ‘sendMessage’ resp = requests.post(self.api_url + method, params) return resp def get_last_update(self): get_result = self.get_updates() if len(get_result) > 0: last_update = get_result[-1] else: last_update = get_result[len(get_result)] return last_update

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

greet_bot = BotHandler(token) greetings = (‘здравствуй’, ‘привет’, ‘ку’, ‘здорово’) now = datetime.datetime.now() def main(): new_offset = None today = now.day hour = now.hour while True: greet_bot.get_updates(new_offset) last_update = greet_bot.get_last_update() last_update_id = last_update[‘update_id’] last_chat_text = last_update[‘message’][‘text’] last_chat_id = last_update[‘message’][‘chat’][‘id’] last_chat_name = last_update[‘message’][‘chat’][‘first_name’] if last_chat_text.lower() in greetings and today == now.day and 6 ‘.format(last_chat_name)) today += 1 elif last_chat_text.lower() in greetings and today == now.day and 12 ‘.format(last_chat_name)) today += 1 elif last_chat_text.lower() in greetings and today == now.day and 17 ‘.format(last_chat_name)) today += 1 new_offset = last_update_id + 1 if __name__ == ‘__main__’: try: main() except KeyboardInterrupt: exit()

Еще по теме:  Как должен выглядеть Телеграм

Теперь вы можете улучшать бота так, как захотите. Можно, например, настроить отправку медиафайлов или добавить собственные кнопки.

Деплой на Heroku

Последним шагом будет развёртывание бота на сервере. Зарегистрируйтесь на GitHub, если у вас ещё нет там аккаунта, и установите Git. Для этого на Linux выполните следующую команду:

$ sudo apt-get install git-all

На macOS и Windows его нужно скачать и установить вручную. И не забудьте зарегистрироваться на Heroku. Установите virtualenv:

$ pip install virtualenv

Создайте новую папку и перейдите в неё в терминале или командной строке. Инициализируйте в ней virtualenv :

$ virtualenv my_env

Имя не имеет значения, но лучше сделать его интуитивно понятным. Перейдите в папку my_env . Теперь нужно склонировать git-репозиторий. Введите команду:

$ git clone https://github.com/имя_вашего_профиля/имя_вашего_репозитория

Поместите скрипт в папку, полученную в результате выполнения команды git clone . Вернитесь в папку my_env и запустите virtualenv :

$ scriptsactivate.bat
$ source bin/activate

Если вы успешно запустили virtualenv , приглашение командной строки должно начинаться с (my_env). Перейдите в папку репозитория и ещё раз установите модуль requests:

$ pip install requests

Теперь нужно создать список зависимостей Heroku. Это несложно. Введите:

$ pip freeze > requirements.txt

Создайте Procfile . В этом файле следует разместить инструкции по работе со скриптом. Имя файла обязательно должно быть Procfile ( Procfile.windows в случае с Windows). У него не должно быть других расширений. Содержимое файла должно быть таким (замените my_bot на имя вашего скрипта):

web: python my_bot.py

Добавьте файл __init__.py в вашу папку. Он может быть пустым, но должен там быть. Отправьте коммит с изменениями в репозиторий:

$ git init $ git add . $ git commit -m ‘короткое сообщение, описывающее изменения в коммите’ $ git push -u https://github.com/имя_вашего_профиля/имя_вашего_репозитория

Теперь развернём Telegram-бота на Heroku. Можно использовать и панель управления на сайте, но мы потренируемся делать всё через консоль.

Если вы пользуетесь macOS или Windows, установите интерфейс командной строки, следуя гайду. Если у вас Ubuntu, используйте следующие команды:

$ sudo add-apt-repository «deb https://cliassets.heroku.com/branches/stable/apt ./» $ curl -L https://cli-assets.heroku.com/apt/release.key | $ sudo apt-key add — $ sudo apt-get update $ sudo apt-get install heroku

Теперь выполните следующие команды:

$ heroku login $ heroku create $ git push heroku master $ heroku ps:scale web=1 $ heroku open

С этого момента приложение должно работать на сервере Heroku. Если что-то пойдёт не так, проверить логи можно следующим образом:

$ heroku logs —tail

Заключение

Поздравляем! Теперь вы знаете, как писать ботов для Telegram на Python. Лучше изучить возможности Telegram-ботов поможет видеокурс — в нём используется PHP, но суть та же.

Источник: news.myseldon.com

Как задеплоить своего телеграм-бота (почти) бесплатно — Quickguide в облачный Serverless

Всем привет! Меня зовут Антон Брехов. Я инженер в Yandex Cloud. Сегодня хочу рассказать о том, как дешевле всего задеплоить своего телеграм-бота. Возможно, этот опыт пригодится и для других решений.

Готовых фреймворков для телеграм-ботов уже достаточно много на любых языках. Однако после написания кода встает вопрос: а как теперь заставить бота работать постоянно, сделать доступным 24/7?

Новички оставляют персональный компьютер работающим и опрашивают сервер телеграма с некоторой частотой. У опытных, скорее всего, есть свой VPS-сервер с reverse proxy для деплоя приложений. Первое решение не является высокодоступным – всё-таки персональный компьютер не предназначен для круглосуточной работы (чаще всего он не подключен к источнику бесперебойного питания, может иметь проблемы с доступом в интернет и т.д.). А отдельный сервер, даже в облаке, — это слишком дорого для деплоя одного бота. Стоимость одного VPS в среднем — от 5$ в месяц.

Еще по теме:  Ч помощью какого приложения открываются документы в Телеграмме

В статье расскажу, как работает альтернативное решение на базе наших Serverless-сервисов, которое использую сам.

Вот так выглядит схема в случае бота с настроенным вебхуком. Пользователь отправляет сообщение боту в телеграм. Тот стучится на настроенный вебхук. Запускается написанная логика — отправляем ответ.

Здесь мы используем несколько продуктов:

  1. Основное — Serverless Containers. Это сервис, позволяющий запускать свои контейнеры по вызову HTTP или других триггеров. Подробнее тут. А также репозиторий образов контейнеров Container Registry.
  2. Следующий сервис — API Gateway. Он позволяет бессерверно предоставлять в открытый доступ HTTP (а с недавнего времени ещё и WS) эндпоинт для доступа к вашим облачным функциям, бессерверным контейнерам, другим сервисами Yandex Cloud и не только.
  3. Container Registry — собственный registry для контейнеров с поддержкой сканера на уязвимости.
  4. СУБД YDB в режиме Serverless — мультитенантная реляционная СУБД внутренней разработки Яндекса. Здесь важно, что не придётся платить за ресурсы, в отличие от сервисов Managed Service for MySQL или Managed Service for PostgreSQL. Решение отлично подходит в том числе для прототипов, потому что оплата идёт только за полезную нагрузку (количество выполненных запросов).

После создания Serverless-контейнера можно использовать в качестве вебхука прикрепленный к нему URL (если вы сделали его публично доступным). Однако рекомендую использовать перед контейнером API Gateway.

Если вам нужно после прихода запроса от серверов телеграма сделать обратный запрос (к примеру, скачать присланный в бота файл), этот запрос будет воспринят как конечный ответ приложения Serverless. После этого контейнер будет помечен как выполненный и остановится через несколько секунд. Если же между контейнером и телеграмом будет прослойка в виде API Gateway, такого не произойдет.

У YDB свой синтаксис YQL, схожий с привычным всем SQL. Но различий предостаточно. С удовольствием бы использовал его as is, если бы к нему был готовый ORM driver (как, например, PostgreSQL driver для gorm.io ).

YDB в Serverless-режиме имеет dynamodb compatible API, то есть можно брать API совместимую библиотеку и работать с YDB (правда, это уже не реляционная модель, но для прототипа сойдёт!).

Вот пример модели пользователя телеграм.

package user import «time» type User struct

В качестве сервера использую echo от labstack (очень нравится синтаксис).

package main import ( «log» «os» «yc-qr-bot/pkg/agent» tgbotapi «github.com/go-telegram-bot-api/telegram-bot-api/v5» «github.com/joho/godotenv» «github.com/labstack/echo/v4» ) var Version string func main() < log.Printf(«Version: %v\n», Version) godotenv.Load() bot, err := tgbotapi.NewBotAPI(os.Getenv(«TELEGRAM_APITOKEN»)) if err != nil < panic(err) >whInfo, _ := bot.GetWebhookInfo() log.Printf(«whInfo: %#v\n», whInfo) a := agent.New(bot) e := echo.New() e.POST(«/», a.HandleUpdate) e.Start(«:» + os.Getenv(«PORT»)) >

Детали самой реализации обработки можно найти в репозитории .

Самое трудное во всей схеме для новичка — задеплоить решение. Для этого написал Makefile для автоматизации.

include .env create: yc serverless container create —name $(SERVERLESS_CONTAINER_NAME) yc serverless container allow-unauthenticated-invoke —name $(SERVERLESS_CONTAINER_NAME) create_gw_spec: $(shell sed «s/SERVERLESS_CONTAINER_ID/$/;s/SERVICE_ACCOUNT_ID/$/» api-gw.yaml.example > api-gw.yaml) create_gw: create_gw_spec yc serverless api-gateway create —name $(SERVERLESS_CONTAINER_NAME) —spec api-gw.yaml webhook_info: curl —request POST —url «» webhook_delete: curl —request POST —url «» webhook_create: webhook_delete curl —request POST —url «» —header ‘content-type: application/json’ —data «» build: webhook_create docker build -t cr.yandex/$(YC_IMAGE_REGISTRY_ID)/$(SERVERLESS_CONTAINER_NAME) . push: build docker push cr.yandex/$(YC_IMAGE_REGISTRY_ID)/$(SERVERLESS_CONTAINER_NAME) deploy: push $(shell sed ‘s/=.*/=/’ .env > .env.example) yc serverless container revision deploy —container-name $(SERVERLESS_CONTAINER_NAME) —image ‘cr.yandex/$(YC_IMAGE_REGISTRY_ID)/$(SERVERLESS_CONTAINER_NAME):latest’ —service-account-id $(SERVICE_ACCOUNT_ID) —environment=’$(shell tr ‘\n’ ‘,’ < .env)’ —core-fraction 5 —execution-timeout $(SERVERLESS_CONTAINER_EXEC_TIMEOUT) all: deploy

Будем использовать утилиту yc CLI. С помощью неё можно управлять ресурсами Yandex Cloud. Установите и инициализируете yc.

Скопируйте .env.example в .env

TELEGRAM_APITOKEN= YC_IMAGE_REGISTRY_ID= SERVICE_ACCOUNT_ID= SERVERLESS_CONTAINER_EXEC_TIMEOUT= SERVERLESS_CONTAINER_NAME= SERVERLESS_CONTAINER_ID= SERVERLESS_CONTAINER_URL= SERVERLESS_APIGW_URL= AWS_DEFAULT_REGION= YDB_ENDPOINT=

Заполните четыре первые переменные.

⚡ Создайте сервисный аккаунт и дайте ему права serverless.containers.invoker container-registry.images.puller ydb.admin а также registry контейнеров .

Потом выполняем: make create

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

Копируем id созданного Serverless-контейнера, и дописываем в .env

Создаем теперь API Gateway: make create_gw

Копируем URL для доступа к созданному API Gateway и копируем обратно в .env (SERVERLESS_APIGW_URL).

Устанавливаем вебхук для бота: make webhook_create

И, наконец, собираем образ и отправляем в Docker Registry: make deploy

Отправляем в бота сообщение и смотрим в логи Serverless-контейнера.

Если нагрузка на бота незначительная, то стоимость решения будет копеечной. Объясняю почему. Согласно документации первые 1 млн вызовов в месяц для сервиса Serverless Containers — бесплатные. API Gateway — бесплатно первые 100к вызовов ежемесячно. Такая же ситуация с Serverless YDB — 1 миллион Request Units (RU) в месяц бесплатно.

Стоимость размещения моих ботов в месяц не превышает 10 рублей. По сути я плачу только за образы, которые храню в Container Registry.

Также воспользуюсь случаем и покажу своих ботов:

  • QR Bot: кодирование и декодирование QR-кодов.
  • Stenographer bot: конвертер аудиосообщений в текст. Сделано на базе Yandex SpeechKit
  • Levitan bot: конвертер текста в аудио. Присылайте ему текст — озвучит. Делал, чтобы читать длинные новости в телеграме, пока еду за рулем.
  • Notion To-Do Adder bot: привяжите страницу в Notion и кидайте тудушки в бота — он будет добавлять их в конец страницы.

Источник: savepearlharbor.com

Как загрузить Telegram бота на хостинг

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

Пошаговая инструкция, как запустить бота на хостинге

Сделать универсальное руководство по загрузке телеграм-бота на хостинг нельзя, поскольку для создания ботов используются разные технологии и языки программирования. Чаще всего виртуальных ассистентов для Телеграма пишут на Python или NodeJS. Наша инструкция основана на первом варианте: мы опишем, как выбрать хостинг для чат-бота на Python, установить нужные модули на сервер, залить, запустить, а также поставить бота на автоисполнение. Однако общая схема действий по установке, размещению и запуску может быть применима к любому телеграм-боту.

Как загрузить Telegram бота на хостинг.

Изображение от redgreystock на Freepik.

Выбор хостинга для телеграм-бота

Выбирая, где разместить своего чат-бота, следует обращать внимание на возможности и ресурсы, которые поставляет хостинг-провайдер. Установить и запустить телеграм-бота можно и бесплатно: например, через облачный сервис Heroku. Но бесплатный хостинг крайне ограничен и часто небезопасен. Если у вас простой бот, который отвечает на триггеры заготовленными репликами, его можно залить на обычный shared hosting. Главное, найти тариф с поддержкой Python и Telegram API.

Если же ваш помощник основан на нейросети и ожидается большой поток клиентов, лучше остановиться на аренде VPS (Virtual Private Server). На виртуальном сервере подключение будет стабильнее за счет изолированности вычислительных мощностей, а кроме того, VPS легче масштабировать. Вам не понадобится сайт и домен, чтобы его арендовать: подключиться можно будет по выделенному IP-адресу.

Настройка сервера для telegram-бота

Допустим, вы заказали подходящий сервер и удаленно подключились к нему по SSH. Прежде чем размещать на нем файлы нашего бота, нужно установить зависимости, которые потребуются для его работы. В частности, это язык Python и библиотека РуTelegramBotAPI. Мы покажем, как поставить эти компоненты на примере ОС Ubuntu. Введите в терминал:

sudo apt install python3
sudo apt install python3-pip
pip3 install pyTelegramBotAPI

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