Как закинуть на сервер Телеграмм бота для чайников с нуля

date

23.01.2020

user

VyacheslavK

directory

CentOS, Linux

comments

комментариев 8

В этой статье мы рассмотрим пример использования Telegram бота на сервере с Linux CentOS, покажем, как настроить простые уведомления в чат-бот для мониторинга вашего сервера, а также несколько управляющих команд.

В эпоху мобильных гаджетов, стало актуально использование различных мессенджеров не только для общения с реальными людьми, но и использование различных ботов. Например, в Telegram существует широкий функционал для бота, который можно использовать в различных целях — выдать информацию о заказе клиенту, информация по посылке у почтового оператора и, например, мониторинг собственного сервера.

Пишем TELEGRAM бота на 1С. С нуля и до …

Создание чат-бота в Telegram

BotFather создать нового бота telegram

Нажмите START. Чтобы создать нового бота, выберете в меню /newbot, введите имя бота в формате “имя_bot». После создания бота, вы получите API токен бота, который нужен будет в дальнейшей настройке.

получить API токен бота телеграм

Теперь нужно узнать user_id — это ID часа с ботом, в который он будет отправлять уведомления. Перейдите в ваш с ним чат и нажмите старт и отправить любой символ. После этого в браузере перейдите по адресу:

https://api.telegram.org/bot/getUpdates — где это API который выдал BotFather.

user_id бота telegram

На скриншоте выделен ваш ID.

Итак, мы создали бота в Telegram и получили авторизационные данные.

Отправка в чат Telegram уведомлений с сервера

С помощью ранее созданного бота и полученных ID можно отсылать с сервера уведомления в Telegram чат, и таким образом получать какие-то интересные нам данные или алерты.

Для отправки сообщения в чат, нужно использовать следующий URL:

# curl -s -X POST https://api.telegram.org/bot944496485:AAEtGaGCVrQ7d26Rc3r_cqXPIhrKVokh8e4/sendMessage -d chat_id=336116180 -d text=»Доброе утро, страна»

отправка сообщений в telegram бот через api и url

Для чего можно использовать такие Telegram уведомления? Например, при создании резервной копии вы можете отправлять уведомления о ее создании или же отправлять ссылку на скачивание копии в чат с ботом. Вы можете отправлять себе в Telegram уведомления с информацией о сбоях в системе. Можно добавить в крон выполнение каких-либо проверок с последующей отправкой в Telegram.

Еще пример использования подобных уведомлений:

# curl -s -X POST https://api.telegram.org/bot944496485:AAEtGaGCVrQ7d26Rc3r_cqXPIhrKVokh8e4/sendMessage -d chat_id=336116180 -d text=» User $(whoami) logged into $(hostname) on $(date) from $(echo $SSH_CLIENT | awk ‘< print $1>’)» /dev/null 2>Development tools» -y

# yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel -y
# ./configure
# make
# make install

установка Python 3 в centos 7

Создайте симлинк для Python:

# ln -s /usr/local/bin/python3 /usr/bin/python3

И установите ПО для самого бота:

# pip3 install python-telegram-bot —upgrade

pip3 install python-telegram-bot

Теперь скачайте и распакуйте к себе на сервер в каталог root/admin три файла из архива telegram_bot.zip:

Рассмотрим файл config.py. В нем нам нужно указать token(API) и ID вашего чата с ботом, а также путь до директорий с бэкапами и директории, размер которой вы будете в дальнейшем проверять:

config.py настройки telegram бота

Файл bot.sh не требует настройки, в нем лишь указываем путь до bot.py:

bot.sh

И самый основной файл, который собственно и позволит нам управлять сервером, это bot.py. В нем описаны функции, которые будут доступны в чате с ботом и собственно туда, мы можем добавлять свой собственный функционал. Например, в первом блоке описываются доступные команды бота в чате:

python скрипт для telegram бота

Тут описываются все функции, которые будут доступны, после ввода команды /help.

Ниже описывается сама функция, например,

#функция команады ifconfig def ifconfig(bot, update): reload(config) user = str(update.message.from_user.id) if user in config.admin: #если пользовательский id в списке admin то команда выполняется run_command(«ifconfig») bot.sendMessage(chat_id=update.message.chat_id, text=textoutput)

И эту функцию, нужно описать как команду:

ifconfig_handler = CommandHandler(‘ifconfig’, ifconfig) dispatcher.add_handler(ifconfig_handler)

То есть как видим, это выполнение стандартной функции проверки сетевых настроек ifconfig.

При знакомстве с ботом я попытался добавить собственную команду, например для проверки Apache:

# service httpd status

Но только через настройку данного файла это не сработало. Как я понял, здесь можно выполнить только команду описанную одним словом или символами. Я решил проблему создав файл apache_status.sh с содержимым:

Еще по теме:  Как сделать активную ссылку в инстаграме в шапке профиля на Телеграм

#!/bin/bash
service httpd status

И создал на него симлинк:

# ln -s /root/admin/apache_status.sh /usr/local/sbin/apachestatus

Теперь при вызове команды apachestatus, у меня выводит статус веб-сервера apache:

apachestatus

В файле bot.py я заполнил все три блока, согласно других функций. Чтобы bot заработал, нужно запустить файл bot.sh. Для удобства, создадим отдельный сервис для Telegram бота. Создаем нужный файл и выставляем права:

# touch /etc/systemd/system/telegram-bot.service
# chmod 664 /etc/systemd/system/telegram-bot.service

После чего заходим в файл сервиса:

И добавляем содержимое:

[Unit] Description=Telegram bot After=network.target [Service] ExecStart=/root/admin/bot.sh [Install] WantedBy=multi-user.target

# systemctl start telegram-bot.service
# systemctl enable telegram-bot.service
# systemctl status telegram-bot.service

Теперь, если в чате с вашим ботом ввести /help, вы получите список доступных команд.

список доступных команд в telegram боте

Например, в данный момент у меня на сервере остановлен веб-сервер Apache:

команда состояния сервера в telegram боте

Запустим его на сервере и проверим статус через Telegram:

проверка статуса apache из telegram

Еще несколько примеров выполнения команд:

команды для сервера linux в telegram боте

Таким образом, вы можете выполнять мониторинг своего Linux сервера или даже частичное администрирование через Telegram, что поможет сильно сократить время на выполнение типовых действий.

Так же хотел бы заметить, что авторизация сервера с ботом происходит именно по ID и token(API) (любой другой человек, не зная ваших данных, подключиться не сможет).

На момент выпуска статьи, тестовый бот удален.

Предыдущая статьяПредыдущая статья Следующая статья Следующая статья

Источник: winitpro.ru

Telegram-бот: от первой строчки до размещения

Эта статья о том, как создать Telegram-бот для автоматизации нескольких рутинных задач. Если вас интересует только код, то вот ссылка. Он несложный, и его вполне можно понять самостоятельно.

Что этот бот будет делать?

Отправлять письма

Это совсем не тупо, но мне кажется, надо пояснить. Всю дорогу по ходу учебы мне нужно было отправлять кучу писем, и все они должны были быть определенного формата. К тому же gmail просто бесит, он красный и все такое! При помощи бота я смогу отправлять письма через чат. Я просто пишу в чат, а бот пусть форматирует это и отправляет по мейлу.

Сохранять всякое разное

Я очень много использую Telegram и часто натыкаюсь там на интересные для меня ссылки или просто на полезную информацию. Хотелось бы, чтобы бот сохранял все то, что я ему пересылаю, в базе данных SQL.

Что мы будем использовать при создании бота

Для API Telegram есть оболочки практически на любом языке программирования. Начиная от Python, PHP и Java и заканчивая Node.js. Мы, разумеется, будем использовать Python. Код данной оболочки находится здесь, можете убедиться сами. Также можно поучаствовать в развитии данного проекта (если сможете, конечно). Оболочки для других языков можно найти здесь.

Наш бот

Чат с BotFather для получения ключей API

Создание Telegram-бота это весьма забавный процесс так как, собственно, весь он строится на вашем общении с Telegram-ботом. Зовут этого бота BotFather (Бот-Отец). В приложении Telegram его можно найти по имени и начать с ним беседу.

Для начала беседы наберите /start .

Вы увидите список команд, при помощи которых можно создавать боты, редактировать их и управлять ними. Так как мы зашли в первый раз, то выбираем /newbot .

После введения команды /newbot вам предстоит выбрать имя и ник (username) для вашего бота. Имя — это то, как пользователи будут видеть этого бота в своем контакт-листе. А ник — имя, по которому этот бот можно будет найти в приложении Telegram. Это то же самое как и ник в Twitter, он должен быть уникальным, и чем короче, тем лучше.

Сделав это, вы получите API-ключ для вашего бота. С помощью него Telegram сможет ассоциировать написанный вами код именно с этим конкретным ботом. У каждого бота есть свой API- ключ, и вы не должны им ни с кем делиться. В противном случае ваш бот можно будет взломать и осуществить злодейские планы.

Код

Начнем с того, что импортируем все необходимое.

from telegram.ext import Updater, CommandHandler, MessageHandler, Filters, ConversationHandler from telegram import ReplyKeyboardMarkup, ReplyKeyboardRemove import logging import sqlite3 from mail import send_mail from sensitive import tok, user_id, name, username

Еще по теме:  В Телеграмме стали появляться новые каналы

Предназначение библиотек logging и sqlite3 вполне видно из их названий. Они будут использоваться для логирования и сохранения всего, что нам потребуется. В файле sensitive содержаться мои учетные данные, а в telegram.ext хранятся все необходимые обработчики.

Updater — это класс, в котором используется telegram.ext.Dispatcher. Он предоставляет интерфейс для telegram.Bot, чтобы можно было сосредоточиться исключительно на программировании бота. Его цель — получать обновления от Telegram и доставлять их указанному диспетчеру. Он также запускается в отдельном потоке, поэтому пользователь может взаимодействовать с ботом, например, из командной строки. Диспетчер поддерживает обработчики для различных типов данных: обновления от Telegram, основные текстовые команды и даже произвольные типы. Класс Updater может быть использован как служба опроса, а для получения обновлений можно использовать вебхук (webhook). Это достигается с помощью классов WebhookServer и WebhookHandler .

MessageHandler — класс для обработки Telegram-сообщений. Они могут содержать текст, различные медиафайлы или обновления статуса.

ConversationHandler — это класс для ведения диалога с одним пользователем путем управления четырьмя коллекциями других обработчиков. Обратите внимание, что ни сообщения в каналах Telegram, ни групповые взаимодействия с несколькими пользователями не управляются экземплярами данного класса.

Команды

Для каждой команды написана отдельная функция. А все остальное — для работы с SQL и строками.

Email

Иметь дело с электронной почтой несколько сложнее (на самом деле нет — если вы используете ConversationHandler ). Чтобы полностью понять идею того, как значения из одной функции передаются другую и в ней обрабатываются, прочитайте вот это.

Как вы могли заметить, функцию send_mail() я импортировал из модуля mail . Для отправки почтовых сообщений используется протокол SMTP.

def send_mail(to, subject, body, my=me): smt = smtplib.SMTP(‘smtp.gmail.com’, 587) smt.ehlo() smt.starttls() smt.login(user=my, password=pwd) sub = subject body = body message = «Subject: » + sub + «n» + body + «n» smt.sendmail(my, to, message) smt.quit()

Разумеется, для отправки электронной почты через протокол SMTP вы должны иметь имя пользователя и пароль. Вот хорошее пособие на данную тему.

Вот и всё?

Вообще-то нет. Вам еще осталось все это запустить.

def main(): «»»Start the bot.»»» updater = Updater(TOKEN) dp = updater.dispatcher dp.add_handler(CommandHandler(«start», start)) dp.add_handler(CommandHandler(«help», help)) dp.add_handler(CommandHandler(«add_event», add_event)) dp.add_handler(CommandHandler(«view_events», view_events)) dp.add_handler(CommandHandler(«remove_event», remove_event)) email_handler = ConversationHandler( entry_points=[CommandHandler(’email’, email)], states=< TO: [MessageHandler(Filters.text, to, pass_user_data=True)], SUBJECT: [MessageHandler(Filters.text, subject, pass_user_data=True)], MESSAGE: [MessageHandler(Filters.text, body, pass_user_data=True)] >, fallbacks=[CommandHandler(‘cancel’, cancel)] ) dp.add_handler(email_handler) dp.add_error_handler(error) updater.start_polling() updater.idle()

Размещение кода

Для размещения кода существует множество способов. Выбор зависит от того, как и насколько много вы будете этот код использовать.

  1. Pythonanywhere : бесплатно и просто. Откройте терминал и в нем запустите файл с вашим ботом. Но не ждите, что он будет работать долго.
  2. Heroku: не будем изобретать колесо. Вот здесь дана пошаговая инструкция по размещению на сервисе Heroku.

Вот здесь также собраны инструкции по размещению Telegram-ботов.

Источник: pythonist.ru

Telegram бот через webhook

Я тогда давно написал статью про создание Telegram бота, и обещал дополнить её описанием настройки работы через webhook, но так и не дополнил. Вот только сейчас дошли руки.

Telegram bot webhook

Что это такое

Как пишут в документации, общаться с серверами Telegram бот может двумя способами:

  1. getUpdates — pull: ваш бот постоянно дёргает сервер Telegram и проверяет есть ли новые сообщения;
  2. setWebhook — push: по мере поступления новых сообщений сервер Telegram отправляет их вашему боту.

Разницу можно изобразить следующим образом:

Telegram bot, getUpdates vs setWebhook

Очевидно, что второй способ ( setWebhook ) рациональнее для всех участников процесса. Однако в нём присутствует неявная сложность: кто-то должен принимать сообщения от Telegram на стороне бота, то есть необходим веб-сервер или его эквивалент.

Как настроить

Что нужно сделать:

  1. Заиметь доменное имя для сервера и получить на него сертификат (например, от Let’s Encrypt). Документация также говорит, что в случае самоподписанного сертификата можно обойтись и просто IP адресом, но этого я не пробовал;
  2. Запилить серверную часть на стороне бота (куда будет ломиться Telegram);
  3. Зарегистрировать адрес серверной части в Telegram (зацепить webhook на endpoint), чтобы Telegram знал, куда ломиться с сообщениями.

Сертификат

С доменом и сертификатом просто. Домен у меня уже был, а сертификат я получил по этой инструкции.

Еще по теме:  В Телеграмме на Самсунге не отображаются уведомления в приложении

Вариант с самоподписанным сертификатом на прямой IP адрес я оставляю вам на самостоятельное изучение.

Серверная часть

Серверная часть чуть посложнее. Я переделал текущую реализацию бота на pyTelegramBotAPI, используя пример для AIOHTTP.

Ставим необходимые пакеты:

pip install pyTelegramBotAPI pip install aiohttp pip install cchardet pip install aiodns

И сокращённо код бота теперь такой:

Что здесь происходит: мы запускаем мини-веб-сервер, который слушает порт 8443 и отвечает на запросы через определённый endpoint, который образован токеном бота. Токен используется здесь как достаточно уникальный идентификатор, чтобы какой-нибудь мимокрокодил из интернета не навызывал бота и не натворил дел. Полный адрес endpoint’а будет выглядеть вот так: https://YOUR.DOMAIN:8443/YOUR-TOKEN/ .

Обратите также внимание на отличия от стандартного примера из репозитория:

  • в качестве файла сертификата указан fullchain.pem , а не cert.pem ;
  • удалён код снятия и установки webhook’а.

Так как бота я запускаю не из-под root’а, сервис начал валиться с такой ошибкой:

python-bot[1824]: Traceback (most recent call last): python-bot[1824]: File «/usr/local/bin/bot/bot.py», line 142, in python-bot[1824]: context.load_cert_chain(WEBHOOK_SSL_CERT, WEBHOOK_SSL_PRIV) python-bot[1824]: PermissionError: [Errno 13] Permission denied systemd[1]: telegram-bot.service: Main process exited, code=exited, status=1/FAILURE systemd[1]: telegram-bot.service: Failed with result ‘exit-code’.

То есть, у пользователя, из-под которого выполняется скрипт, нет доступа к /etc/letsencrypt/ , чтобы открыть файл сертификата. Я попытался дать доступ к каталогу для новой группы, включив в неё этого пользователя:

groupadd letsencrypt usermod -a -G letsencrypt userforbot chgrp -R letsencrypt /etc/letsencrypt/

Но он один фиг не мог открыть файлы оттуда, даже простой ls выдавал ошибку доступа. В общем, или мои познания Linux полный отстой, или одно из двух. Пришлось тупо назначить его владельцем:

chown -R userforbot:letsencrypt /etc/letsencrypt/

Тогда сервис запустился нормально.

Регистрация

Теперь осталось самое, как оказалось, сложное — зарегистрировать endpoint бота в Telegram. Сложности возникли потому, что я сначала неправильно понял принцип составления endpoint’а, а также из-за проблем с проверкой сертификата.

Для установки/регистрации webhook’а нужно выполнить следующий HTTP запрос (можно просто открыть этот URL в браузере):

https://api.telegram.org/botYOUR-TOKEN/setWebhook?url=https://YOUR.DOMAIN:8443/YOUR-TOKEN/

Пока я экспериментировал и разбирался с форматом endpoint’а, Telegram возвращал мне нормальный результат:

«description»: «Webhook was set», «ok»: true, «result»: true >

Но потом я его видимо задолбал, и он стал возвращать мне следующее:

«ok»: false, «error_code»: 504, «description»: «Gateway Timeout» >

Но оказалось, что это ни на что не влияет, и webhook нормально устанавливается, так что можно даже не дожидаться таймаута, а просто отменять запрос через пару секунд.

Проверить статус webhook’а можно таким запросом:

https://api.telegram.org/botYOUR-TOKEN/getWebhookInfo

Если всё нормально, должно вернуть такое:

«ok»: true, «result»: «url»: «https://YOUR.DOMAIN:8443/YOUR-TOKEN/», «has_custom_certificate»: false, «pending_update_count»: 0, «max_connections»: 40 > >

Как видим, в поле url стоит наш endpoint.

Однако, мне оно сейчас возвращает такое:

«ok»: true, «result»: «url»: «https://YOUR.DOMAIN:8443/YOUR-TOKEN/», «has_custom_certificate»: false, «pending_update_count»: 0, «last_error_date»: 1543762687, «last_error_message»: «SSL error «, «max_connections»: 40 > >

Что указывает на некие проблемы с сертификатом. При этом бот работает нормально, то есть эта ошибка ни на что не влияет. Однако, если вместо fullchain.pem оставить cert.pem (как было указано в примере), то бот работать перестанет.

Стоит также отметить, что если вы установили webhook, то опрос Telegram через getUpdates работать больше будет. Чтобы снять webhook, надо отправить тот же самый запрос, что и для установки, но на этот раз без параметра url :

https://api.telegram.org/botYOUR-TOKEN/setWebhook
«ok»: true, «result»: true, «description»: «Webhook was deleted» >

Ну и всё, не так уж и сложно. Если бы в документации (и сторонних манулах из интернетов) была указана такая простая вещь, что для webhook’а всего-то нужен лишь веб-сервер на стороне бота, я бы это сделал уже сто лет назад. Конечно, продвинутым чувакам это скорее всего было очевидно сразу, но мнe — нет.

Note that even if you sign-in with your e-mail or GitHub, you still won’t be subscribed to replies. That is by design of remark42, unfortunately. To get updates about new replies/commends you need to explicitly subscribe to them either via e-mail or RSS.

Источник: decovar.dev

Рейтинг
( Пока оценок нет )
Загрузка ...