Задача: ПоднятьTelegram
бота ответственного за выполнение команд (Linux & Windows
)
Заняться данной задачей меня надоумили различные статьи, посвященные созданию ботов, через которые можно настроить взаимодействие с Windows & Linux
системами, т.к. может не быть удаленного доступа до объекта, а определенно что-то нужно выполнить в части администрирования ну или еще каких-либо мероприятий.
Мой бот ну или малая его часть будет оформлена как скрипт, который запускается на Ubuntu 18.04 Server
в моей локальной сети. Так как я проживаю в России, но на нас действует политика Роскомнадзора в виде блокировки работы Telegram
на территории Российской Федерации. Но это не проблема, к примеру у меня дома мой провайдер блокирует работу Telegram
клиента, выручает опубликованная заметка «Настройка 3proxy + TOR для работы Telegram»
Данная заметка от 12.11.2019 10:48
ekzorchik@srv-bionic:~$ hg clone --insecure https://ekzorchik@172.35.35.8/hg/dproject ekzorchik@srv-bionic:~$ sudo ./dproject/default ekzorchik@srv-bionic:~$ uname -a && lsb_release -a Linux srv-bionic 4.15.0-66-generic #75-Ubuntu SMP Tue Oct 1 05:24:09 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 18.04.3 LTS Release: 18.04 Codename: bionic ekzorchik@srv-bionic:~$ ekzorchik@srv-bionic:~$ sudo apt-get install python3-pip build-essential libssl-dev libffi-dev python3-dev curl python3-venv ipython3 python3-testresources -y ekzorchik@srv-bionic:~$ wget https://bootstrap.pypa.io/get-pip.py ekzorchik@srv-bionic:~$ sudo python3 get-pip.py ekzorchik@srv-bionic:~$ sudo pip install virtualenv virtualenvwrapper ekzorchik@srv-bionic:~$ sudo chown -R ekzorchik:ekzorchik /home/ekzorchik/ ekzorchik@srv-bionic:~$ rm -rf ~/get-pip.py ~/.cache/pip ekzorchik@srv-bionic:~$ nano ~/.bashrc #добавляю в конец данного файла ниже указанные три строки export WORKON_HOME=$HOME/.virtualenvs export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3 source /usr/local/bin/virtualenvwrapper.sh ekzorchik@srv-bionic:~$ source ~/.bashrc ekzorchik@srv-bionic:~$ mkvirtualenv bot -p python3 Already using interpreter /usr/bin/python3 Using base prefix '/usr' New python executable in /home/ekzorchik/.virtualenvs/bot/bin/python3 Also creating executable in /home/ekzorchik/.virtualenvs/bot/bin/python Installing setuptools, pip, wheel... done. virtualenvwrapper.user_scripts creating /home/ekzorchik/.virtualenvs/bot/bin/predeactivate virtualenvwrapper.user_scripts creating /home/ekzorchik/.virtualenvs/bot/bin/postdeactivate virtualenvwrapper.user_scripts creating /home/ekzorchik/.virtualenvs/bot/bin/preactivate virtualenvwrapper.user_scripts creating /home/ekzorchik/.virtualenvs/bot/bin/postactivate virtualenvwrapper.user_scripts creating /home/ekzorchik/.virtualenvs/bot/bin/get_env_details (bot) ekzorchik@srv-bionic:~$ (bot) ekzorchik@srv-bionic:~$ mkdir -p project/bot (bot) ekzorchik@srv-bionic:~$ cd project/bot/ (bot) ekzorchik@srv-bionic:~/project/bot$ (bot) ekzorchik@srv-bionic:~/project/bot$ pip install pyTelegramBotAPi==3.2.0 (bot) ekzorchik@srv-bionic:~/project/bot$ nano bot.py (bot) ekzorchik@srv-bionic:~/project/bot$ ./bot.py -bash: ./bot.py: Permission denied (bot) ekzorchik@srv-bionic:~/project/bot$ chmod +x bot.py (bot) ekzorchik@srv-bionic:~/project/bot$ ./bot.py requests.exceptions.InvalidSchema: Missing dependencies for SOCKS support. (bot) ekzorchik@srv-bionic:~/project/bot$ pip3 install pysocks requests.exceptions.ConnectionError: SOCKSHTTPSConnectionPool(host='api.telegram.org', port=443): Max retries exceeded with url: /bot415624378:AAG4m_bSgEccPFf4W38-HSvHK_gcPnkfSz8/getUpdates?offset=1&timeout=20 (Caused by NewConnectionError('<urllib3.contrib.socks.SOCKSHTTPSConnection object at 0x7f5259ed5828>: Failed to establish a new connection: [Errno 111] Connection refused',))
Заново запросил у @BotFather token ID
моего бота: /token @Ekzorchitbot
В ответ пришло сообщение:
You can use this token to access HTTP API: 415624378:AAG4m_bSgEccPFf4W38-HSvHK_gcPnkfSz8 For a description of the Bot API, see this page: https://core.telegram .org/bots/api
(bot) ekzorchik@srv-bionic:~/project/bot$ ./bot
И ошибок нет.
Код моего тестового бота:
(bot) ekzorchik@srv-bionic:~/project/bot$ nano bot #!/usr/bin/env python # -*- coding: utf-8 -*- import telebot import time from subprocess import check_output from telebot import apihelper #Set proxy: 3proxy + tor ip = '172.35.35.8' port = '50001' apihelper.proxy = {'https':'socks5h://{}:{}'.format(ip,port)} my_token = "415624378:AAG4m_bSgEccPFf4W38-HSvHK_gcPnkfSz8" bot = telebot.TeleBot(token=my_token) #id вашего аккаунта user_id = 0 @bot.message_handler(content_types=["text"]) def main(message): command = message.text bot.send_message(message.chat.id,check_output(command, shell = True)) bot.polling(none_stop=True,interval=0)
Запускаю его, затем запускаю Telegram
клиент на смартфоне Huawei Honor 5C
и пишут своему боту команды, которые он должен выполнить.
(bot) ekzorchik@srv-bionic:~/project/bot$ ./bot
(bot) ekzorchik@srv-bionic:~/project/bot$ deactivate ekzorchik@srv-bionic:~/project/bot$
Есть замечание по коду бота: он принимает на исполнение команды только в нижнем регистре.
Задача: Разобрать как отправлять сообщения Telegram bot(у)
Получить информацию о боте
ekzorchik@srv-bionic:~$ workon bot (bot) ekzorchik@srv-bionic:~$ cd project/bot/ (bot) ekzorchik@srv-bionic:~/project/bot$ (bot) ekzorchik@navy:~/project/bot$ curl -v -x socks5://172.35.35.8:50001 https://api.telegram.org/bot415624378:AAG4m_bSgEccPFf4W38-HSvHK_gcPnkfSz8/getMe * Connection #0 to host 172.35.35.8 left intact {"ok":true,"result":{"id":415624378,"is_bot":true,"first_name":"Ekzbot","username":"Ekzorchikbot"}}(bot) ekzorchik@navy:~/project/bot$ Получить информацию о боте в более форматированном виде: (bot) ekzorchik@navy:~/project/bot$ sudo apt install -y yajl-tools (bot) ekzorchik@navy:~/project/bot$ curl -v -x socks5://172.35.35.8:50001 https://api.telegram.org/bot415624378:AAG4m_bSgEccPFf4W38-HSvHK_gcPnkfSz8/getMe | json_reformat * Connection #0 to host 172.35.35.8 left intact { "ok": true, "result": { "id": 415624378, "is_bot": true, "first_name": "Ekzbot", "username": "Ekzorchikbot" } } (bot) ekzorchik@navy:~/project/bot$ curl -v -x socks5://172.35.35.8:50001 https://api.telegram.org/bot415624378:AAG4m_bSgEccPFf4W38-HSvHK_gcPnkfSz8/getUpdates * Trying 172.35.35.8... * TCP_NODELAY set * SOCKS5 communication to api.telegram.org:443 * SOCKS5 connect to IPv4 149.154.167.220 (locally resolved) * SOCKS5 request granted. * Connected to 172.35.35.8 (172.35.35.8) port 50001 (#0) * ALPN, offering h2 * ALPN, offering http/1.1 * successfully set certificate verify locations: * CAfile: /etc/ssl/certs/ca-certificates.crt CApath: /etc/ssl/certs * TLSv1.2 (OUT), TLS handshake, Client hello (1): * TLSv1.2 (IN), TLS handshake, Server hello (2): * NPN, negotiated HTTP1.1 * TLSv1.2 (IN), TLS handshake, Certificate (11): * TLSv1.2 (IN), TLS handshake, Server key exchange (12): * TLSv1.2 (IN), TLS handshake, Server finished (14): * TLSv1.2 (OUT), TLS handshake, Client key exchange (16): * TLSv1.2 (OUT), TLS change cipher, Client hello (1): * TLSv1.2 (OUT), TLS handshake, Unknown (67): * TLSv1.2 (OUT), TLS handshake, Finished (20): * TLSv1.2 (IN), TLS handshake, Finished (20): * SSL connection using TLSv1.2 / ECDHE-RSA-AES128-GCM-SHA256 * ALPN, server did not agree to a protocol * Server certificate: * subject: OU=Domain Control Validated; CN=api.telegram.org * start date: May 4 14:42:31 2018 GMT * expire date: May 23 16:17:38 2020 GMT * subjectAltName: host "api.telegram.org" matched cert's "api.telegram.org" * issuer: C=US; ST=Arizona; L=Scottsdale; O=GoDaddy.com, Inc.; OU=http://certs.godaddy.com/repository/; CN=Go Daddy Secure Certificate Authority - G2 * SSL certificate verify ok. > GET /bot415624378:AAG4m_bSgEccPFf4W38-HSvHK_gcPnkfSz8/getUpdates HTTP/1.1 > Host: api.telegram.org > User-Agent: curl/7.58.0 > Accept: */* > < HTTP/1.1 200 OK < Server: nginx/1.12.2 < Date: Sun, 10 Mar 2019 17:16:01 GMT < Content-Type: application/json < Content-Length: 2099 < Connection: keep-alive < Access-Control-Allow-Origin: * < Access-Control-Allow-Methods: GET, POST, OPTIONS < Access-Control-Expose-Headers: Content-Length,Content-Type,Date,Server,Connection < Strict-Transport-Security: max-age=31536000; includeSubDomains; preload < {"ok":true,"result":[{"update_id":993233016, "message":{"message_id":315,"from":{"id":361950788,"is_bot":false,"first_name":"\u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440","last_name":"\u041e\u043b\u043b\u043e","username":"aka_ekzorchik","language_code":"ru"},"chat":{"id":361950788,"first_name":"\u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440","last_name":"\u041e\u043b\u043b\u043e","username":"aka_ekzorchik","type":"private"},"date":1552237239,"text":"/chatid","entities":[{"offset":0,"length":7,"type":"bot_command"}]}},{"update_id":993233017, "message":{"message_id":316,"from":{"id":361950788,"is_bot":false,"first_name":"\u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440","last_name":"\u041e\u043b\u043b\u043e","username":"aka_ekzorchik","language_code":"ru"},"chat":{"id":361950788,"first_name":"\u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440","last_name":"\u041e\u043b\u043b\u043e","username":"aka_ekzorchik","type":"private"},"date":1552237654,"text":"@Ekzbot","entities":[{"offset":0,"length":7,"type":"mention"}]}},{"update_id":993233018, "message":{"message_id":317,"from":{"id":361950788,"is_bot":false,"first_name":"\u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440","last_name":"\u041e\u043b\u043b\u043e","username":"aka_ekzorchik","language_code":"ru"},"chat":{"id":361950788,"first_name":"\u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440","last_name":"\u041e\u043b\u043b\u043e","username":"aka_ekzorchik","type":"private"},"date":1552237658,"text":"/start","entities":[{"offset":0,"length":6,"type":"bot_command"}]}},{"update_id":993233019, "message":{"message_id":318,"from":{"id":361950788,"is_bot":false,"first_name":"\u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440","last_name":"\u041e\u043b\u043b\u043e","username":"aka_ekzorchik","language_code":"ru"},"chat":{"id":361950788,"first_name":"\u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440","last_name":"\u041e\u043b\u043b\u043e","username":"aka_ekzorchik","type":"private"},"date":1552237817,"text":"@userinfobot","entiti* Connection #0 to host 172.35.35.8 left intact es":[{"offset":0,"length":12,"type":"mention"}]}}]}(bot) ekzorchik@navy:~/project/bot$
Chat_id = 361950788
– это мой CHAT_ID
моего аккаунта Telegram: aka_ekzorchik
Узнал я его т. к. это мой бот, и я отправляю его со своей системы, где у меня работает GUI
клиент Telegram
. Вопрос как его (chat_id
) точно получить, а не искать в большом выводе?
jq - lightweight and flexible command-line JSON processor ekzorchik@srv-bionic:~$ sudo apt-get install jq -y
Отобразить все что есть в чате с ботом – т.е. какой текст отправлялся, кем (его CHAT_ID
) и т.д.:
ekzorchik@srv-bionic:~$ curl -v -x socks://172.35.35.8:50001 -s https://api.telegram.org/bot415624378:AAG4m_bSgEccPFf4W38-HSvHK_gcPnkfSz8/getUpdates | jq -r ".result" ekzorchik@srv-bionic:~$ curl -x socks://172.35.35.8:50001 -s https://api.telegram.org/bot415624378:AAG4m_bSgEccPFf4W38-HSvHK_gcPnkfSz8/getUpdates | jq -r ".result[].message.chat.id" | head -n1 361950788
Итого я получил chat_id
(bot) ekzorchik@navy:~/project/bot$ curl -v -x socks5://172.35.35.8:50001 -s -X POST https://api.telegram.org/bot415624378:AAG4m_bSgEccPFf4W38-HSvHK_gcPnkfSz8/sendMessage -d chat_id=361950788 -d text=ekzorchik
Отправляю через CURL
сообщение моему боту:
* Connection #0 to host 172.35.35.8 left intact {"ok":true,"result":{"message_id":319,"from":{"id":415624378,"is_bot":true,"first_name":"Ekzbot","username":"Ekzorchikbot"},"chat":{"id":361950788,"first_name":"\u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440","last_name":"\u041e\u043b\u043b\u043e","username":"aka_ekzorchik","type":"private"},"date":1552238465,"text":"ekzorchik"}} (bot) ekzorchik@navy:~/project/bot$
и сообщение было успешно отправлено
Задача: Составить bash
скрипт который позволяет отправлять моему боту определенную информацию:
ekzorchik@srv-bionic:~/project/bot$ nano bot_notify2 #!/bin/bash TOKEN=415624378:AAG4m_bSgEccPFf4W38-HSvHK_gcPnkfSz8 # где CHAT_ID = 361950788 – это идентификатор моего лично аккаунта на Telegram #CHAT_ID=361950788 CHAT_ID="$1" SUBJ="$2" MESSAGE="$3" SOCKSIP=172.35.35.8 SOCKSPORT=50001 URL="https://api.telegram.org/bot$TOKEN/sendMessage" curl -x socks5://$SOCKSIP:$SOCKSPORT -s --header 'Content-Type: application/json' --request 'POST' --data "{\"chat_id\":\"${CHAT_ID}\",\"text\":\"${SUBJ}\n${MESSAGE}\"}" "https://api.telegram.org/bot${TOKEN}/sendMessage" #curl -v -x socks5://$SOCKSIP:$SOCKSPORT -s -X POST $URL -d chat_id=$CHAT_ID -d text="$MESSAGE" #Строка запуска данного скрипта: #./bot_notify2.sh 361950788 Тест 'Проверяю отправку оповещений ботом' ekzorchik@srv-bionic:~/project/bot$ chmod +x botsend
Запускаю:
ekzorchik@srv-bionic:~/project/bot$ ./bot_notify2 361950788 Тест 'Проверяю отправку оповещений ботом' {"ok":true,"result":{"message_id":501,"from":{"id":415624378,"is_bot":true,"first_name":"Ekzbot","username":"Ekzorchikbot"},"chat":{"id":361950788,"first_name":"\u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440","last_name":"\u041e\u043b\u043b\u043e","username":"aka_ekzorchik","type":"private"},"date":1573550445,"text":"\u0422\u0435\u0441\u0442\n\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u044e \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0443 \u043e\u043f\u043e\u0432\u0435\u0449\u0435\u043d\u0438\u0439 \u0431\u043e\u0442\u043e\u043c"}} ekzorchik@srv-bionic:~/project/bot$
Открываю на смартфоне Telegram
клиент и вижу, что моему боту от меня пришёл текст.
Работает. Используя данный скрипт можно приспособить его к отправке уведомлений от системы мониторинга Zabbix
которая ответственна за мой умный дом ну или его пародию.
Задача: Как отправлять строго определенное сообщение:
ekzorchik@srv-bionic:~/project/bot$ sudo apt-get install curl -y ekzorchik@srv-bionic:~/project/bot$ nano bot_notify #!/bin/bash #Check CHAT_ID #apt-get install curl -y #curl -v -x socks5://172.35.35.8:50001 https://api.telegram.org/bot415624378:AAG4m_bSgEccPFf4W38-HSvHK_gcPnkfSz8/getUpdates TOKEN=415624378:AAG4m_bSgEccPFf4W38-HSvHK_gcPnkfSz8 CHAT_ID=361950788 MESSAGE="https://www.ekzorchik.ru" SOCKSIP=172.35.35.8 SOCKSPORT=50001 URL="https://api.telegram.org/bot$TOKEN/sendMessage" curl -v -x socks5://$SOCKSIP:$SOCKSPORT -s -X POST $URL -d chat_id=$CHAT_ID -d text="$MESSAGE" ekzorchik@srv-bionic:~/project/bot$ chmod +x bot_notify ekzorchik@srv-bionic:~/project/bot$ ./bot_nofity – и мне приходил URL ссылка на мой блог.
Итого получается, что полнофункциональный бот мне как бы и не нужен, ну пока во всяком случае.
ekzorchik@srv-bionic:~/project/bot$ cd ~/ ekzorchik@srv-bionic:~$
Задача: Нашел в сети еще один уже якобы полноценный инструмент для отправки сообщений через консоль своему боту:
Скрипт работает то же на основе CURL
запроса.
Скачал данные скрипты к себе в репозитарий:
ekzorchik@srv-bionic:~$ hg clone --insecure https://ekzorchik@172.35.35.8/hg/telegram ekzorchik@srv-bionic:~$ cd telegram/ ekzorchik@srv-bionic:~/telegram$ chmod +x telegram-notify-install.sh ekzorchik@srv-bionic:~/telegram$ sudo ./telegram-notify-install.sh ekzorchik@srv-bionic:~/telegram$ cd ~ ekzorchik@srv-bionic:~$ sudo nano /etc/telegram-notify.conf [general] api-key=415624378:AAG4m_bSgEccPFf4W38-HSvHK_gcPnkfSz8 user-id=361950788 [network] socks-proxy=socks://172.35.35.8:50001 ekzorchik@srv-bionic:~$ telegram-notify Tool to send a message to a Telegram User or Channel. Message is sent from a Telegram Bot and can contain icon, text, image and/or document. Main parameters are : --text <text> Text of the message (use - for piped text) --file <file> File holding the text of the message --photo <file> Image to display --document <file> Document to transfer Options are : --title <title> Title of the message (if text message) --html Use HTML mode for text content (markdown by default) --silent Send message in silent mode (no user notification on the client) --quiet Don't print message to stdout --config <file> use alternate config file, instead of default /etc/telegram-notify.conf --user <user-id> Recipient User or Channel ID (replaces user-id= in /etc/telegram-notify.conf) --key <api-key> API Key of your Telegram bot (replaces api-key= in /etc/telegram-notify.conf) Optional icons are : --success Add a success icon --warning Add a warning icon --error Add an error icon --question Add a question mark icon --icon <code> Add an icon by UTF code (ex 1F355) Here is an example of piped text : echo 'text to be displayed' | telegram-notify --success --text - ekzorchik@srv-bionic:~$ ekzorchik@srv-bionic:~$ telegram-notify --text privet - [Info] Using configuration file /etc/telegram-notify.conf ekzorchik@srv-bionic:~$
и мне в чат к боту приходит текстовое сообщение «privet
” – работает. Инструмент хорош, самое главное что я теперь не завишу от разработчика, так как я его скопировал к себе репозитарий наработок Mercurial + Web
который развернут в моей локальной сети.
ekzorchik@srv-bionic:~$ wget https://raw.githubusercontent.com/NicolasBernaerts/debian-scripts/master/telegram/telegram-notify-install.sh ekzorchik@srv-bionic:~$ chmod +x telegram-notify-install.sh ekzorchik@srv-bionic:~$ cat telegram-notify-install.sh #!/bin/bash # install packages apt-get install curl # retrieve configuration file and main script wget -O /etc/telegram-notify.conf https://raw.githubusercontent.com/NicolasBernaerts/debian-scripts/master/telegram/telegram-notify.conf wget -O /usr/local/sbin/telegram-notify https://raw.githubusercontent.com/NicolasBernaerts/debian-scripts/master/telegram/telegram-notify chmod +x /usr/local/sbin/telegram-notify ekzorchik@srv-bionic:~$ sudo ./telegram-notify-install.sh ekzorchik@srv-bionic:~$ sudo nano /etc/telegram-notify.conf [general] api-key=415624378:AAG4m_bSgEccPFf4W38-HSvHK_gcPnkfSz8 user-id=361950788 [network] socks-proxy=socks://172.35.35.8:50001
ekzorchik@srv-bionic:~$ telegram-notify --text "hello" [Info] Using configuration file /etc/telegram-notify.conf
И приходит текст “Hello
”.
Заметка работоспособна на 12.11.2019 12:57
. На этом у меня всё, с уважением Олло Александр aka ekzorchik.