September 24, 2021

Telegram bot своими руками

Регистрируем бота у @BotFather. Там всё очень просто. Главное получить токен. Он пригодиться нам дальше.

123456789:AbCdEfghijklmnopqrstuvwxyzz

Для размещения бота я рекомендую использовать DigitalOcean (по ссылке получите от меня бонусом 10$ на счет. А если вы еще и студент, можете получить 50$ на счет бесплатно.)

Для наших целей вполне подойдет самый простой тариф(Лучше берите 32 разрядную 14 ubuntu. Выше может не потянуть) Город расположения не очень важен. Можете проверить пинг тут.
Вот впринципе и всё. На почту нам пришлют наш новый ip и root пароль для подключения по SSH. Я использую приложение Putty. Для переноса файлов нужно подключение по sFTP. Можно использовать Filezilla.

Для работы нашего бота нужно создать нового пользователя.

adduser testbot # Добавляем пользователя. Вводим данные, которые нас запросит системаsudo usermod -aG sudo testbot # Даем юзеру возможность исполнять команды от имени админа

Заходим на сервер под новым пользователем.

sudo apt update #Обновляем репозиторииsudo apt install python-pip python-dev nginxsudo service nginx start

Чтобы проверить работоспособность просто перейдите по ip адресу в браузере.

Выключаем nginx

sudo service nginx stop

Для каждого нашего проекта нужно создать своё виртуальное окружение с помощью virtualenv

sudo pip3 install virtualenv

Создаём новую папку для нашего проекта

mkdir TestBot cd TestBot virtualenv testbot source testbot/bin/activate pip install uwsgi flask

Создаём тело бота:

============# file: testbot.py====================================from flask import Flask # Импортируем модулиapp = Flask(__name__) # Создаем приложение@app.route(«/123456789:AbCdEfghijklmnopqrstuvwxyzz«) # Говорим Flask, что за этот адрес отвечает эта функция
def hello_world():
[press tab] return «It’s working»
============================================================

Напишем скрипт, который будет запускать наше Flask приложение.

============# file: wsgi.py====================================from csbot import app # Импортируем наше приложениеif __name__ == «__main__»:
[press tab] app.run() # запускаем его
============================================================

Создаем инициализационный файл в папке с ботом. Конфиг задает количество процессов, имя сокета, права и файл для логирования.

============# file: testbot.ini====================================
[uwsgi]module = wsgi:app
master = true
processes = 5
socket = testbot.sock
chmod-socket = 660
vacuum = true
die-on-term = true
logto = /var/log/uwsgi-testbot/%n.log
touch-reload = /home/testbot/TestBot/testbot
============================================================

Нам нужно где-то хранить логи. Создаем папку для этого:

mkdir /var/log/uwsgi-testbot
sudo chown -R testbot:testbot /var/log/uwsgi-testbot

Создаем так же systemd unit файл, для атвоматизации запуска нашего бота.

sudo nano /etc/systemd/system/testbot.service
============# file: testbot.service====================================
[Unit]Description=Serving our testbot
After=network.target
[Service]
Restart=always
User=testbot
Group=www-data
WorkingDirectory=/home/testbot/TestBot
Environment=»PATH=/home/testbot/TestBot/testbot/bin»
ExecStart=/home/testbot/TestBot/testbot/bin/uwsgi —ini testbot.ini
[Install]
WantedBy=multi-user.target
==================================================================

Запускаем команду для создания сокет файлов для запуска.

sudo systemctl enable testbot
sudo systemctl start testbot

Да, и не забудьте, что телеграм работает только по защищенному соединению, поэтому еужно использовать https:// хотябы с самоподписным сертификатом

cd /etc/ssl/ sudo openssl genrsa -des3 -passout pass:x -out server.pass.key 2048 sudo openssl rsa -passin pass:x -in server.pass.key -out server.key rm server.pass.key sudo openssl req -new -key server.key -out server.csr 

В Common Name (FQDN) следует указать ip нашего сервера. Следом сгенерируем сами файлы нашего сертификата и поместим их в папку etc/ssl/

sudo openssl x509 -req -sha256 -days 365 -in server.csr -signkey server.key -out server.crt

Теперь нужно настроить наш Nginx, чтобы запросы посланные телеграмом по нашем адресу https://домен.ру/123456789:AbCdEfghijklmnopqrstuvwxyzz отправлялись на сокеты к нашему боту /home/testbot/TestBot/testbot.sock. Для этого откроем для редактирования:

sudo nano /etc/nginx/sites-available/testbot
и поместим в него:
server { listen 443 default ssl; server_name ваш_ип; keepalive_timeout 60; ssl_certificate /etc/ssl/server.crt; ssl_certificate_key /etc/ssl/server.key; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers "HIGH:!RC4:!aNULL:!MD5:!kEDH"; add_header Strict-Transport-Security 'max-age=604800'; access_log /var/log/nginx_access.log; error_log /var/log/ngingx_error.log;location /123456789:AbCdEfghijklmnopqrstuvwxyzz {
include uwsgi_params;
uwsgi_pass unix:/home/testbot/TestBot/testbot.sock;
}
location /123456789:AbCdEfghijklmnopqrstuvwxyzz/HOOK {
include uwsgi_params;
uwsgi_pass unix:/home/testbot/TestBot/testbot.sock;
}
location /123456789:AbCdEfghijklmnopqrstuvwxyzz/set_webhook {
include uwsgi_params;
uwsgi_pass unix:/home/testbot/TestBot/testbot.sock;}

Проверяем настройки и перезапускаем:

sudo nginx -t sudo service nginx restart

Установим библиотеку телеграм для питона.

sudo pip install python-telegram-bot

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

sudo service csbot restart

Спасибо за подсказку этой статье