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 адресу в браузере.
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
Спасибо за подсказку этой статье