Skip to contentSkip to main navigation Skip to footer

Telegram бот. Библиотека

Библиотеки


В примерах из Интернета обычно используют библиотеку Universal-Arduino-Telegram-Bot. Она не очень простая в использовании, а также жутко тяжёлая и медленная за счёт использования JSON. Я написал свою библиотеку – FastBot, в ней реализованы все самые нужные инструменты для работы с ботом. Библиотека очень лёгкая и не требует дополнительной установки других библиотек.

Подробная документация, инструкция по установке и примеры находятся по ссылке выше, также библиотеку можно установить через встроенный менеджер библиотек Arduino IDE по названию FastBot.

Начало работы


  • Зарегистрировать бота в Телеграм и получить его токен (читай урок)
  • Обеспечить подключение платы к Интернету (читай урок)
  • Подключить библиотеку 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);
}

Готово! Можете проверить на своём боте.

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

Полезный пример?

Похожие примеры
Подписаться
Уведомить о
30 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии