Найти тему
Dima Lab51

ESP32 (ESP8266): Telegram bot

Оглавление

Вступление:

/* Всем привет! Сегодня я покажу как создать самого простого telegram bot(а)! Да-да! Настоящего telegram bot(а), которого в будущем можно усложнить, например, чтобы он выполнял различные команды, или, как искусственный интеллект, поддерживал живой диалог с пользователем! Итак, без лишних слов, приступаем к работе! */

ESP32
ESP32

/* Также, Вы могли заметить, что я написал "ESP32 (ESP8266)". Да, для работы telegram bot(а) можно использовать один из этих микроконтроллеров. Поэтому, чтобы не писать много слов, я буду писать просто "ESP32". И ещё один момент: «Программа» = «код» = «скетч»*/

Комплектующие:

  • ESP32 - для работы с telegram bot(ом) (Так сказать - это основной «мозг»);
  • Провод (USB) - для подключения и работы с ESP32;
  • Компьютер/Ноутбук (с Arduino IDE) - для загрузки программы в ESP32;

Программа (шаблон для будущего бота):

#define WIFI_SSID "**********"
#define WIFI_PASS "**********"
#define BOT_TOKEN "***********************************************"
#include <FastBot.h>
FastBot bot(BOT_TOKEN);
void setup() {
connectWiFi();
bot.attach(newMsg);
}
void newMsg(FB_msg& msg) {
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");
}
Программа (скетч)
Программа (скетч)

Давайте разберём код: (данный пункт не обязательный)

/* В данном блоке кода находятся данные: Wi-Fi, пароль от Wi-Fi и токен от telegram bot(а) */

#define WIFI_SSID "**********"
#define WIFI_PASS "**********"
#define BOT_TOKEN "***********************************************"

/* Для работы с telegram я долго искал и пробовал разные библиотеки. Лучше всего для простого бота telegram подошла библиотека от Алекса Гайвер FastBot (Алекс, спасибо тебе большое) */

#include <FastBot.h>
FastBot bot(BOT_TOKEN);

/* Далее в void setup() идёт подключение к Wi-Fi с помощью функции "connectWiFi()", а также инициализация бота*/

void setup() {
connectWiFi();
bot.attach(newMsg);
}

/* Функция вывода информации в последовательный COM-порт о новом сообщении*/

void newMsg(FB_msg& msg) {
Serial.print(msg.chatID); // ID чата
Serial.print(", ");
Serial.print(msg.username); // логин
Serial.print(", ");
Serial.println(msg.text); // текст
}

/* "Цикл" loop (бесконечный цикл) (в нём как раз и выполняется основная программа)*/

void loop() {
bot.tick();
}

/* И конечно же функция подключения к Wi-Fi*/

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");
}

Создание telegram bot(а) в Telegram

А теперь мы подошли к самой интересной части в работе с telegram - это создание самого бота, т.е. чата, куда будут поступать наши команды, а ESP32 (с уже загруженной программой) будет их анализировать.
Своего бота я создавал с помощью другого telegram bot(а) "@BotFather". Если вы создаёте (или уже создали) бота в telegram другим способом, то ничего страшного, главное - это токен бота, который надо будет вписать в программу.

Создание бота:

  • Заходим в Telegram, находим через поиск бота @BotFather и открываем чат с ним, нажав внизу экрана кнопку Start.
  • Запускаем процедуру регистрации нового бота, для чего набираем в чате с @BotFather команду /newbot
  • Далее, следуя инструкциям, вводим имя бота. Это просто его название, то, как он будет отображаться в списке контактов. Это имя потом можно будет изменить с помощью команды /setname в чате с BotFather.
  • Теперь нужно ввести username. Это уже строковый идентификатор, используемый для ссылок на бота. Его нельзя менять, он должен быть уникальным и должен обязательно заканчиваться на bot. Если вы введёте некорректный username, или такой, который уже есть в системе, BotFather сообщит Вам об этом и предложит ввести другой.
  • Если всё пройдёт успешно, BotFather напишет: «Done! Congratulations on your new bot…», и далее сообщит ссылку на аккаунт вашего нового бота t.me/anynamebot, а также токен для авторизации оператора: «Use this token to access the HTTP API: anynamebottoken«.

Работа с telegram bot(ом) и ESP32:

  • После того как вы получили токен бота, Вы должны вписать его в поле "BOT_TOKEN" в скетче (программе) в Arduino IDE
  • Теперь загружаем скетч (программу в ESP32)(Если вы никогда не загружали скетч в ESP32, то скоро по этой теме выйдет моя статья)
  • Далее, в telegram находим своего бота, пишем "/start" и отправляем любое сообщение. В COM-порт должны прийти данные о сообщении и пользователе, который использует вашего бота.
Информация от бота: "ID чата, логин, текст сообщения”
Информация от бота: "ID чата, логин, текст сообщения”

Всё это конечно хорошо… получать данные о пользователях, но давайте научим нашего бота отвечать на эти сообщения!)
Разберём пример скетча для ответа на слово "Hello"!

Программа для ответа на слово "Hello":

#define WIFI_SSID "**********"
#define WIFI_PASS "**********"
#define BOT_TOKEN "***********************************************"
#include <FastBot.h>
FastBot bot(BOT_TOKEN);
void setup() {
connectWiFi();
bot.attach(newMsg);
}
void newMsg(FB_msg& msg) {
String tem = "("+msg.chatID+", "+msg.username+", "+msg.text+")";
if(msg.text == "Hello"){
String otp = "Привет!";
bot.sendMessage(otp, msg.chatID);
Serial.println(tem+otp);
}
Serial.println(tem);
}
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)":

void newMsg(FB_msg& msg) {
String tem = "("+msg.chatID+", "+msg.username+", "+msg.text+")";
if(msg.text == "Hello"){
String otp = "Привет!";
bot.sendMessage(otp, msg.chatID);
otp = "На сообщение отправить == "+otp;
Serial.println(tem+otp);
}
Serial.println(tem);
}

Теперь бот отвечает на слово "Hello" словом "Привет!"