Меню

Перезапуск бота при ошибке

При использовании телеграмм-бота на сервере, работающим под linux перезапустить упавший скрипт Python, в случае использования bot.polling, можно при помощи systemd или supervisor.

Разберем случай с менеджером системных и служб systemd.

Systemd представляет собой программный комплекс, который содержит набор системных компонентов для операционных систем Linux. Его основная цель — унифицировать конфигурацию и поведение служб в дистрибутивах Linux. Основным компонентом systemd является «менеджер систем и служб» — система инициализации, используемая для загрузки пользовательского пространства и управления пользовательскими процессами.

Проще говоря, системный менеджер systemd запустит любой скрипт (в том числе и скрипт Python телеграмм-бота) при старте системы, и будет перезапускать его в случае падения.

Установим системный менеджер systemd, если отсутствует:

$ apt-get install systemd

Создадим файл bot.service в директории /etc/systemd/system с таким содержанием:

$ sudo touch /etc/systemd/system/bot.service

Теперь откроем его

$ sudo nano /etc/systemd/system/bot.service

и вставим следующее содержимое:

[Unit]
Description=Telegram bot %name%
After=syslog.target
After=network.target

[Service]
Type=simple
User=root
# замените на свой путь к каталогу, где находится `bot.py`
WorkingDirectory=/usr/local/bin/bot  # или другой путь
# замените на свой путь к телеграмм-боту `bot.py`
ExecStart=/usr/bin/python3 /usr/local/bin/bot/bot.py  
RestartSec=10
Restart=always

[Install]
WantedBy=multi-user.target

в консоли выполним:

# перечитываем конфигурацию 
# (обнаружит файл `bot.service`)
$ sudo systemctl daemon-reload
# подключаем демон `bot.service`
$ sudo systemctl enable bot
# запускаем демон `bot.service`
$ sudo systemctl start bot
# смотрим статус демона `bot.service`
$ sudo systemctl status bot

ГОТОВО!

Теперь перезапустить/остановить телеграмм-бота можно системными командами Linux:

# перезапуск
$ sudo systemctl restart bot
# остановка
$ sudo systemctl stop bot
# запуск после остановки
$ sudo systemctl start bot

Возможно ли сделать автоматический перезапуск скрипта с ботом в случае ошибки в коде?

telebot.apihelper.ApiException: A request to the Telegram API was unsuccessful. The server returned HTTP 409 Conflict. Response body:
[b'{"ok":false,"error_code":409,"description":"Conflict: terminated by other getUpdates request; make sure that only one bot instance is running"}']

Пытался использовать следующий код, но так и не понял как он работает. Можете примерно объяснить?

while True:
    try:
        bot.polling(none_stop=True)

    except Exception as e:
        logger.error(e)  # или просто print(e) если у вас логгера нет,
        # или import traceback; traceback.print_exc() для печати полной инфы
        time.sleep(15)

1

systemd – cистемный менеджер, демон инициализации других демонов в Linux.

Проще говоря, systemd запустит бота и будет перезапускать его в случае падения.

Установим systemd, если отсутствует:

apt-get install systemd

Создадим файл bot.service с таким содержанием в /etc/systemd/system:

[Unit]
Description=Telegram bot %name%
After=syslog.target
After=network.target

[Service]
Type=simple
User=root
WorkingDirectory=/usr/local/bin/bot  # or other path
ExecStart=/usr/bin/python3 /usr/local/bin/bot/bot.py  # or other path
RestartSec=10
Restart=always

[Install]
WantedBy=multi-user.target

в консоли выполним:

systemctl daemon-reload
systemctl enable bot
systemctl start bot
systemctl status bot

ответ дан 23 апр 2020 в 6:11

Violet's user avatar

VioletViolet

9,8155 золотых знаков20 серебряных знаков64 бронзовых знака

Однажды мы сделали цикл статей про телеграм-ботов:

  • Как сделать телеграм-бота без программирования
  • Телеграм-бот на Python
  • Запускаем телеграм-бота на сервере

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

Сейчас нам нужно такое решение, чтобы бот автоматически перезапускался при любых обстоятельствах. Этим и займёмся.

Коротко — суть

Чтобы было понятно, что тут происходит, вот короткая версия:

  1. Настраиваем удалённый доступ к серверу.
  2. Создаём папку и заливаем в неё скрипт, который в итоге должен будет работать всё время.
  3. Создаём у себя на компьютере файл службы — он управляет настройками автозапуска скрипта.
  4. Отправляем файл службы на сервер.
  5. Обновляем на сервере данные обо всех службах и запускаем нашу.

Теперь подробно про каждый шаг.

Предварительная работа

Основное, что мы будем использовать, — это удалённый доступ к серверу по SSH. Для этого он должен быть включён на самом сервере, и там же можно сразу посмотреть параметры доступа. Например, для работы нашего учебного сервера мы пользуемся услугами SpaceWeb, где доступ по SSH включается из панели управления:

Запускаем Python-скрипт на сервере, чтобы он работал всё время

Запускаем SSH и проверяем, что соединение устанавливается. Чтобы соединиться, нужно написать в терминале команду ssh имя_пользователя@адрес_сервера, после чего нажать Enter. Сервер спросит пароль, и, если мы его правильно ввели, нас пустят.

Запускаем Python-скрипт на сервере, чтобы он работал всё время

Мы видим приветствие сервера, значит, всё прошло хорошо и мы можем управлять им со своего компьютера. Для этого нужно будет писать в терминал команды и реагировать на то, что тебе ответит сервер.

Отправляем скрипт на сервер

Чтобы не захламлять корневую папку на сервере, создадим новую папку bot. Вот эта команда:

mkdir bot

После этого открываем новую командную строку на компьютере, а не на сервере. Для этого нужно запустить ещё одно окно терминала. Там пишем такое:

scp /Users/mihailpolanin/Downloads/bot.py mpolyanin@77.222.61.9:bot

Вот что это означает:

  • scp — копирование файла по SSH;
  • /Users/mihailpolanin/Downloads/bot.py — это путь к нашему скрипту на компьютере. Его замените на то, что будет у вас;
  •  mpolyanin@77.222.61.9 — адрес сервера и логин пользователя. Это тоже замените на ваши данные;
  • : — отделяет сервер от папки;
  • bot — название папки, которую мы только что создали на сервере.

Лайфхак: чтобы не писать вручную пути до файлов на локальном компьютере, можно перед началом ввода пути просто перетащить файл в окно терминала. Терминал поймёт, что вы имели в виду «путь до этого файла», и подставит данные сам. 

После запуска у нас попросят пароль от сервера — вводим его и видим статистику отправки файла:

Запускаем Python-скрипт на сервере, чтобы он работал всё время

Переключаемся обратно в SSH-соединение и проверяем, что файл скопировался и лежит в папке. Для этого вводим две команды: первая перейдёт в эту папку, а вторая покажет её содержимое:

cd bot

ls

Запускаем Python-скрипт на сервере, чтобы он работал всё время

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

Готовим файл для работы службы

Нам нужно, чтобы система сама следила за тем, чтобы скрипт работал всё время и запускался после перезагрузки. В Linux за это отвечают службы — одну из таких служб мы сейчас и сделаем.

Создаём на компьютере новый файл bot.service и вставляем туда такое:

[Unit]
Description=tg-bot
After=multi-user.target

[Service]
User=root
Group=root
Type=simple
Restart=always
ExecStart=/usr/bin/python3 /bot/bot.py

[Install]
WantedBy=multi-user.target

Два самых важных параметра — это путь к нашему скрипту (/bot/bot.py) и название службы: tg-bot. Название может быть любым, а вот путь к скрипту нужно указать точно.

Теперь закидываем этот файл на сервер в папку /usr/lib/systemd/system. Для этого в командной строке компьютера пишем:

scp /Users/mihailpolanin/Downloads/bot.service mpolyanin@77.222.61.9:/usr/lib/systemd/system

Как и раньше, не забудьте заменить адрес до файла .service на вашем компьютере, а также имя пользователя и адрес сервера. Первый адрес можно не писать вручную, а перетащить файл в терминал сразу после набора команды scp.

Запуск службы

Теперь нам нужно перезагрузить все службы, чтобы наш файл тоже попал в общий список для запуска. Открываем SSH-консоль и выполняем там такую команду:

sudo systemctl daemon-reload

И сразу включим наш сервис, чтобы он не отключался при перезагрузке сервера:

sudo systemctl enable bot.service

Всё, можно запускать наш телеграм-бот как службу. Вот основные команды для этого:

  • sudo systemctl start bot.service — запустить службу;
  • sudo systemctl enable bot.service — остановить службу;
  • sudo systemctl enable bot.service — посмотреть статус, работает или нет.

Что дальше

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

Вёрстка:

Кирилл Климентьев

0 / 0 / 0

Регистрация: 24.09.2020

Сообщений: 1

1

Telegram Bot

24.09.2020, 20:46. Показов 15277. Ответов 8


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

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



290 / 130 / 58

Регистрация: 24.11.2019

Сообщений: 532

25.09.2020, 22:23

2

Роман2323, первый способ который приходит в голову. Сделать соответствующий батник.



0



Эксперт Python

5403 / 3827 / 1214

Регистрация: 28.10.2013

Сообщений: 9,554

Записей в блоге: 1

25.09.2020, 23:13

3

Цитата
Сообщение от Miryz
Посмотреть сообщение

первый способ который приходит в голову.

…Правильно написать код бота. С соответствующими проверками ошибок и логикой их обработки.



0



Zanzara75

0 / 0 / 0

Регистрация: 14.03.2018

Сообщений: 4

20.10.2020, 12:49

4

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import telebot
import time
import traceback
 
bot = telebot.TeleBot(token)
 
def telegram_polling():
    try:
        bot.polling()
    except:
        traceback_error_string=traceback.format_exc()
        with open("Error.Log", "a") as myfile:
            myfile.write("rnrn" + time.strftime("%c")+"rn<<ERROR polling>>rn"+ traceback_error_string + "rn<<ERROR polling>>")
        bot.stop_polling()
        time.sleep(10)
        telegram_polling()
 
telegram_polling()

ну логгирование — по желанию ))



0



Эксперт Python

5403 / 3827 / 1214

Регистрация: 28.10.2013

Сообщений: 9,554

Записей в блоге: 1

20.10.2020, 13:30

5

Zanzara75,
1) except перехватывающий любые ошибки писать не нужно.
2) как уже неоднократно писалось ошибки коннекта к серверу возникают не в bot.polling(), поэтому этот try catch не поможет.



0



0 / 0 / 0

Регистрация: 14.03.2018

Сообщений: 4

20.10.2020, 14:43

6

ну спорить не буду…
только — у меня это работает )))

ну и надо сказать, что поллинг на aiogram при пропадании инета не крашится вусмерть, а отлично продолжает работать после появления… ну а для телебота — бот ругается после выключения сетевой карты, а потом продолжает работать, как ни в чем не бывало



0



Эксперт Python

5403 / 3827 / 1214

Регистрация: 28.10.2013

Сообщений: 9,554

Записей в блоге: 1

20.10.2020, 17:54

7

Цитата
Сообщение от Zanzara75
Посмотреть сообщение

только — у меня это работает

на telebot’е краш происходит при попытке отправить сообщение, когда бот проработал несколько часов. Сервер telegram время от времени закрывает свой конец подключения и telebot не умеет это обрабатывать.
Другие более современные либы, я так понимаю, умеют (я ими пока не пользовался).



0



0 / 0 / 0

Регистрация: 09.11.2020

Сообщений: 1

11.11.2020, 19:21

8

на telebot’е краш происходит при попытке отправить сообщение, когда бот проработал несколько часов. Сервер telegram время от времени закрывает свой конец подключения и telebot не умеет это обрабатывать.

Укажите, пожалуйста, куда копать, чтобы ловить эти исключения



0



Эксперт Python

5403 / 3827 / 1214

Регистрация: 28.10.2013

Сообщений: 9,554

Записей в блоге: 1

12.11.2020, 19:39

9

Цитата
Сообщение от panohin
Посмотреть сообщение

куда копать,

Открыть исходники telebot и понять как это все работает.
Или забить и пользоваться более новыми либами.



0



Вы можете запустить на сервере бот, написанный на Python или любом другом языке программирования. Чтобы обеспечить постоянную и надежную работу скрипта, потребуется настроить автозапуск и перезагрузку. 

Подготовка

Загрузите файлы бота, например, в директорию  /home/me и создадайте виртуальное окружение:

python3 -m venv venv

Активируйте его:

source ./venv/bin/activate

Далее установите все пакеты:

pip install -r requirements.txt

Если файл requirements.txt со списком пакетов отсутствует, установите все расширения вручную.

Screen — самый простой метод

Для простого запуска скрипта в фоне можно воспользоваться утилитой screen, которая позволяет создавать неограниченое количество сессий в терминале.

Ее необходимо установить из репозитория:

sudo apt install screen

Запустите новое окно командой:

screen

Активируйте виртуальное окружение и запустите бота:

source ./venv/bin/activate 
python main.py

Осталось свернуть сессию. Для этого необходимо зажать сочетание клавиш Ctrl + A, после чего нажать D.

Список основных команд:

  • screen — запуск новой сессии;
  • screen -ls — просмотр всех сессий;
  • screen -r <socket_name> — открыть конкретную сессию (если сессия всего одна, то имя можно не указывать).

В сессии:

  • Ctrl + A + D — свернуть сессию;
  • Ctrl + A + K — завершить сессию.

Это простой метод, который не требует создания конфигурационных файлов. Однако если сервер будет перезагружен или во время работы скрипта возникнет ошибка, бот будет нужно запустить заново.

Systemd

Рассмотрим запуск приложения в роли службы. Systemd — это менеджер системы и служб Linux. Он управляет службами, которые описаны в конфигурационных файлах, и запускает их.

Создайте новый юнит systemd:

sudo nano /lib/systemd/system/bot.service

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

[Unit]
Description=Timeweb Bot Service
After=network.target

[Service]
Type=idle
Restart=always
RestartSec=3
User=root
WorkingDirectory=home/me/bot
ExecStart=/home/me/bot/venv/bin/python /home/me/bot/main.py

[Install]
WantedBy=multi-user.target

где:

  • Description — название службы,
  • ExecStart — путь до интерпретатора Python и скрипта,
  • User — пользователь, от которого будет запущена служба,
  • Restart=always — указание, что необходимо перезапустить бота после ошибки.

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

sudo systemctl daemon-reload 
sudo systemctl enable bot.service
sudo systemctl start bot.service

Теперь проверьте работу бота. Если бот не отвечает, попробуйте запустить его в терминале и посмотреть, нет ли ошибок

PM2

Еще один способ запустить бота — использовать менеджер процессов PM2. О нем мы подробнее писали в Community. PM2 автоматически перезапускает бота и сохраняет логи.

Установите следующие пакеты:

sudo apt install nodejs
sudo apt install npm

Далее установите PM2:

npm install pm2 -g

Для запуска бота перейдите в директорию с ботом и запустите его командой:

pm2 start main.py --interpreter=python3

В предыдущей статье мы  рассказали, как создать простого бота на Node.js, однако он работал только на локальном компьютере. Эта статья о том, как загрузить бота на сервер, запустить его и проверить, что всё работает.

Шаг 1. Выбрать хостинг

Как правило, на shared-хостинге отсутствует поддержка Node.js, поэтому нам понадобится как минимум виртуальный сервер. Существуют сервисы, предлагающие VPS бесплатно, но с заметными ограничениями: например на количество трафика или нагрузку на сервер. Можно выделить несколько известных зарубежных провайдеров (но стоит отметить, что для новичков они могут оказаться сложными):

  • Google Cloud
  • Oracle Cloud
  • Amazon Web Services

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

Для примера мы закажем облачный VPS в REG.RU, вы можете воспользоваться любым VPS-хостингом. Он удобен для тестового проекта тем, что оплата почасовая. При выборе тарифа мы рекомендуем ориентироваться на несколько параметров:

  1. Прогнозируемая нагрузка — зависит от сложности вашего бота и количества запросов к нему.
  2. Количество оперативной памяти — это зависит от многих факторов, как, например, уровень оптимизации кода и общий масштаб вашего проекта.

Так как наш бот использует только одну основную библиотеку и состоит из нескольких строк кода, мы выбираем самый младший тариф — Cloud-0. В будущем, если возникнет необходимость, можно перейти на более дорогой тариф.

Шаг 2. Заказать хостинг

Переходим по ссылке: https://www.reg.ru/vps/cloud/, выбираем тариф, операционную систему и шаблон «Чистая ОС». Если у вас нет особых предпочтений, рекомендуем выбрать Ubuntu 18.04. Хотя у REG.RU есть шаблон c Node.js, для чистоты эксперимента всё необходимое ПО мы установим сами. Нажимаем кнопку «Заказать»:

Заказ VPS сервера

После заказа и оплаты дождёмся настройки сервера:

Настройка сервера

В течение минуты статус сервера сменится с «В процессе» на «Активен». После этого отобразятся реквизиты доступа к серверу, они также будут отправлены на почту:

Реквизиты доступа к серверу

Шаг 3. Загрузить бота

Приступим к загрузке бота на сервер. Это можно сделать разными способами — с помощью FTP, SFTP, панели управления или, к примеру, rsync. Мы выберем самый быстрый вариант — SFTP, так как для него нужна только возможность подключения к серверу по SSH, которая обычно присутствует на всех VPS сразу после заказа.

Мы подключимся к серверу с помощью FileZilla. Укажем IP-адрес сервера, а также логин root и пароль в настройках клиента:

Настройки клиента

При первом подключении появится окно с предупреждением:

Окно с предупреждением

Ставим галочку «Всегда доверять этому хосту» и нажимаем «Ок».

Переходим на директорию выше (...), затем в каталог /opt и создаём папку с произвольным названием (мы выбрали keksbot):

Директория проекта

Переходим в созданную папку и загружаем файлы index.js и package.json:

Папки с проектом на компьютере и на хостинге

Шаг 4. Зайти на сервер по SSH

Теперь нужно подключиться к серверу по SSH, чтобы установить Node.js и запустить бота. Для этого необходим SSH-клиент, например Putty, XShell, Bitvise SSH или любой другой. Функциональность программ может немного отличаться, но большой разницы в использовании между ними нет. Мы выбрали PuTTY как самый популярный и бесплатный SSH-клиент для Windows.

Открываем PuTTY, указываем IP-адрес сервера, порт 22 уже указан по умолчанию:

Базовые настройки PuTTY

Нажимаем «Соединиться». Откроется окно с запросом логина:

Окно с запросом логина

Вводим root, после чего появится запрос пароля, при вводе которого символы не отображаются. Не стоит переживать, это особенность работы Linux — пароль нужно вводить вслепую. Чтобы не делать этого вручную, можно скопировать пароль и нажать правой кнопкой мыши в окне PuTTY. Убедитесь, что вы скопировали пароль без пробелов!

Шаг 5. Установить Node.js

Теперь займёмся установкой. Обратите внимание, что команды для установки Node.js отличаются в зависимости от операционной системы. В наших примерах указаны команды для Ubuntu, Debian и CentOS — мы будем вводить их в консоли SSH-клиента.

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

cat /etc/os-release

Вывод будет примерно таким:

NAME="Ubuntu"
VERSION="16.04.6 LTS (Xenial Xerus)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 16.04.6 LTS"
VERSION_ID="16.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
VERSION_CODENAME=xenial
UBUNTU_CODENAME=xenial

Нас интересует поле NAME, в котором указано название дистрибутива.

Помимо Node.js нам понадобится утилита Screen, чтобы бот продолжал работать, когда мы отключимся от сервера. Также нужен менеджер пакетов npm для установки зависимостей.

Запустим команду:

  • для Ubuntu/Debian

    apt -y install nodejs npm screen
  • для CentOS

    yum -y install nodejs npm screen

Подождём завершения установки и проверим, что Node.js работает:

nodejs -v

Если в ответе отобразилась версия установленного пакета, то всё прошло успешно.

Теперь перейдём в папку с файлом бота и установим зависимости:

cd /opt/keksbot
npm install

Возможные ошибки при установке, и как их решить

При установке могут появиться ошибки вида:

Existing lock /var/run/yum.pid: another copy is running as pid 9571.
Another app is currently holding the yum lock; waiting for it to exit...

или:

E: Could not get lock /var/lib/dpkg/lock – open (11: Resource temporarily unavailable)
E: Unable to lock the administration directory (/var/lib/dpkg/), is another process using it?

Обычно это связано с тем, что у пользователя недостаточно прав для установки пакетов на сервере, либо предыдущий процесс установки завершён некорректно.

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

Во втором случае для решения проблемы нужно завершить процесс менеджера пакетов и удалить lock-файлы. Чтобы это сделать, запустите команды:

  • для Ubuntu/Debian

    ps aux | grep ‘apt|apt-get’ | awk ‘{print $2}’ | xargs kill -9
    rm -f /var/cache/apt/archives/lock
    rm -f /var/lib/dpkg/lock
    rm -rf /var/lib/dpkg/lock-frontend
    
  • для CentOS

    ps aux | grep ‘yum’ | awk ‘{print $2}’ | xargs kill -9
    rm -f /var/cache/apt/archives/lock
    rm -f /var/lib/dpkg/lock
    

После этого попробуйте заново запустить установку.

Шаг 6. Запустить и проверить бота

Пришло время запустить бота. Для начала запустим утилиту Screen простой командой:

screen

Перейдём в каталог с файлом бота:

cd /opt/keksbot

Установим зависимости:

npm install

После этого можем запустить бота:

nodejs index.js

Заходим в Telegram, проверяем бота:

Проверка работы бота

Отлично! Всё работает.

Теперь можно отключиться от сервера и закрыть окно PuTTY, бот продолжит работу.

Шаг 7. Обеспечить автоматический перезапуск бота

Из-за ошибок в коде бот может «упасть» в самый неожиданный момент. Чтобы этого не случилось, настроим автозапуск бота при старте сервера и его автоматический перезапуск при ошибках.

Это позволит боту стабильно работать даже в случае обнаружения багов. Вы сможете оперативно их исправить, а бот в это время продолжит отвечать на запросы.

Большинство современных Linux-систем используют systemd для управления службами, поэтому следующая инструкция подойдёт для последних версий Ubuntu, Debian и CentOS.

Для начала отключим бота командой:

killall node

Нам понадобится создать собственную службу, для этого в каталоге /lib/systemd/system создадим файл:

имя_бота.service

В нашем случае это будет файл /lib/systemd/system/keksbot.service. В файл поместим следующий код:

[Unit]
Description=Keksbot - Telegram bot
After=network.target

[Service]
ExecStart=/usr/bin/node index.js
ExecReload=/usr/bin/node index.js
WorkingDirectory=/opt/keksbot/
KillMode=process
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

Текст в некоторых строках необходимо отредактировать относительно вашего проекта. Разберём строки, на которые нужно обратить внимание.

В поле Description указывается описание службы. Вы можете указать в ней краткую информацию о боте.

Description=Keksbot - Telegram bot

Команда для запуска бота.

ExecStart=/usr/bin/node index.js
ExecReload=/usr/bin/node index.js

Её следует поменять, если имя скрипта вашего бота отличается от index.js. В таком случае нужно будет указать следующие значения:

ExecStart=/usr/bin/node имя_файла.js
ExecReload=/usr/bin/node имя_файла.js

Папка со скриптом, который мы запускаем. В нашем случае это /opt/keksbot/.

WorkingDirectory=/opt/keksbot/

Сохраняем файл. В примерах далее мы будем использовать имя службы keksbot — если вы указали другое имя, не забудьте поменять его. Для установки службы воспользуемся командами:

systemctl enable keksbot

Теперь запустим бота командой:

systemctl start keksbot

Готово. Теперь бот будет автоматически запускаться при старте сервера или при возникновении ошибок. Можно проверить это, завершив процесс node:

killall node

Через пять секунд бот автоматически перезапустится.

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

  • Остановка

    systemctl stop keksbot
  • Перезапуск

    systemctl restart keksbot
  • Проверка состояния бота

    systemctl status keksbot

Ещё о создании бота:

  • Как написать Телеграм-бота на JavaScript
  • Как настроить работу Телеграм-бота с Google Sheets

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

Телеграм бот

#main.py
import telebot

bot = telebot.TeleBot("ТОКЕН")

@bot.message_handler(func=lambda message: message.text.lower() in ['привет', 'здравствуйте'])
def send_welcome(message):
    bot.reply_to(message, "Здравствуйте!")

@bot.message_handler(func=lambda message: True)
def echo_all(message):
    bot.reply_to(message, 'Я тебя не понимаю(')

bot.infinity_polling()

Виртуальный сервер

Для демонстрации я буду использовать виртуальный сервер от Beget стоимостью 210
рублей в месяц. Вы можете использовать другого хостинг провайдера, или выбрать другую конфигурацию, в зависимости от вашего проекта.

Как запустить Python Telegram бота на VPS

Подключение к виртуальной машине

После того как вы создали VPS у вас откроется панель управления, где вы можете скопировать IP адрес машины и подключаться к ней по SSH.

Как запустить Python Telegram бота на VPS

Для этого можно использовать программу PuTTY или клиент OpenSSH, который входит в состав Windows 10. Для подключения по SSH выполните следующую команду:

ssh root@213.139.209.81

И введите пароль который вы указали при создании VPS.

Подготовка сервера

После того как вы подключились к серверу, выполните команды которые обновят списки, и устаревшие пакеты до последней версии.

sudo apt update
sudo apt upgrade

Загрузка и запуск бота

Перейдите в каталог home и создайте папку для вашего проекта выполнив команды.

cd /home
mkdir ramziv_bot
cd ramziv_bot

Зайдите панель управления VPS и откройте Файловый менеджер.

Как запустить Python Telegram бота на VPS

Загрузите файлы вашего проекта на сервер, в моем случаи это только один файл main.py.

Как запустить Python Telegram бота на VPS

Установите зависимости вашего проекта, и запустите бота.

Примечание: Ubuntu 20.04 поставляется с установленной Python 3.8 из коробки, если для вашего проекта нужна другая версия, установите ее или используйте другую версию дистрибутива.

pip install pyTelegramBotAPI
python3 main.py 

Теперь перейдите в Телеграм и протестируйте работу.

Как запустить Python Telegram бота на VPS

Работает.

Авто запуск и перезапуск телеграм бота

Создайте systemd службу для бота.

sudo nano /lib/systemd/system/ramziv_bot.service

С конфигурацией:

[Unit]
Description=Ramziv - Telegram Bot
After=syslog.target
After=network.target

[Service]
Type=simple
WorkingDirectory=/home/ramziv_bot/
ExecStart=/usr/bin/python3 /home/ramziv_bot/main.py
RestartSec=60
Restart=always

[Install]
WantedBy=multi-user.target

Нажмите CTRL+S и CTRL+X что бы сохранить и выйти.

Выполните эти две команды что бы запустить службу.

sudo systemctl enable ramziv_bot
sudo systemctl start ramziv_bot

Ваш бот запушен. Перейдите в Телеграм и убедитесь в этом.

Заключение

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

sudo journalctl -u ramziv_bot.service

#Вывод
#Jun 13 12:35:31 objmnuqxoa python3[1069]:   File "/home/ramziv_bot/main.py", line 7, in send_welcome
#Jun 13 12:35:31 objmnuqxoa python3[1069]:     number = 1/0
#Jun 13 12:35:31 objmnuqxoa python3[1069]: ZeroDivisionError: division by zero

Официальный мануал не объясняет, как пользоваться ботом в «Телеграме». При отправке сообщений нередки сбои, кнопочное управление отключается. Перезапуск аккаунта поможет решить проблему при наличии инструкции. В случае со скрытым меню выявить возможные ошибки на API-сервере получится не сразу.

Чтобы узнать, работает ли робот, потребуется ввести специальную команду. Поскольку многие пользователи не знают о функциях роботов, опишу их особенности и возможности.

Содержание

  1. Для чего нужны боты в «Телеграме»
  2. Принцип работы ботов в ТГ
  3. Настройка бота в «Телеграме»
  4. На компьютере
  5. На смартфоне
  6. Как пользоваться ботами в «Телеграме»
  7. С готовым меню
  8. Скрытое меню
  9. Универсальные команды
  10. Дополнительные команды
  11. Перезапуск бота
  12. Обзор

Для чего нужны боты в «Телеграме»

Программы помогают пользователям массово отвечать на сообщения подписчиков, что упрощает взаимодействие с аудиторией. У роботов множество предназначений.

С их помощью делают рассылки, продают товары, проводят тренинги, принимают оплату и пр.

Роботов настраивают под любые задачи. Протокол отвечает за «апдейты» с сервером, HTTP-соединение с сайтами.

Предназначение роботов:

  1. Шаблонные ответы.
  2. Управление чатами в группах; фильтр спама, флуда.
  3. Комментирование ответов.
  4. Поиск информации в интернете.
  5. Загрузка файлов, ссылок, текстов.
  6. Показ данных онлайн (расписания, меню и т.д.).
  7. Предоставление услуг, реклама.
  8. Уведомление о действиях, событиях.
  9. Развлечения, игры.
  10. Общение, знакомства.

Функциональных ботов пишут на «Питоне» и других языках программирования с разметкой HTML. Однако это не значит, что новичок не справится с созданием простого робота. Сервисный API-Bot, с помощью которого программируют роботов, дополнен пошаговой инструкцией «Телеграма».

На настройки уходит не более 1 часа. Достаточно продумать текст и порядок диалога, задать кнопки управления.

Ввиду шаблонных ответов текстом дополнить меню получится только статичной информацией: подборками, списками, ссылками, медиафайлами, опросами. Этого достаточно, чтобы показать ассортимент витрины, провести исследование, поделиться знаниями или разослать письма подписчикам.

Бот в действии

Принцип работы ботов в ТГ

Робот представляет собой аккаунт, взаимодействие с которым инициирует собеседник. Для этого используются встроенные команды и кнопки. Диалог выстраивается по системе «вопрос – ответ».

Принципы работы – последовательность, логичность и точность. Любой программе нужен алгоритм. Однако в случае с ботами цепочка операций должна быть понятна не только разработчику, но и пользователю.

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

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

Настройка бота в «Телеграме»

Создание программы доступно прямо в мессенджере с помощью официального робота BotFather, который регистрирует аккаунт и выдает ключ для модерации.

На компьютере

Чтобы настроить робота, авторизуйтесь по номеру, привязанному к аккаунту (сообщества).

Инструкция:

  1. Запустите @BotFather.
  2. Задайте имя на латинице с окончанием bot.
  3. Сохраните API-токен для управления ботом.
  4. Заполните профиль (описание, аватарку).
  5. Задайте команды и кнопки меню.
  6. Активируйте робота в чате (при необходимости).

Создание

На смартфоне

Порядок действий на телефоне аналогичный. Новичкам рекомендую выполнять настройки с ПК. Инструкцию удобно читать на большом экране.

Как пользоваться ботами в «Телеграме»

Диалогом управляют с помощью статичного меню с кнопками. Отдельные действия, такие как запуск робота, вызов справки и другие стандартные команды, доступны в строке ввода. Для отправки запроса в поле диалога записывают знак «слеша» и действие на латинице без пробела.

С готовым меню

Боты с клавиатурой используются для быстрого отображения ответа по нажатию кнопки. Интерфейс со статичным меню создают для доступа к «горячим» кнопкам, различного рода переходам. Инструмент пригодится для тематических подборок, блоков с контактной и платежной информацией.

Инструкция:

  1. Запустите диалог со «Старта».
  2. На панели тапните по кнопке с действием.
  3. Просмотрите информацию.
  4. Продолжите беседу, нажав другую кнопку.

Кнопочное меню упрощает взаимодействие с аккаунтом. Пользователю не приходится запоминать ветку диалога или перезагружать робота. Все активные запросы уже отображены на экране. Остается выбрать действие и перезапустить чат после очистки переписки.

С готовым меню

Скрытое меню

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

Список ответов зависит от специализации робота. Не все боты работают по стандартным алгоритмам ТГ.

Часть скрытых кнопок представлена универсальными ссылками /start, /help и т.д. Другие действия настраиваются выборочно – Search, Info, Account, Referals и др. Если список переходов обширный, для быстрого поиска после слеша записывают первую букву кнопки.

Скрытое меню

Универсальные команды

Базовые кнопки для взаимодействия с интерфейсом разработаны ТГ:

  1. /help – показать инструкцию.
  2. /settings – настроить аккаунт, добавить данные.
  3. /info – вывести справку с информацией о боте.
  4. /off – удалить историю.

Универсальные команды

Дополнительные команды

Чтобы управлять ботом, используют команды из документации встроенного API-BotFather. Действия доступны разработчикам программ.

Перезапуск бота

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

Новички не знают, как пользоваться ботом в «Телеграме», если сервис не отвечает. Отправьте запрос в сообщении при отсутствии меню. Если аккаунт нерабочий, удалите чат, очистив историю.

Обзор


22

ответов

ну бот в разработке, чтоб он новые функции загрузил.

я не пробовал, но можно попробовать через subprocess наверн


Mars BATYA [NYА]

я не пробовал, но можно попробовать через subproce…

но имхо, можно подойти к этому с умом и юзать либу importlib, чтобы перезагружать не всего бота, а только измененный файл


Mars BATYA [NYА]

но имхо, можно подойти к этому с умом и юзать либу…

ну вообще умные люди уже придумали модули для перезагрузки проекта


Mars BATYA [NYА]

но имхо, можно подойти к этому с умом и юзать либу…

Ужасно, это не прокатит в 99% случаев


Aleksandr Danilov

gitlab, иди ты нахуй

он из коробки умеет измененный файл в запущенном боте перезагружать?

Я заметил что многие путают использование мата с токсичностью.

Это пиздец как грустно


Aleksandr Danilov

Я заметил что многие путают использование мата с т…

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


Denis 🐍|👑 🐳 | honey..?

я не о том, друг
это не токсичность в чистом виде,…

вот это куда точнее, и с этим я вполне согласен.

Речь не то что бы грубее конечно, скорее эмоциональнее, плюс моя манера написания


Aleksandr Danilov

вот это куда точнее, и с этим я вполне согласен.

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


Denis 🐍|👑 🐳 | honey..?

со стороны (учитывая то что ты не выражаешь радост…

Это называется домыслом, и это порой хуёво.


🅸🄶🄾🅁 🆃🄾🄻🅂🅃🄾🅅

По каким словам гуглить ?

Если речь идёт про перезапуск при редактировании во время разработки бота то наверное что-то такое подойдёт

https://github.com/gorakhargosh/watchdog

Или посмотреть как в ювикорне сделано

https://github.com/encode/uvicorn/blob/master/uvicorn/supervisors/watchgodreload.py

зачем тогда придумали реакции?


Макс 🇺🇦 🇺🇦

зачем тогда придумали реакции?

лучше уж пусть плюсанет, словлю меншн и чекну, чем будет висеть это ссаное сердечко в списке чатов


Макс 🇺🇦 🇺🇦

зачем тогда придумали реакции?

У меня клиент без реакций

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

А вот еще интересные материалы:

  • Яшка сломя голову остановился исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного где ошибка
  • Перезагрузите чтобы устранить ошибки диска перезагрузка не помогает
  • Переводческие ошибки ложные друзья переводчика