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);
}
Готово! Можете проверить на своём боте.
В дальнейших уроках этого блока мы рассмотрим другие возможности библиотеки на практике, а сейчас рекомендую ознакомиться с документацией и всеми возможностями библиотеки.


