Telegram бот. Библиотека
Библиотеки
В примерах из Интернета обычно используют библиотеку Universal-Arduino-Telegram-Bot. Она не очень простая в использовании, а также жутко тяжёлая и медленная за счёт использования JSON. Я написал свою библиотеку – FastBot, в ней реализованы все самые нужные инструменты для работы с ботом. Библиотека очень лёгкая и не требует дополнительной установки других библиотек.
Подробная документация, инструкция по установке и примеры находятся по ссылке выше, также библиотеку можно установить через встроенный менеджер библиотек Arduino IDE по названию FastBot.
Начало работы
- Зарегистрировать бота в Телеграм и получить его токен (читай урок)
- Опционально – узнать свой ID (читай урок)
- Обеспечить подключение платы к Интернету (читай урок)
- Подключить библиотеку
FastBot.h
- Инициализировать бота, указать токен
FastBot bot(токен);
- Теперь можно отправлять сообщения в указанный чат!
Для чтения входящих сообщений нужно:
- Вызывать функцию-тикер бота
bot.tick();
в основном цикле программы, она запрашивает новые сообщения по встроенному таймеру - Создать функцию вида
void newMsg(FB_msg& msg){}
(msg – сокращение от message, сообщение) – она будет вызываться при поступлении новых сообщений - Подключить функцию к боту по её имени:
bot.attach(newMsg);
- Забирать нужные данные из структуры
msg
внутри функции-обработчика сообщений. Основные:userID
– ID пользователяusername
– имя пользователя (в API Telegram это first_name)chatID
– ID чатаmessageID
– ID сообщения в чатеtext
– текст сообщения- Остальное смотри в документации
Минимальный пример
Рассмотрим пример, который выводит в монитор порта часть информации из сообщения в любом чате с ботом:
#define WIFI_SSID "login" #define WIFI_PASS "pass" #define BOT_TOKEN "xxxx" #include <FastBot.h> FastBot bot(BOT_TOKEN); void setup() { connectWiFi(); bot.attach(newMsg); } // обработчик сообщений void newMsg(FB_msg& msg) { // выводим ID чата, имя юзера и текст сообщения Serial.print(msg.chatID); // ID чата Serial.print(", "); Serial.print(msg.username); // логин Serial.print(", "); Serial.println(msg.text); // текст } void loop() { bot.tick(); } void connectWiFi() { delay(2000); Serial.begin(115200); Serial.println(); WiFi.begin(WIFI_SSID, WIFI_PASS); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); if (millis() > 15000) ESP.restart(); } Serial.println("Connected"); }
Давайте научим бота отвечать на сообщения – пусть он отправляет текст сообщения обратно:
void newMsg(FB_msg& msg) { // отправить сообщение обратно bot.sendMessage(msg.text, msg.chatID); }
Бот может ответить на сообщение (с цитатой сообщения), для этого указываем ID чата и сообщения. Пусть отвечает Hello!
на любые сообщения:
void newMsg(FB_msg& msg) { // ответить bot.replyMessage("Hello!", msg.messageID, msg.chatID); }
Задание ID чата
Чтобы бот мог сам писать сообщения, он должен знать ID чата. В предыдущих примерах мы отвечали на сообщения, из которых он мог узнать ID. Как отправить сообщение самостоятельно, например при запуске программы? Узнаём свой ID и передаём боту в bot.setChatID(id)
. Можно указать сразу несколько ID через запятую: bot.setChatID("1234,56789,445566");
.
Теперь бот будет обрабатывать сообщения только из указанных чатов, а также будет отправлять сообщения во все указанные чаты при отправке без указания ID чата bot.sendMessage("Текст")
. Поздороваемся при запуске программы:
void setup() { connectWiFi(); bot.setChatID("123456"); bot.sendMessage("Hello, World!"); }
Ответ на команды
В прошлом уроке мы создали для бота список команд. Давайте реализуем взаимодействие с ними:
/say_hello
– отправим сообщениеHello!
/led_on
– включим светодиод на плате (digitalWrite(LED_BUILTIN, LOW);
)/led_off
– выключим светодиод (digitalWrite(LED_BUILTIN, HIGH);
)
Примечание: поведение светодиода инвертировано, читайте в уроке про особенности платы.
Для обработки команды достаточно просто сравнить текст сообщения со строкой:
void newMsg(FB_msg& msg) { if (msg.text == "/say_hello") bot.sendMessage("Hello!", msg.chatID); else if (msg.text == "/led_on") digitalWrite(LED_BUILTIN, LOW); else if (msg.text == "/led_off") digitalWrite(LED_BUILTIN, HIGH); }
Не забываем сделать пин выходом в блоке setup()
:
void setup() { connectWiFi(); bot.attach(newMsg); pinMode(LED_BUILTIN, OUTPUT); }
Готово! Можете проверить на своём боте.
В дальнейших уроках этого блока мы рассмотрим другие возможности библиотеки на практике, а сейчас рекомендую ознакомиться с документацией и всеми возможностями библиотеки.