tjtanjin / python_telegram_bot_guide.md
This short guide will walk you through hosting your very own telegram bot on Ubuntu (tested on Ubuntu 18.04 and 20.04)!
This guide assumes knowledge of the following:
1) Provisioning a VPS 2) Familiarity with SSH 3) Familiarity with linux command line
To begin, you will need to provision a VPS from cloud providers such as digitalocean or upcloud. Other popular services like AWS and google cloud would work as well with their EC2 and compute instances but the nature of those services are such that they are slightly more complicated to work with so they will not be included in this guide.
Once you have your VPS provisioned, SSH into your server with the following command (replacing 11.11.11.11 with your server’s IP address):
Within your server, run the update command below:
Next, to ensure that your bot will be running 24/7, we will be using screen to keep the process alive even when we are no longer maintaining an SSH connection to the server:
Let us next quickly create a new user that will be handling this telegram bot. For the purpose of this guide, a telegram bot I coded in python, Simple Media Converter will be used which will be handled by the user smc. Run the following command to create this new user:
Give the user superuser permissions:
For the remaining part of the guide, exit from your root SSH session and login as smc instead (again replacing 11.11.11.11 with the IP address of your VPS):
This part will vary greatly depending on the nature of your project. For demonstration purposes, if you are following through with the Simple Media Converter project, then follow this setup guide to get the project ready.
Once the project setup is complete, initialize a new screen session with the following command (this is important if you want your bot to be running 24/7):
Hit enter to continue and in this new screen, start your telegram bot:
Detach from the screen by hitting ctrl + a + d on your keyboard. Make sure to hit all 3 at once because just hitting ctrl + d alone will terminate your screen instead. To view the list of screens, you may use the following command:
To reattach to the screen, simply use the command:
With that, your bot should now be running 24/7! This concludes the guide for hosting your very own telegram bot on Ubuntu! Thank you for reading!
Деплой бота на Python на Beget
Деплой — это развёртывание программного обеспечения, то есть это все действия, которые делают программную систему готовой к использованию.
Деплой телеграм-бота — это размещение его на сервере или на хостинге.
- хостинг на Beget
- к хостингу привязан домен
- для домена выпущен бесплатный SSL-сертификат Let’s Encrypt
Установка Flask на Beget
Включаем SSH в настройках хостинга (если он выключен).
Подключаемся к хостингу через SSH. Я делаю это через программу Putty.
В поле «hostname (or IP address)» вводим:
То есть в моем конкретно случае:
Нажимаем Open, вводим пароль от хостинга и заходим на хостинг через SSH:
Затем нам нужно перейти в Docker, выполняем команду:
Еще раз потребуется ввести пароль от хостинга, и если всё ОК — видим надпись (docker) в скобочках.
Теперь переходим в папку сайта, в моем случае команда выглядит так:
Вы всегда можете подсмотреть, где сейчас находитесь в помощью команды:
Итак, зашли внутрь папки hosting-telegram-bota.ru
Теперь создадим папку .venv командой
python3 -m pip install --upgrade pip
Активируем виртуальное окружение. Сначала команда:
Затем переходим в папку .venv
Если посмотреть через менеджер файлов — то на хостинге у нас такая картина:
и внутри папки .venv тоже кое-что появилось:
Продолжаем работу в консоли через Putty.
Нужно узнать путь к Python, который мы позже пропишем в настройках Flask. Выполните команду:
и запишите куда-то путь, который вам покажет.
/home/h//hosting-telegram-bota.ru/.venv/bin/python3
python3 -m pip install flask
Установим библиотеку Requests:
Также на этом этапе возможно вам потребуется установить библиотеки, необходимые для работы вашего бота. Тем более, что бот может быть написан с использованием разных вспомогательных фреймворков — Aiogram, Telebot и т.д.
Выйдем из папки .venv на уровень выше
И начнем создавать структуру папок:
. └── hosting-telegram-bota.ru ├── HelloFlask │ └── __init__.py ├── .htaccess ├── passenger_wsgi.py └── tmp └── .venv └── Pipfile └── public_html
Создаем две директории HelloFlask и tmp.
Теперь, если посмотреть через File Manager Beget, у нас такая структура папок внутри папки сайта «../hosting-telegram-bota.ru»
touch .htaccess touch passenger_wsgi.py
Параллельно, если не уверенно себя чувствует с консолью, можно проверять изменения через файловый менеджер хостинга, не забываем кнопку «Обновить», чтобы увидеть изменения.
Здесь же (в менеджере файлов Бегет) я открою файлы на редактирование.
В файле .htaccess пишем следующие строки, где во второй — путь к нашему Python , который мы узнали ранее через команду which python3
PassengerEnabled On PassengerPython /home/h//hosting-telegram-bota.ru/.venv/bin/python3
Теперь редактируем файл passenger_wsgi
# -*- coding: utf-8 -*- import sys, os # указываем директорию с проектом sys.path.append('/home///hosting-telegram-bota.ru/HelloFlask') # указываем директорию с библиотеками, куда поставили Flask sys.path.append('/home///.local/lib/python3.6/site-packages') from HelloFlask import app as application # Когда Flask стартует, он ищет application. # Если не указать 'as application', сайт не заработает from werkzeug.debug import DebuggedApplication # Опционально: подключение модуля отладки application.wsgi_app = DebuggedApplication(application.wsgi_app, False) # Опционально: включение модуля отадки application.debug = False # Опционально: True/False устанавливается по необходимости в отладке
Также я меняю для обоих файлов права на 644.
Переходим в папку HelloFlask
Создаём там файл __init__.py
Открываем его на редактирование и пишем:
from flask import Flask app = Flask(__name__) @app.route('/python-bot/') def hello_world(): return 'Hello Flask!' if __name__ == '__main__': app.run()
Обратите внимание, я задал route /python-bot/ , который будет использован потом при добавлении вебхука для телеграм-бота.
Сохраняем и также изменяем атрибуты доступа на 644.
Остались последние приготовления перед проверкой — запустилось ли наше Flask-приложение.
Возвращаемся в корневую директорию
Выполняем последние команды:
Эта команда ( touch tmp/restart.txt ) понадобится нам каждый раз, когда мы будем вносить какие-то изменения, чтобы перезапустить Flask.
Не забывайте выполнять ее, иначе изменения применяться не будут.
Также, не забывайте про права на файлы (chmod 644) и возможные другие проблемы. Важна каждая деталь, например, кодировка файлов.
Теперь проверим — работает ли Flask . Откроем в браузере наш сайт на той странице, адрес которой указали в __init__.py .
Если всё OK, увидим «Hello Flask!»
Запускаем телеграм бота на хостинге
Ок, Flask работает. Теперь заменим код в файле __init__.py на код нашего бота.
Я сделал второго телеграмм бота, чтобы на хостинге у нас работал бот на Python с похожим функционалом, как и тот, что вначале был сделан на PHP .
Вот такой код я помещу в __init__.py
from flask import Flask, render_template from flask import request from flask import Response import requests TOKEN = "" app = Flask(__name__, template_folder='../public_html') def tel_parse_message(message): print("message-->",message) try: chat_id = message['message']['chat']['id'] txt = message['message']['text'] print("chat_id-->", chat_id) print("txt-->", txt) return chat_id,txt except: print("NO text found-->>") def tel_send_message(chat_id, text): url = f'https://api.telegram.org/bot/sendMessage' payload = < 'chat_id': chat_id, 'text': text >r = requests.post(url,json=payload) return r def tel_send_image(chat_id): url = f'https://api.telegram.org/bot/sendPhoto' payload = < 'chat_id': chat_id, 'photo': "https://hosting-telegram-bota.ru/pic/pss-python.jpg", 'caption': "Жми /more" >r = requests.post(url, json=payload) return r def tel_send_inlineurl(chat_id): url = f'https://api.telegram.org/bot/sendMessage' payload = < 'chat_id': chat_id, 'text': "Добро пожаловать в бота!\nСделано на Python.\nВашему боту нужен хостинг с поддержкой:", 'reply_markup': < "inline_keyboard": [ [ , ], [ , ] ] > > r = requests.post(url, json=payload) return r @ app.route('/python-bot/', methods=['GET', 'POST']) def index(): if request.method == 'POST': msg = request.get_json() try: chat_id, txt = tel_parse_message(msg) if txt == "hi": tel_send_message(chat_id,"Hello, world!") elif txt == "/start": tel_send_image(chat_id) elif txt == "/more": tel_send_inlineurl(chat_id) else: tel_send_message(chat_id, 'from webhook') except: print("from index-->") return Response('ok', status=200) else: return 'Это страница-webhook для бота на Python, размещенного на хостинге Beget.
' @app.route('/', defaults=) @app.route('/') def catch_all(path): return render_template('home.html') if __name__ == '__main__': app.run(threaded=True)
После сохранения нового кода в init.py — не забываем перезапустить Фласк командой (зайдя на хостинг через SSH):
И также активировать webhook для бота, открыв в браузере:
https://api.telegram.org/bot/setWebhook?url=https://hosting-telegram-bota.ru/python-bot/
Проверяем, открыв страницу бота в браузере, и видим ту надпись, которую мы задали для GET-запроса:
Проверяем как работает сам бот @hosting_telegram_bot
Сервер для телеграмм бота Python
Вот так бот на Python может работать на обычном шаред-хостинге. Бесплатного тестового периода в 30 дней вполне хватит, чтобы поиграться-протестировать гипотезу, запустить MVP.
Конечно, боты бывают разной сложности и замысла. Возможно, придется все-таки перейти на сервер, которые у Beget тоже есть с хорошими конфигурациями.
Список с ценами за VPS/VDS — по ссылке.
А здесь короткое видео, как разместить бота на сервере от Бегет:
Полезные ссылки
- Статья на Beget по настройке Python на хостинге
- Код telegram бота на Питоне я подсмотрел здесь
- Кажется, крутой учебник по aiogram
- Еще статья по запуску Flask на Бегете