# Телеграм бот на Python
В этой статье мы рассмотрим, как развернуть телеграм бота на python.
Статья содержит текстовую инструкцию и несколько видеопримеров на ее основе.
## Видеопример №1
Загрузка через Git (и интерфейс) c базой данных SQlite
Содержание видео
Таймкоды:
- 00:00 - Про проект
- 02:25 - Создание файла requirements.txt
- 03:00 - Загрузка через интерфейс
- 03:30 - Задание конфигурации
- 04:35 - Загрузка SQLite
- 05:30 - Загрузка через Git
- 06:45 - Генерация конфигурационного файла amvera.yml через сервис генерации
- 09:25 - Генерация конфигурационного файла amvera.yml через интерфейс и выполнение git pull
```{eval-rst}
.. youtube:: A5yjzMKT7DI
:align: center
:width: 100%
```
## Видеопример №2
Загрузка через интерфейс
```{eval-rst}
.. youtube:: 1ssMx6wTF6w
:align: center
:width: 100%
```
## Инструкция с загрузкой через push в git
Возьмем готовый пример [эхо бота](https://github.com/python-telegram-bot/python-telegram-bot/blob/master/examples/echobot.py) от создателя библиотеки для работы с телеграмом python-telegram-bot.
```{eval-rst}
.. admonition:: Подсказка
:class: hint
Для ознакомления с принципом работы с git рекомендуем `эту статью `_, которая
позволит понять, как создавать git-репозиторий и вносить в него изменения.
```
### Предварительная подготовка
- В телеграме через поиск найти бот "BotFather" и запросить у него создание нового телеграм бота. Он попросит ввести название и username для бота, после чего выдаст токен.
- Скопировать выданный токен и вставить его в файл примера эхо бота на место слова TOKEN в функции main()
- Написать YAML файл или Dockerfile. Для yaml у нас есть генератор, поддерживающий ограниченный набор окружений, в остальных случаях рекомендуется использовать [Dockerfile](https://docs.amvera.ru/books/amvera/page/docker). Но в данном примере вам подойдет [генератор yaml](https://manifest.amvera.ru/).
- Создать файл с зависимостями requirements.txt
- Привязать репозиторий к Amvera
- Сделать push в master
### Создание YAML файла
Подробно о том, как вручную составить файл конфигурации описано в [документации](../../applications/configuration/config-file.md).
Мы же воспользуемся [автоматическим графическим инструментом генерации](https://manifest.amvera.ru/).
![python_config](../../img/python-tgbot.png)
- Выбираем окружение Python и версию.
- Указываем версию и путь до файла requirements.txt. Очень важно указать все используемые в проекте пакеты в этом файле, чтобы облако смогло их скачать через pip.
- Указываем путь до файла, содержащего точку входа в программу (тот файл, который вы указываете интерпретатору питона, когда запускаете приложение). В нашем случае это файл echobot.py (если ваш файл находится не в корневой папке проекта, то нужно указывать путь относительно корня проекта. Если бы мой файл был в папке src, мы бы указали в этом поле src/echobot.py)
- Если в процессе работы ваш бот собирает какие-то данные от пользователя, которые следует сохранять на диск, то их следует класть в папку data. В противном случае при перезапуске проекта все данные будут потеряны!
- Порт можно указать любой, так как в нашем случае он не играет никакой роли (но в большинстве случаев мы рекомендуем использовать порт 80, именно он открыт в Amvera).
- Нажимаем на кнопку Generate YAML, после чего начинается загрузка файла amvera.yml.
- Скачанный файл кладем в корень нашего проекта.
### Создание файла с зависимостями
- Cоздать файл `requirements.txt` , в котором прописать строчку: `python-telegram-bot`
```{eval-rst}
.. admonition:: Внимание
:class: attention
В вашем проекте могут быть другие зависимости, отличающиеся от зависимостей в этом примере - их все нужно корректно прописать.
```
```{eval-rst}
.. admonition:: Подсказка
:class: hint
При развертывании телеграм-ботов частой ошибкой является неверное название "телебота" в `requirements.txt`. Телебот в
`requirements.txt` должен называться `pyTelegramBotAPI`, а не `telebot`.
```
- Вызвать `pip install -r requirements.txt`, чтобы установить этот пакет. Почему бы просто не установить пакет через
`pip install python-telegram-bot`? Так тоже можно, но файл requirements.txt все равно понадобится для разворачивания в
облаке, поэтому лучше сразу его создать.
- Проверить, что все работает, можно запустив бот локально через python3 echobot.py и протестировав созданный бот в
телеграм (ссылку на бот можно найти у BotFather).
- Поместить ваш `requirements.txt` в корень репозитория.
### Привязка git-репозитория и push в master
Возможно два варианта:
1. Привязать к уже имеющемуся репозиторию (папке).
- Инициализировать git репозиторий. Как установить [git](../../applications/git.rst), если он ещё не установлен, описано
[тут](https://git-scm.com/book/ru/v2/%D0%92%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5-%D0%A3%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0-Git).
- В корне нашего проекта даем команду: `git init` (если гит уже инициализирован в вашем проекте, то этого делать не нужно)
- Привязываем наш локальный гит репозиторий к удаленному репозиторию через команду, которая указана на странице проекта в
amvera:
```shell
git remote add amvera https://git.amvera.ru/<имя-пользователя>/<транслитерированное-имя-проекта>`
```
- Проверяем, что все изменения закомичены, вызывая `git status`. Если там будет список файлов, то значит нужно их закомитить, выполнив:
```shell
git add .
git commit -m "Some informative msg"
```
- Отправляем изменения в репозиторий Amvera
```shell
git push amvera master
```
На запрос пользователя и пароля укажите имя пользователя и пароль вашей учетной записи Amvera.
2. Использовать выделенный репозиторий Amvera (а не привязывать свой).
- Склонируем пустой репозиторий:
```shell
git clone https://git.amvera.ru/<имя-пользователя>/<транслитерированное-имя-проекта>
```
- Проверяем, что все изменения закомичены, вызывая `git status`. Если там будет список файлов, то значит нужно их закомитить, выполнив:
```shell
git add .
git commit -m "Some informative msg"
```
- Отправляем изменения в репозиторий Amvera
```shell
git push amvera master
```
На запрос пользователя и пароля укажите имя пользователя и пароль вашей учетной записи Amvera.
### Развертывание приложения
После того как проект запушится в систему, начнется [сборка](../../applications/build.md) и на странице проекта статус
поменяется на "Выполняется сборка".
Как только проект соберется, он перейдет в стадию [запуска](../../applications/run.md) и статус сменится на "Выполняется
развертывание", а после перейдет в "Успешно развернуто".
Если по какой-то причине проект не развернулся, можно обратиться к логам сборки и логам приложения для отладки
(они могут идти с задержкой в 5-10 минут). Если Проект завис в статусе "Сборка" на долгое время,
а логи сборки не отображаются, то стоит ещё раз проверить корректность `amvera.yaml` файла и `requirements.txt` файла.
```{eval-rst}
.. admonition:: Подсказка
:class: hint
Если логи пишутся в print, для их отображения надо выставить переменную окружения `PYTHONUNBUFFERED` в 1.
```
```{eval-rst}
.. admonition:: Важно
:class: warning
Сохраняйте файлы БД и иные изменяемые данные в постоянное хранилище, чтобы избежать их потери при обновлении проекта, когда производится "откат" папки код до состояния обновления репозитория.
Папка data в корне проекта и директория /data, это разные директории.
Проверить, что сохранение идет в /data, можно зайдя в папку "data" на странице "Репозиторий".
```
```{eval-rst}
.. admonition:: Важно
:class: warning
Чтобы избежать ошибки 502, измените в вашем коде host 127.0.0.1 (или подобный localhost) на 0.0.0.0, и пропишите в конфигурации порт, который слушает ваше приложение (пример - 8080).
```
## Если у вас не получается развернуть проект
Напишите наблюдаемую вами симптоматику на support@amvera.ru с указанием вашего имени пользователя и названия проекта,
мы постараемся вам помочь.