Рассмотрим пример создание, установки зависимостей и запуска небольшого чат бота для выполнения произвольных команд на linux сервере и отображения этой информации в чате.
Необходимо создать бота, создание бота описано в данной статье.
Для получени персонального ID можно использовать к примеру данные бот @userinfobot
Для использования бота нам понадобится на сервере python3 а также бибилиотека pip3 python-telegram-bot, онако данный пример основан на старой версии, поэтому при установке необходимо указать версию бибилиотеки, если python3 уже установлен.
1 2 |
# python3 --version Python 3.6.8 |
и в таком случаи установим пакет
1 |
pip3 install python-telegram-bot==12 --upgrade |
Скачаем архив c ботом и распакуем его на сервере bot.tar
1 |
wget http://blog.mailon.com.ua/wp-content/uploads/2020/11/bot.tar.gz |
В архиве 4 файла
1 2 3 4 5 |
. ├── bot.py ├── bot.sh ├── config.py └── curl.sh |
bot.py — основной файл бота.
bot.sh — используется для запуска бота через systemd.
config.py — файл конфигурации бота.
curl.sh — файл пример произвольного скрипта.
Рассмотри каждый файл.
В файле curl.sh указан наш произвольный скрипт, который в результате выполнения вернет нам IP текущего сервера на котором работает бот.
1 2 |
#!/bin/bash curl ifconfig.io |
В файле config.py мы указываем API token полученный на этапе создания бота, а также массив или единичное указание ID пользователей, с которыми боть будет общатся и которые считаются доверенными.
1 2 |
token = '' # token бота полученный у BotFather admin = ['88888888','11111111'] # пользоватльские ID телеграма которым разрешен доступ к функции баланса. |
Файл bot.sh содержит строку запуска бота с полным путем.
1 2 |
#!/bin/bash python3.6 /opt/bot/bot.py |
Основной файл bot.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
#!/usr/bin/python import config import telegram import os import subprocess import sys import shlex import datetime from subprocess import Popen, PIPE from telegram.ext import CommandHandler from imp import reload from telegram.ext import Updater updater = Updater(token=config.token) dispatcher = updater.dispatcher def run_command(command): process = subprocess.Popen(shlex.split(command), stdout=subprocess.PIPE) global textoutput textoutput = '' while True: global output output = process.stdout.readline() output = output.decode('utf8') if output == '' and process.poll() is not None: break if output: print (output.strip()) textoutput = textoutput + '\n' + output.strip() rc = process.poll() return rc def start(bot, update): bot.sendMessage(chat_id=update.message.chat_id, text="Добрый день!") def help(bot, update): reload(config) bot.sendMessage(chat_id=update.message.chat_id, text='''список доступных команд: /id - id пользователя /curlsh - состояние счета ''') def myid(bot, update): userid = update.message.from_user.id bot.sendMessage(chat_id=update.message.chat_id, text=userid) def curlsh(bot, update): reload(config) user = str(update.message.from_user.id) if user in config.admin: run_command("curlsh") bot.sendMessage(chat_id=update.message.chat_id, text=textoutput) start_handler = CommandHandler('start', start) dispatcher.add_handler(start_handler) curlsh_handler = CommandHandler('curlsh', curlsh) dispatcher.add_handler(curlsh_handler) myid_handler = CommandHandler('id', myid) dispatcher.add_handler(myid_handler) help_handler = CommandHandler('help', help) dispatcher.add_handler(help_handler) updater.start_polling() |
Выполнение нашей произвольной команды состоит из функции и handler
1 2 3 4 5 6 |
def curlsh(bot, update): reload(config) user = str(update.message.from_user.id) if user in config.admin: run_command("curlsh") bot.sendMessage(chat_id=update.message.chat_id, text=textoutput) |
Тут мы проверяем находится ли ID пользователя в массиве admin и если да, тогда выполняем кломанду curlsh в консоли на сервере.
Создадим ссылку на наш произвольный скрипт в системе, чтобы команда curlsh стала реальной.
1 |
ln -s /opt/bot/curl.sh /usr/sbin/curlsh |
И нам остается создать service файл и запустить бота.
1 2 3 |
touch /etc/systemd/system/telegram-bot.service chmod 664 /etc/systemd/system/telegram-bot.service nano /etc/systemd/system/telegram-bot.service |
И содержимое файла, в нем указываем путь к скрипту bot.sh
1 2 3 4 5 6 7 |
[Unit] Description=Telegram bot After=network.target [Service] ExecStart=/opt/bot/bot.sh [Install] WantedBy=multi-user.target |
1 2 3 4 |
systemctl daemon-reload systemctl enable telegram-bot.service systemctl start telegram-bot.service systemctl status telegram-bot.service |
За основу взята данная статья https://winitpro.ru/index.php/2020/01/23/telegram-bot-dlya-linux-servera/
Можно ли как-то сделать, чтобы бот запускал на компьютере smplayer+полученную в сообщении ссылку (если в сообщении содержится ссылка на ютуб)?
Бот вызывает скрипт, а какая логика заложена в скрипте — это только ваша фантазия.