8080 v2.12: поправлены примеры, исправлен парсинг isBot, переделан механизм защиты от длинных сообщений, переделана инициализация
8181 v2.13: Оптимизация памяти. Добавил OTA обновление
8282 v2.14: Улучшен парсинг строки с ID, добавил отключение OTA, добавил парсинг названия группы/канала в username
83+ v2.15: Заплатка для кривой библиотеки ESP32
8384*/
8485
8586/*
117118#endif
118119#include < WiFiClientSecure.h>
119120#include < WiFiClientSecureBearSSL.h>
120- static BearSSL::WiFiClientSecure _FB_client;
121- static HTTPClient _FB_http;
122-
121+ BearSSL::WiFiClientSecure _FB_client;
123122#else // ESP32
124123#include < WiFi.h>
125124#include < HTTPClient.h>
126125#ifndef FB_NO_OTA
127126#include < HTTPUpdate.h>
128127#endif
129128#include < WiFiClientSecure.h>
130- WiFiClientSecure _FB_client;
131- static HTTPClient _FB_http;
132129#endif
133130
134131// ================================
135132class FastBot {
136133public:
137134 // инициализация (токен, макс кол-во сообщений на запрос, макс символов, период)
138135 FastBot (String token = " " , uint16_t limit = 10 , uint16_t ovf = 0 , uint16_t period = 3600 ) {
136+ _http = new HTTPClient;
139137 _token.reserve (46 );
140138 chatIDs.reserve (10 );
141139 _token = token;
142140 _limit = limit;
143141 _ovf = ovf;
144142 _prd = period;
145143 setBufferSizes (512 , 512 );
144+ #ifdef ESP8266
146145 _FB_client.setInsecure ();
146+ #endif
147+ }
148+
149+ ~FastBot () {
150+ if (_http) delete _http;
147151 }
148152
149153 // ===================== НАСТРОЙКИ =====================
@@ -210,9 +214,18 @@ class FastBot {
210214 req += ID;
211215 // req += F("&allowed_updates=[\"update_id\",\"message\",\"edited_message\",\"channel_post\",\"edited_channel_post\",\"callback_query\"]");
212216
213- if (!_FB_http.begin (_FB_client, req)) return 4 ; // ошибка подключения
214- if (_FB_http.GET () != HTTP_CODE_OK) {
215- _FB_http.end ();
217+ #ifdef ESP8266
218+ if (!_http->begin (_FB_client, req)) return 4 ; // ошибка подключения
219+ #else
220+ if (!_http->begin (req)) return 4 ; // ошибка подключения
221+ #endif
222+ int answ = _http->GET ();
223+ if (answ != HTTP_CODE_OK) {
224+ _http->end ();
225+ if (answ == -1 && _http) { // заплатка для есп32
226+ delete _http;
227+ _http = new HTTPClient;
228+ }
216229 return 3 ; // ошибка сервера телеграм
217230 }
218231
@@ -229,18 +242,18 @@ class FastBot {
229242 }
230243 #endif
231244
232- int size = _FB_http. getSize ();
245+ int size = _http-> getSize ();
233246 ovfFlag = size > 25000 ; // 1 полное сообщение на русском языке или ~5 на английском
234247 uint8_t status = 1 ; // OK
235248 if (size) { // не пустой ответ?
236249 StreamString sstring;
237250 if (!ovfFlag && sstring.reserve (size + 1 )) { // не переполнен и хватает памяти
238- _FB_http. writeToStream (&sstring); // копируем
239- _FB_http. end (); // завершаем
251+ _http-> writeToStream (&sstring); // копируем
252+ _http-> end (); // завершаем
240253 return parseMessages (sstring); // парсим
241254 } else status = 2 ; // переполнение
242255 } else status = 3 ; // пустой ответ
243- _FB_http. end ();
256+ _http-> end ();
244257 return status;
245258 }
246259
@@ -644,12 +657,29 @@ class FastBot {
644657 }
645658
646659 uint8_t sendRequest (String& req) {
647- if (!_FB_http.begin (_FB_client, req)) return 4 ; // ошибка подключения
660+ #ifdef ESP8266
661+ if (!_http->begin (_FB_client, req)) return 4 ; // ошибка подключения
662+ #else
663+ if (!_http->begin (req)) return 4 ;
664+ #endif
665+ int answ = _http->GET ();
666+ if (answ == -1 && _http) { // заплатка для есп32
667+ _http->end ();
668+ delete _http;
669+ _http = new HTTPClient;
670+ // постучимся ещё раз
671+ #ifdef ESP8266
672+ if (!_http->begin (_FB_client, req)) return 4 ; // ошибка подключения
673+ #else
674+ if (!_http->begin (req)) return 4 ;
675+ #endif
676+ answ = _http->GET ();
677+ }
648678 uint8_t status = 1 ;
649- if (_FB_http. GET () == HTTP_CODE_OK && _FB_http. getSize ()) { // есть ответ и он не пустой
650- parseRequest (_FB_http. getString ()); // парсим
651- } else status = 3 ; // некорректный ответ
652- _FB_http. end ();
679+ if (answ == HTTP_CODE_OK && _http-> getSize ()) { // есть ответ и он не пустой
680+ parseRequest (_http-> getString ()); // парсим
681+ } else status = 3 ; // некорректный ответ
682+ _http-> end ();
653683 return status;
654684 }
655685
@@ -914,7 +944,8 @@ class FastBot {
914944 }
915945 #endif
916946 }
917-
947+
948+ HTTPClient *_http = nullptr ;
918949 void (*_callback)(FB_msg& msg) = nullptr ;
919950 String _token;
920951 String _otaID;
0 commit comments