Ошибки http >500 от api telegram

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ошибки http >500 от api telegram

Сообщение jsa » 07.10.2024 11:39:38

Здравствуйте.

Соорудил телебота для работы с базой на ms sql server
работает как служба windows
Новые сообщения получаю через IdHTTP (Indy10) запросом getUpdate (т.е. НЕ используется web хуки и собственный вебсервер для получения сообщений) по таймеру раз в 500мс (между окончанием и началом нового цикла получения и обработки входящих сообщений)

Компонента создается для каждого запроса TidHTTP.Create(nil);
И удаляется в конце процедуры.

Код: Выделить всё
     IdHTTP_post:=TidHTTP.Create(nil);
     IdHTTP_post.IOHandler:=TIdSSLIOHandlerSocketOpenSSL.Create(nil);
     TIdSSLIOHandlerSocketOpenSSL(IdHTTP_post.IOHandler).SSLOptions.SSLVersions := [sslvTLSv1, sslvTLSv1_1, sslvTLSv1_2];
     TIdSSLIOHandlerSocketOpenSSL(IdHTTP_post.IOHandler).SSLOptions.Method := sslvTLSv1_2; 

    IdHTTP_post.Request.ContentType:='application/json';
    IdHTTP_post.Request.Accept:='text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8';
    IdHTTP_post.Request.UserAgent:='Mozilla/3.0 (compatible; Indy Library)';
    IdHTTP_post.Request.ContentLength:=18;

    IdHTTP_post.HTTPOptions:=[hoForceEncodeParams,hoWaitForUnexpectedData,hoWantProtocolErrorContent, hoNoProtocolErrorException]; 

...

    IdHTTP_post.Disconnect;
    IdHTTP_post.Free; 



Иногда неделями работает стабильно.
Иногда в логах нахожу ошибоки Host not found и Connection refused. И при этом код ошибки 522 Connection timed out

Код: Выделить всё
2024-09-28_09:52:56.909 - Exception "telebot_post" --- EIdSocketError: Socket Error # 10061 / Connection refused.
2024-09-28_09:52:56.925 - ResponceCode=522

2024-09-28_09:53:03.044 - Exception "telebot_post" --- EIdSocketError: Socket Error # 10061 / Connection refused.
2024-09-28_09:53:03.059 - ResponceCode=522

2024-09-28_09:53:09.463 - Exception "telebot_post" --- EIdSocketError: Socket Error # 10061 / Connection refused.
2024-09-28_09:53:09.478 - ResponceCode=522

2024-09-28_09:53:35.584 - Exception "telebot_post" --- EIdSocketError: Socket Error # 10060 / Connection timed out.
2024-09-28_09:53:35.600 - ResponceCode=522

2024-09-28_09:53:51.768 - Exception "telebot_post" --- EIdSocketError: Socket Error # 11001 / Host not found.
2024-09-28_09:53:51.783 - ResponceCode=522

2024-09-28_09:54:07.964 - Exception "telebot_post" --- EIdSocketError: Socket Error # 11001 / Host not found.
2024-09-28_09:54:07.979 - ResponceCode=522

2024-09-28_09:54:24.136 - Exception "telebot_post" --- EIdSocketError: Socket Error # 11001 / Host not found.
2024-09-28_09:54:24.151 - ResponceCode=522


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

Как увеличить в TidHTTP таймаут и какие значения нужно ставить не смог найти.
И нужно ли это делать не понятно.

Может что посоветуете?
jsa
постоялец
 
Сообщения: 282
Зарегистрирован: 28.11.2017 13:46:04

Re: Ошибки http >500 от api telegram

Сообщение Ichthyander » 08.10.2024 01:58:10

А fp-telegram из принципа не хотите использовать? Там все готовое )
Что-то я подозреваю, делаете совсем не то. Какой имеется ввиду таймер? Таймаут в параметрах getUpdate? Так там невозможно указать 0,5 секунды. Какой-то свой таймер, который делает какие-то паузы между лонгполлингами? Непонятен смысл тогда. Можно показать хотя бы кусочек кода, где указан getUpdates c параметрами?
Host not resolve скорее означает обрывы соединения кратковременные.
Но если Вы вдруг делаете лонгполлинги без таймаута с паузами в 0,5 секунд, то это может вас блокировать сам телеграм сервер за ддос их сайта )
Аватара пользователя
Ichthyander
энтузиаст
 
Сообщения: 685
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

Re: Ошибки http >500 от api telegram

Сообщение jsa » 08.10.2024 07:33:30

Ichthyander писал(а):А fp-telegram из принципа не хотите использовать? Там все готовое )

Нет, не из принципа. Надо будет рассмотреть еще раз.
Когда начинал разбираться сходу не осилил (смотрел разные варианты библиотек), и мне проще оказалось "вручную" формировать http запросы, потому что уже был опыт и код такой работы со всякими самодельными API.

Ichthyander писал(а):Что-то я подозреваю, делаете совсем не то. Какой имеется ввиду таймер? Таймаут в параметрах getUpdate?

Обычный таймер TTimer в Lazarus

Ichthyander писал(а):Так там невозможно указать 0,5 секунды. Какой-то свой таймер, который делает какие-то паузы между лонгполлингами? Непонятен смысл тогда. Можно показать хотя бы кусочек кода, где указан getUpdates c параметрами?
Host not resolve скорее означает обрывы соединения кратковременные.
Но если Вы вдруг делаете лонгполлинги без таймаута с паузами в 0,5 секунд, то это может вас блокировать сам телеграм сервер за ддос их сайта )

Длинные запросы (https://learn.javascript.ru/long-polling) для меня новость. Не знал о такой технологии. Мои представления всегда были такие, что ответ на запрос дается всегда "мгновенно". На этот параметр (timeout) в getUpdates просто не обращал внимание.
Спасибо за наводку, буду смотреть как использовать.

Добавлено спустя 41 минуту 13 секунд:
Пока поставил выполнение TimeOut=5сек, потом новый запрос через 1 сек. Буду смотреть.
jsa
постоялец
 
Сообщения: 282
Зарегистрирован: 28.11.2017 13:46:04

Re: Ошибки http >500 от api telegram

Сообщение Ichthyander » 08.10.2024 16:34:39

jsa писал(а):Длинные запросы (https://learn.javascript.ru/long-polling) для меня новость. Не знал о такой технологии. Мои представления всегда были такие, что ответ на запрос дается всегда "мгновенно". На этот параметр (timeout) в getUpdates просто не обращал внимание.

Именно, что немгновенно. И чем дольше тем лучше для телеграм сервера. Более того, в описании API запрещено использовать нулевые таймауты для getUpdates, только в тестовых целях.

Лонгполлинг ждет выставленный таймаут: это будет время пока клиент будет ждать ответа от сервера. Если никаких updates не будет, то столько и будет ждать, после чего можно сразу без паузы отправить следующий запрос. В случае приходи апдейта, клиент сразу завершает запрос и дальше задача клиента обработать ответ.
Само собой это нужно делать в отдельном пакете, либо в худшем случае, если обработка нетяжелая делать ее в промежутке между запросами. В моей библиотеке возможно реализовать разные схемы, в том числе и с работой в отдельном потоке. В examples и других открытых репозитариях на основе fp-telegram есть примеры реализации

Добавлено спустя 37 секунд:
jsa писал(а):потом новый запрос через 1 сек

А вот в этом нет необходимости

Добавлено спустя 2 часа 53 минуты 58 секунд:
Между прочим в моей библиотеке даже появился longpolling Designtime компонент. Вообще все должно быть просто при разработке
Аватара пользователя
Ichthyander
энтузиаст
 
Сообщения: 685
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8

Рейтинг@Mail.ru