FastBot. Обсуждение библиотеки

Zabolotnyi

✩✩✩✩✩✩✩
18 Ноя 2024
5
1
@Att,
Пробовал только себе отправлять - то работает, то теряет сообщения (((
Вернул в скетч обработчик входящих сообщений и тикер в лупе, наблюдаю....
Пока 2 раза из двух сообщения отправлялись нормально обоим контактом.
 

AlexVoskres

✩✩✩✩✩✩✩
2 Дек 2024
1
0
Оформи код соответствующим тэгом, см. Правила
Нигде не нашёл примера, как правильно отправлять сообщения из других мест программы, кроме обработчика обновлений. Как я понял, надо использовать .isPolling() для асинхронной работы FastBot2. Правильно ли я сделал?:
while (1)
{
if (!telegram_bot.isPolling())
{
telegram_bot.sendMessage(fb::Message(menu_msg.c_str(), CHAT_ID));
break;
}
////////////////////////////////////////
telegram_bot.tick(); // тикаем в луп
///////////////////////////////////////////
vTaskDelay(5);
}
 

gidiara666

★✩✩✩✩✩✩
5 Май 2023
72
15
FastBot2:
#include <Arduino.h>

#define WIFI_SSID "PAS-3X3"
#define WIFI_PASS ""
#define BOT_TOKEN "здесь мой токенID"
#define CHAT_ID "ID1"  // здесь должны быть ID Telegram многих пользователей, но работает только если указать 1

#include <FastBot2.h>
FastBot2 bot;

void updateh(fb::Update& u) {
    if (u.isQuery()) { 
        // ответ на query
         bot.answerCallbackQuery(u.query().id());
       // реакция на query. Для удобства обработаем через хэш
        switch (u.query().data().hash()) {

            case "OutoopenON"_h:
            bot.answerCallbackQuery(u.query().id(), "Outoopen ответ"); // появляются в telegram, если нажать кнопку в инлайн меню
            bot.sendMessage(fb::Message("Outoopen включён", CHAT_ID)); // обычное сообщение
                break;

            case "OutoopenOFF"_h:
            bot.answerCallbackQuery(u.query().id(), "OutoopenOFF ответ");
            bot.sendMessage(fb::Message("Outoopen выключен", CHAT_ID));
                break;

            case "Ignore"_h:
            bot.answerCallbackQuery(u.query().id(), "answered Ignore");
            bot.sendMessage(fb::Message("Ignore", CHAT_ID));
                break;

            case "IgnoreOFF"_h:
            bot.answerCallbackQuery(u.query().id(), "answered IgnoreOFF");
            bot.sendMessage(fb::Message("IgnoreOFF", CHAT_ID));
                break;
        }
    }


    // сравнение в главном меню
if ( u.message().text() == "Open")
{
  bot.sendMessage(fb::Message("Дверь открыта", CHAT_ID)); // обычное сообщение
}


if ( u.message().text() == "Domofon")
{
    fb::Message msg("Domofon inline menu", CHAT_ID);
    fb::InlineMenu menu("OutoopenON ; OutoopenOFF ; Ignore ; IgnoreOFF, "OutoopenON;OutoopenOFF;Ignore;IgnoreOFF");
    msg.setInlineMenu(menu);
    bot.sendMessage(msg);
}

}


void setup() {
    Serial.begin(115200);
    Serial.println();

    WiFi.begin(WIFI_SSID, WIFI_PASS);
    while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
    }
    Serial.println("Connected");
    // attach
    // ============
    bot.attachUpdate(updateh);   // подключить обработчик обновлений
    bot.setToken(F(BOT_TOKEN));  // установить токен

    bot.setPollMode(fb::Poll::Long, 20000);


//////////////
fb::Message msg("Show menu", CHAT_ID);  // появляется меню в самом начале
fb::Menu menu("Open; Domofon;\n Sequrity; Switches; Temperature;\n Other; HUB; Info");
msg.setMenu(menu);  // подключить меню
bot.sendMessage(msg);
/////////////

}

void loop() {
    // вызывать тикер в loop
    bot.tick();
}
// Проблема в следующем: ежели в FastBot можно было указать CHAT_ID - и меню приходило всем участникам, либо
bot.sendMessage(mes2, msg.chatID); - и сообщение приходило именно тому, кто нажал кнопку в меню:

else if (msg.text == "Sequrity")
{
bot.showMenu(" SequrityOn \t SequrityOFF \n Menu");
String mes2;
if (securityF) {mes2 += "Состояние: охрана включена ✅\n\n";}
else {mes2 += "Состояние: охрана снята ❗\n\n";}
bot.sendMessage(mes2, msg.chatID);
}

то в FastBot2 указание нескольких ID делает код неработоспособным! Т.е. если указать: #define CHAT_ID "ID1,ID2,ID3" - работоспособность кода приведённого выше теряется.
Как же сделать много участников и как высылать ответ именно тому, кто инициировал кнопку в меню Telegram?
 
Изменено:

gidiara666

★✩✩✩✩✩✩
5 Май 2023
72
15
Вчера выдался у меня выходной, разобрался в некоторых функциях FastBot2.
В приведённом примере показано как:
1. Использовать несколько TelegramID
2. Заносить в память ESP и юзать далее TelegramID и BotID.
3. Использование Инлайн меню с откликами об исполнении команд, с постоянным неизменным основным меню.
4. Отправка сообщений "По факту изменения состояния порта контроллера", рассылка - всем указанным в telegramID списке
5. Вывод информации в Telegram индивидуально, по запросу для Id, с которого пришёл запрос.
Пока не понял, как сделать запрет на исполнение команд, которые были введены до старта контроллера, механизм заклинаний сильно отличается от первой версии, у кого получилось - не стесняйтесь со своими примерами.
Нашёл баг: все инлайн меню необходимо делать при помощи Builder, при написании inline menu "вручную" (вся терминология - создателя FastBot2) - глюки либо ложные срабатывания при нажатии на 3-ю и далее кнопки, расположенных по 2 в ряд, с множественными столбцами, если их только две - работают отлично.
PS. В коде отсутствует фильтрация по ID и каждый может подавать команды на выполнение. Это легко исправляется при помощи парсинга ID после каждого сообщения в бот и соответствующую реакцию логики кода на разные ID
 

Вложения

Изменено:

Att

✩✩✩✩✩✩✩
14 Фев 2024
16
3
@gidiara666,
После подключения к wifi, до первого тика бота вызвать
bot.skipUpdates(-1)
bot.setOnline(1)
Отслеживать Wifi. Если нет подключения, то
bot.setOnline(0)
 
  • Лойс +1
Реакции: gidiara666

Kinder1664

✩✩✩✩✩✩✩
30 Дек 2024
1
0
@pingemall, Привет, случайно не нашел решение данного вопроса? Просто с толкнулся с этой же проблемой. Записываю название сети, пароль, Token и Chat id в EEPROM. Сеть запоминает, а вот как подсунуть сохранённый токен и id не понимаю.

Разобрался как менять токен, взяв его из EEPROM. Как подсунуть CHAT id пока глубоко не вникал, но вроде должно быть не трудно
 
Изменено:

mikolaki

✩✩✩✩✩✩✩
25 Янв 2022
19
0
Всех с праздниками!!
Как сделать, чтобы бот выделял часть сообщения полужирным шрифтом или курсивом? Нагуглил, что чтобы сделать текст полужирным, надо заключить в двойные звёздочки. Если отправлять сообщение из телегама, то получается, если из бота то нет. Что-то кажется мне, что это как-то совсем просто, но...
 

gidiara666

★✩✩✩✩✩✩
5 Май 2023
72
15
Почитать инструкции пытались? Вы описываете разметку Markdown. Если ее указать в параметрах бота, то он тогда, разумеется, станет подчиняться правилам этой разметки. Я предпочитаю HTML разметку, у нее меньше ограничений и чудных сюрпризов, например, при попытке использовать знак !.
 
  • Лойс +1
Реакции: mikolaki

Veter_Sokola

✩✩✩✩✩✩✩
9 Фев 2025
1
0
Ребят всем доброго времени суток 🍃 Хотелось бы спросить про FastBot, кто знает, как правильно написать простейшее меню ? Сколько не пытаюсь ничего не выходит. Я новичок и дилетант в этой теме. Но если есть добрые люди тут. Скиньте примеры с меню разных типов 🥹 Как целой программы 🤔 Заранее большое спасибо тому человеку ✨
 

mikolaki

✩✩✩✩✩✩✩
25 Янв 2022
19
0
@Veter_Sokola, в архиве с библиотекой есть папка examples. Там есть примеры, с меню несколько разных
 

faradayz

✩✩✩✩✩✩✩
2 Фев 2025
3
0
Всем привет, есть возможность с этой библиотеки взаимодействовать с WebApps ? (Открытие, отправка запроса)
Если кто-то делал, подскажите как
 

DmitriiPowell

✩✩✩✩✩✩✩
11 Мар 2025
1
0
Всем доброго дня.
Подскажите знающие люди. Тестирую инлайн-меню. ESP8266, Arudion IDE 2.3.4. Библиотека FastBot2 1.0.12
Скетч взял из examples библиотеки.
Меню отображается. Но при нажатии на любую кнопку кроме ссылки обработчик не запускается. ПРи этом если отправить любой другой текст в чат бот, то обработчик отрабатывает. В чем может быть проблема ? В настройках бота Inline Mode включен, Inline Feedback 100% (пробовал разные, не влияет).

Ниже скетч
#include <Arduino.h>
#define WIFI_SSID "************"
#define WIFI_PASS "*************"
#define BOT_TOKEN "*******************"
#define CHAT_ID "******************"
#include <FastBot2.h>
FastBot2 bot;
void updateh(fb::Update& u) {
Serial.println("Обработчик вызван");
Serial.println(u.query().id());
if (u.isQuery()) {
Serial.println("NEW QUERY");
Serial.println(u.query().data());
// ответ на query
// bot.answerCallbackQuery(u.query().id());
//bot.answerCallbackQuery(u.query().id(), "query answered");
bot.answerCallbackQuery(u.query().id(), u.query().data(), true);
// реакция на query. Для удобства обработаем через хэш
switch (u.query().data().hash()) {
case "test"_h:
// кнопка kek1
Serial.println("включить светодиод");
break;
case "pest"_h:
// кнопка kek2
break;
case "lol"_h:
// кнопка kek3
break;
}
}
}
void setup() {
Serial.begin(9600);
Serial.println();
WiFi.begin(WIFI_SSID, WIFI_PASS);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("Connected");
// ============
bot.attachUpdate(updateh); // подключить обработчик обновлений
bot.setToken(F(BOT_TOKEN)); // установить токен
// режим опроса обновлений. Самый быстрый - Long
// особенности читай тут в самом низу
// https://github.com/GyverLibs/FastBot2/blob/main/docs/3.start.md
// bot.setPollMode(fb::poll::Sync, 4000); // умолч
//bot.setPollMode(fb::poll::Async, 4000);
bot.setPollMode(fb::poll::Long, 20000);
fb::Message msg("Show menu!", CHAT_ID);
fb::InlineMenu menu;
menu.addButton("BUTTON 1"); // если data не указана - она становится текстом на кнопке
menu.addButton("BUTTON 2", "test"); // callback data
menu.newRow();
menu.addButton("BUTTON 3", "https://www.google.ru/"); // кнопка-ссылка
msg.setInlineMenu(menu); // подключить меню
// отправить
bot.sendMessage(msg);
// fb::Message msg("Show menu!", "id чата");
// fb::Menu menu;
// задаётся в CSV: горизонтальный разделитель ; вертикальный - \n
// menu.text = "kek 1 ; kek 2 ; kek 3 \n kek 4 ; kek 5";
// menu.resize = 1;
// menu.placeholder = "placeholder";
// msg.setMenu(menu); // подключить меню
// bot.sendMessage(msg);
}
void loop() {
// вызывать тикер в loop
bot.tick();
}
 
Изменено:

Gr2000

✩✩✩✩✩✩✩
21 Апр 2025
1
0
Добрый день. Подскажите пожалуйста: Как получить ник по id телеграмм применительно к этой библиотеке. Есть бот который принимает от разных пользователей команды, есть id пользователя которое он может присылать в чат в качестве лога/подтверждения, но uint32 это не человеко-читаемые примитивы, нужен вместо него Ник @UserName. Как это можно реализовать на ESP?
 

Alexsnek

✩✩✩✩✩✩✩
12 Мар 2024
2
0
Здравствуйте! В FastBot возникла проблема, при создании команды showMenuText, необходимо было создать два меню. Одно отослать себе, другое в группу в которой находится этот бот. Свои id были прописаны в конкретном меню, но почему-то отправляется по порядку меню и мне и в группу приходят оба меню, видно по названиям, но отображается последнее по списку меню. Может кто сталкивался с данной ситуацией?
 

Hawk617

✩✩✩✩✩✩✩
6 Май 2025
3
0
@DmitriiPowell, У себя в Switch-case'е, который разбирает обновления (точнее query), хеш вычислял следующей конструкцией
C++:
      case SH("alarm"):
И bot.answerCallbackQuery(....); у меня уже после свича (под кейсами отчечаю в зависимости от того что надо
 

Hawk617

✩✩✩✩✩✩✩
6 Май 2025
3
0
@Gr2000,
Если отвечаем на запрос (query):
 String un = u.query().message().chat().username().decodeUnicode();
Если отвечаем на сообщения.:
String un = u.message().chat().username().decodeUnicode();
А вот как узнать в произвольный момент по ChatID username, я не придумал. Острой нужды пока нет, все равно логируют обычно то, что пришло в ботик.
decodeUnicode(); -- на всякий случай, не помню, можно ли в никах русский язык.
 

Hawk617

✩✩✩✩✩✩✩
6 Май 2025
3
0
Подскажите, кто активно пользовался.
Вызываю sendMessage() не из обработчика, а по данным с датчика. В этот момент контроллер зависает на ~1-2 с. Сообщение не отправляется, а в консоль вываливается:
[ 88047][E][ssl_client.cpp:37] _handle_error(): [start_ssl_client():273]: (-78) UNKNOWN ERROR CODE (004E)
[ 88057][E][WiFiClientSecure.cpp:144] connect(): start_ssl_client: -78
[ 88065][E][ssl_client.cpp:107] start_ssl_client(): select on fd -1, errno: 9, "Bad file number"
[ 88074][E][WiFiClientSecure.cpp:144] connect(): start_ssl_client: -1
Из обработчика апдейтов все работает штатно.
В доках нашел про проверку isPolling (), но не очень понял как этим пользоваться. Ждать в конкретно этом месте возможности отправить не хочется, получается придется самому городить буфер сообщений, или в FB2 все же есть готовый прием на этот случай?