Задача: Поднять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

Бот исполняющий команды на Ubuntu системе

(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 (Ubuntu 18.04 Server)

Задача: Составить 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 ссылка на мой блог.

Отправленная боту определенная 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

Справка по использованию telegram-notify

ekzorchik@srv-bionic:~$ telegram-notify --text "hello"

[Info] Using configuration file /etc/telegram-notify.conf

И приходит текст “Hello”.

Заметка работоспособна на 12.11.2019 12:57. На этом у меня всё, с уважением Олло Александр aka ekzorchik.