Jul 21, 2015 22:17 · 565 words · 3 minute read telegram python
Не так давно Telegram открыл API для написание ботов. Примеры уже существующих можно посмотреть на их сайте. Всё общение сводится к отправке команды, её параметров и получение ответа, вот и меня попросили разобраться с этим и написать пример бота. Ну ok, почему бы и нет? 🙂
Регистрация нового бота telegram
Готовимся писать код
Настроив внешний вид бота в мессенджере, пришло время определиться как наш код будет получать сообщения. Доступны 2 варианта:
- Раз в n секунд опрашивать https://api.telegram.org/bot110201543:AAHdqTcvCH1vGWJxfSeofSAs0K5PALDsaw/getUpdates и получать список сообщений, пришедший за это время;
- Установить обработчик с помощью https://api.telegram.org/bot110201543:AAHdqTcvCH1vGWJxfSeofSAs0K5PALDsaw/setWebhook, который будет дёргаться при каждом новом сообщении.
Первый путь мне показался примитивным и уж более не безопасным — секретный ключ будет видно прямо в коде, поэтому я выбрал второй. И тут начинается ад! Для его работы обязателен веб-сервер с белым IP и действительным не самоподписанным сертификатом.
How To Create Simple Webhook to Send Hits On Telegram Group😎
Ну что ж, попробуем раздобыть сертификат… Я пошёл на сайт регистратора и — о чудо! — он раздавал его бесплатно 🙂 Будем считать, что повезло. Спустя пару дней после запроса мне пришло 4 ключа: приватный, публичный, промежуточный, корневой и запросный. Зачем нужен последний я так и не понял, но! Аккуратно устанавливаем всё это хозяйство согласно статьи. Тут меня ждали 2 засады.
Первое — обращаем внимание на какой домен выдан сертификат. В моём случае это tyvik.ru и www.tyvik.ru. Т.е. домен, допустим, telegram.tyvik.ru уже будет не защищён => повесить на него бота нельзя. Второе — в файле сертификата должен быть полный путь до корневого, включая все промежуточные. В противном случае сообщения от telegram в наш веб-хук просто не будут приходить. Да-да — ни ошибок, ни мусора — ни-че-го.
Сволочи! Я 3 часа потратил пытаясь найти что же ко мне приходит! То, что telegram.tyvik.ru не защищён https’ом я понял просто обратившись по адресу вебхука (на тот момент https://telegram.tyvik.ru/bot/) и увидев перечёркнутый значёк протокола. А вот про промежуточный нигде в документации не сказано. Решение я нашёл где-то на реддите и сейчас уже не повторю сей подвиг.
Кодим
Для реализации задуманного я решил взять flask. Почему? А потому что я его не знаю 🙂 В боте много бизнес-логики быть не должно, так что микрофреймворк — самое то. Создание виртуального окружения и непосредственно кодинг описывать не буду, приведу сразу весь код:
Итак, поехали. Во-первых, я нашёл библиотеку для работы с сообщениями telegram — twx.botapi. С помощью неё можно отправить сообщение, содержащее картинку, геопозицию, стикер, а также установить клавиатуру (варианты ответов). Во-вторых, строка декоратора говорит, что мы будем принимать сообщения по адресу /telegram/. В-третьих, само сравнение с командой и ответ на него.
Установка Telegram-бота на сервер (Python)
Замечу, что вызов wait() обязателен — он закрывает сообщение (делает flush), отправляя его собеседнику. Вот такой вот простенький бот, с которым можно поиграть в ping-pong 🙂 Настройку nginx+uwsgi описывать не буду, т.к. она не отличается от таковой для Django.
2010-2019 (c) TyVik
Powered by Hugo Theme By nodejh
Источник: tyvik.ru
Телеграм бот Node.js Webhook
Задача:
Создать Телеграм бота и научится работать с ним с помощью Node.js и библиотеки «Telegraf», через webhook, используя для этого виртуальный выделенный сервер (VDS) и самоподписанный SSL сертификат.
1. Регистрация в sprintbox.ru
Регистрируемся по адресу sprintbox.ru, с помощь промо кода «SPRINTBOXPROMO» пополняем счет на 100 рублей. После чего станет доступно создание VDS — виртуального выделенного сервера (бокса), с минимальными характеристиками.
2. Установка «PuTTY»
По адресу https://www.putty.org скачайте установочный пакет (MSI) «PuTTY» и установите все программы входящие в комплект. Программа «PuTTY» используется для удаленного подключение по протоколу SSH: https://ru.wikipedia.org/wiki/SSH.
3. Создание SSH – ключей
Создаем пару SSH — ключей, при помощи программы «PuTTYgen», которая идет в составе с программой «PuTTY». В программе «PuTTYgen» нажимаем «Generate» и перемещаем курсор мыши в произвольном порядке. После генерации, будут созданы два ключа, публичный и приватный (секретный), сохраняем их с помощью соответствующих кнопок и копируем текст публичного ключа из окна программы. Созданные ключи, будут использоваться в программе «PuTTY», для удаленного подключения по протокол SSH.
PuTTYgen создание SSH ключей
Примечание: Создание ключей можно выполнить в «Командной строке», при помощи команды «ssh-keygen», например:
ssh-keygen -t rsa -b 4096
4. Подключение SSH – ключей
В панели управления https://cp.sprintbox.ru/customer/boxes/ssh, «Боксы» -> «SSH — ключи», добавляем скопированное содержимое публичного ключа и задаем название, например, «PuTTY»:
Sprintbox добавляем SSH ключ
5. Создание VDS
В панели управления, «Боксы» — «Управление», добавляем новый бокс, выбираем «Аутентификация по ключу «PuTTY»», кликаем на логотип «CentOS» и выбираем «CentOS 8» и «Создать бокс». Выбираем самый дешевый тариф и подтверждаем действия.
Создание VDS, шаг 1 Создание VDS, шаг 2 Создание VDS, шаг 3 Создание VDS, шаг 4
Будет создан бокс и на почту придет информация с данными для подключения.
Примечание https://help.sprintbox.ru/service-work/ssh-keys-usage: «в этом случае root-пароль не генерируется, соответственно, он будет отсутствовать в письме о создании бокса, а доступ по паролю будет запрещён.»
6. Подключение к VDS по SSH
Запускаем «PuTTY», указываем полученный из письма IP-адрес бокса. В ветке «Connection – SSH — Auth» настроек программы, с помощью кнопки «Browse…» выбираем приватный ключ, созданные в п.3.
Для удобства, в ветке «Session», поле «Saved Session» можно задать наименование сессии и сохранить, чтобы в дальнейшем не пришлось настраивать все заново.
7. Подготовка к установке Node.js
Перед установкой Node.js выполним обновление:
dnf update
и перезагрузку системы:
reboot
При перезагрузке сессия SSH завершится, необходимо пере подключится через несколько минут.
8. Устанавливаем Node.js
8.1 Проверим версию по умолчанию в потоке «AppStream»:
dnf module list nodejs
8.2 Переключимся на поток с версией 14:
dnf module enable nodejs:14
8.3 Устанавливаем Node.js:
dnf install nodejs
8.4 Проверяем установку:
node –v
9. Создаем самоподписанный SSL сертификат
Примечание: В конце, в параметре CN, вместо нулей, необходимо указать ваш IP-адрес бокса, полученный при регистрации. Будут созданы два файла, публичный и приватный (секретный) ключ. Данные ключи будут использоваться для установки webhook.
10. Регистрация Телеграм бота
Регистрируем нового Телеграм бота, см. п.1 Телеграм бот 1С.
11. Создаем Телеграм бота в Node.js
Разрабатывать Телеграм бота на Node.js с использованием webhook, можно локально, в дальнейшем копируя файлы на сервер либо сразу же на сервере, в примере будет использован смешанный способ.
11.1 Создаем директорию, в которой будет производится работа, например:
mkdir /home/telegram-bot
11.2 Выполняем инициализацию проекта:
npm init
11.3 Для разработки телеграм бота на Node.js используется «Telegraf», для этого в рабочей директории проекта, выполним установку необходимого модуля:
npm install telegraf
11.4 Дополнительно устанавливаем пакет «dotenv», для хранения токена бота в отдельном файле «.env»:
npm install dotenv
11.5 Создаем файл: «.env» и сохраняем в нем токен:
echo BOT_TOKEN= 123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11 > .env
11.6 Вручную устанавливаем адрес webhook, с помощью setwebhook и программы CURL:
Примечание: Вместо нулей, необходимо указать ваш IP-адрес бокса, полученный при регистрации.
Ответ от Telegram Bot API:
Проверяем установку в Postman с помощью метода «getWebhookInfo«:
В документации «telegraf» есть метод установки:
bot.telegram.setWebhook(‘https://server.tld:8443/secret-path’, < source: ‘server-cert.pem’ >);
К сожалению, с помощью него не удалось выполнить установку webhook.
11.7 Создаем основной файл бота:
touch index.js
Исходный код телеграм бота Node.js с использование webhook:
const < Telegraf >= require(‘telegraf’); const fs = require(‘fs’); require(‘dotenv’).config(); const bot = new Telegraf(process.env.BOT_TOKEN); bot.start((ctx) => ctx.reply(‘Бот запущен!’)); bot.help((ctx) => ctx.reply(‘Телеграм бот Node.js Webhook.’)); bot.on(‘message’, (ctx) => < ctx.telegram.copyMessage(ctx.message.chat.id, ctx.message.from.id, ctx.message.message_id); >); const tlsOptions = < key: fs.readFileSync(‘/etc/ssl/private/private-nodejs.key’), cert: fs.readFileSync(‘/etc/ssl/certs/public-nodejs.pem’) >; // bot.telegram.setWebhook(`https://185.251.90.198:8443/bot`, < // source: `public-nodejs.pem` // >); bot.startWebhook(`/bot`, tlsOptions, 8443);
11.8 Запуск бота осуществляется командой:
node index.js
Результат работы бота на Node.js
Дополнительная информация:
- Для удобства копирования файлов на сервер, можно воспользоваться программой WinSCP которая похожа на программу Total Commander:
WinSCP
Источник: blagin.ru