Telegram bot API

Планы, идеология, архитектура и т.п.

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

Re: Telegram bot API

Сообщение Ichthyander » 30.11.2022 22:10:39

Ясно. *тут Эмоджи класс* (как в телеграм)
Аватара пользователя
Ichthyander
энтузиаст
 
Сообщения: 685
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

Re: Telegram bot API

Сообщение Ichthyander » 09.12.2023 20:13:23

Итак, сделал дизайн-тайм компонент.
https://github.com/Al-Muhandis/fp-teleg ... ram_dt.lpk
Это готовый longpolling телеграм бот, который вы можете использовать для быстрой разработки ботов для телеграм. здесь (https://github.com/Al-Muhandis/fp-teleg ... ongpolling)) о longpolling телеграм ботах. Этот компонент можно использовать в приложениях с графическим и не графическим интерфейсом, демонах и службах и даже на веб-сервере (хотя на веб-сервере я предпочитаю web-хуки).
Реализовал создание клавиатуры для телеграм ботов в дизайн-тайм.
Простой пример использования: https://github.com/Al-Muhandis/fp-teleg ... DesignTime и почти никакого кодинга.
2023-12-09_17-04-22.png
2023-12-09_17-05-41.png
2023-12-09_17-06-11.png
Аватара пользователя
Ichthyander
энтузиаст
 
Сообщения: 685
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

Re: Telegram bot API

Сообщение slyubez » 29.01.2024 01:48:26

Возник еще вопрос по обертке.
Пишу бота, который по плану будет принимать фото и сохранять их в базу данных. Есть ли какой-то готовый примерчик обработки поступающих сообщений с файлами или даже с фотками? Или нужно допиливать обертку?
slyubez
постоялец
 
Сообщения: 174
Зарегистрирован: 31.03.2015 08:44:07

Re: Telegram bot API

Сообщение Ichthyander » 29.01.2024 11:45:34

В папке tests в модуле testtelegram.pas есть процедуры:
Код: Выделить всё
    procedure sendVideo; 
    procedure sendVideoByFileName;
    procedure sendVideoStream;
    procedure sendPhoto;
    procedure sendPhotoByFileName;
    procedure sendMediaGroup;     
    procedure sendMediaGroupByFileName;

Можно посмотреть как они реализованы (это не все примеры возможной работы с медиа конечно - в тесты добавляю процедуры по необходимости).
В принципе, если кратко: можно отправлять через Stream, можно отправлять по имени файла, можно отправлять ко предварительно сохраненному хешу/ID в самом телеграме. Если нужно могу добавить в примере то, что требуется показать
Аватара пользователя
Ichthyander
энтузиаст
 
Сообщения: 685
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

Re: Telegram bot API

Сообщение slyubez » 29.01.2024 12:17:20

Я имел в виду прием файлов из сообщений.
Анализируя библиотеку, решил пока ограничиться записью в файл. Написал такой код, но он почему-то сохраняет только сжатую картинку.
Код: Выделить всё
uses tgsendertypes, tgtypes, tgfclhttpclientbroker, httpsend;
...
procedure TDM.BotReceiveMessage(ASender: TObject; AMessage: TTelegramMessageObj);
var s, s1: String;
    fid: String;
begin
Log(AMessage.Text);
if AMessage.Text='/stop'
  then begin
        IsTerminating:=True;
        Exit;
       end;
if AMessage.Photo.Count>0
  then begin
        s:='Photo is sended from ChatID='+IntToStr(AMessage.ChatId);
        Log(s);
        fid:=AMessage.Photo[0].FileID;
        if not FBot.getFile(fid)
         then begin
               Log('Error getting file.');
               Exit;
              end;
        s:=FBot.FileObj.DownloadLink(BOTTOKEN);
        s1:=Cfg.FilesDir+FormPhotoFileName;
        if not DownloadHTTP(s, s1)
         then begin
               Log('Error downloading file.');
               Exit;
              end;
       end;
end;     


Добавлено спустя 16 минут 36 секунд:
UPD.
Модифицировал код.
Код: Выделить всё
procedure TDM.BotReceiveMessage(ASender: TObject; AMessage: TTelegramMessageObj);
var s, s1: String;
    fid: String;
    i, j: Integer;
begin
Log(AMessage.Text);
if AMessage.Text='/stop'
  then begin
        IsTerminating:=True;
        Exit;
       end;
i:=AMessage.Photo.Count;
if i>0
  then begin
        s:='Photo is sended from ChatID='+IntToStr(AMessage.ChatId);
        Log(s);
        for J:=0 to i-1
         do begin
             fid:=AMessage.Photo[J].FileID;
             if not FBot.getFile(fid)
              then begin
                    Log('Error getting file.');
                    Exit;
                   end;
             s:=FBot.FileObj.DownloadLink(BOTTOKEN);
             s1:=Cfg.FilesDir+FormPhotoFileName(J+1);
             if not DownloadHTTP(s, s1)
              then begin
                    Log('Error downloading file');
                    Exit;
                   end;
            end;
       end;
end;

Я пока не очень понимаю, как так происходит, но при отправке фото с телефона число файлов оказывается равно четырем.
Скачал все файлы, посмотрел их... Это картинки с разной степенью сжатия по размеру. Но исходной картинки, по-видимому, нет.
Последний раз редактировалось slyubez 29.01.2024 12:42:11, всего редактировалось 1 раз.
slyubez
постоялец
 
Сообщения: 174
Зарегистрирован: 31.03.2015 08:44:07

Re: Telegram bot API

Сообщение Ichthyander » 29.01.2024 12:40:25

slyubez писал(а):Я имел в виду прием файлов из сообщений.
Анализируя библиотеку, решил пока ограничиться записью в файл. Написал такой код, но он почему-то сохраняет только сжатую картинку.
Код: Выделить всё
uses tgsendertypes, tgtypes, tgfclhttpclientbroker, httpsend;
...
procedure TDM.BotReceiveMessage(ASender: TObject; AMessage: TTelegramMessageObj);
var s, s1: String;
    fid: String;
begin
Log(AMessage.Text);
if AMessage.Text='/stop'
  then begin
        IsTerminating:=True;
        Exit;
       end;
if AMessage.Photo.Count>0
  then begin
        s:='Photo is sended from ChatID='+IntToStr(AMessage.ChatId);
        Log(s);
        fid:=AMessage.Photo[0].FileID;
        if not FBot.getFile(fid)
         then begin
               Log('Error getting file.');
               Exit;
              end;
        s:=FBot.FileObj.DownloadLink(BOTTOKEN);
        s1:=Cfg.FilesDir+FormPhotoFileName;
        if not DownloadHTTP(s, s1)
         then begin
               Log('Error downloading file.');
               Exit;
              end;
       end;
end;     


Добавлено спустя 16 минут 36 секунд:
UPD.
Модифицировал код.
Код: Выделить всё
procedure TDM.BotReceiveMessage(ASender: TObject; AMessage: TTelegramMessageObj);
var s, s1: String;
    fid: String;
    i: Integer;
begin
Log(AMessage.Text);
...
i:=AMessage.Photo.Count;
if i>0
  then begin
        s:='Photo is sended from ChatID='+IntToStr(AMessage.ChatId);
        Log(s);
        fid:=AMessage.Photo[i-1].FileID;
        if not FBot.getFile(fid)
         then begin
               Log('Error getting file.');
               Exit;
              end;
        s:=FBot.FileObj.DownloadLink(BOTTOKEN);
        s1:=Cfg.FilesDir+FormPhotoFileName;
        if not DownloadHTTP(s, s1)
         then begin
               Log('Error downloading file.');
               Exit;
              end;
       end;
end;

Я пока не очень понимаю, как так происходит, но при отправке фото с телефона число файлов оказывается равно четырем.

А не сразу понял. Так Вы все правильно разобрались. Но есть один момент. При отправке изображений как фото (изображение в телеграм можно отправлять как файл, тогда он не будет сжиматься в несколько форматов), телеграм в обновлении присылает массив разных размеров одного фото. В первом будет самое сжатое. Поэтому, чтобы получить самое большое нужно использовать Photo.Last (ну или как в вашем примере, я вижу: Photo[Photo.Count-1]). Но, нужно понимать, что оно все равно будет сжатый - в этом смысле отправки подготовленного фото в мессенджере. Если через телеграм боту нужно отправить несжатое фото, то отправлять его нужно как документ (в телеграм мессенджерах можно просто снимать галочку сжимать фото) и отправлять как sendDocument
Аватара пользователя
Ichthyander
энтузиаст
 
Сообщения: 685
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

Re: Telegram bot API

Сообщение slyubez » 29.01.2024 12:43:29

ри отправке изображений как фото (изображение в телеграм можно отправлять как файл, тогда он не будет сжиматься в несколько форматов), телеграм в обновлении присылает массив разных размеров одного фото. В первом будет самое сжатое. Поэтому, чтобы получить самое большое нужно использовать Photo.Last (ну или как в вашем примере, я вижу: Photo[Photo.Count-1]). Но, нужно понимать, что оно все равно будет сжатый - в этом смысле отправки подготовленного фото в мессенджере. Если через телеграм боту нужно отправить несжатое фото, то отправлять его нужно как документ (в телеграм мессенджерах можно просто снимать галочку сжимать фото) и отправлять как sendDocument

Большое спасибо, я это понял, пока сейчас экспериментировал.
slyubez
постоялец
 
Сообщения: 174
Зарегистрирован: 31.03.2015 08:44:07

Re: Telegram bot API

Сообщение Ichthyander » 29.01.2024 12:44:02

slyubez писал(а):Я пока не очень понимаю, как так происходит, но при отправке фото с телефона число файлов оказывается равно четырем.

Телеграм сервер при отправке фото сам делает несколько размеров и отправляет их в JSON массиве Photo.
Чтобы получить самое сжатое: Photo.First, самое несжатое Photo.Last. Элементы массива содержат также размеры каждого фото. К примеру, телеграм сервер нашему боту отправляет что-то вроде этого в массиве Photo:
"photo" : [
{
"file_id" : "AgACAgIAAxkBAAILe2W3YegJffY_qgWe4qDQKrc4_owsAAK00TEb1zLBSXUeKR-DP1RUAQADAgADcwADNAQ",
"file_unique_id" : "AQADtNExG9cywUl4",
"file_size" : 1754,
"width" : 90,
"height" : 90
},
{
"file_id" : "AgACAgIAAxkBAAILe2W3YegJffY_qgWe4qDQKrc4_owsAAK00TEb1zLBSXUeKR-DP1RUAQADAgADbQADNAQ",
"file_unique_id" : "AQADtNExG9cywUly",
"file_size" : 30924,
"width" : 320,
"height" : 320
},
{
"file_id" : "AgACAgIAAxkBAAILe2W3YegJffY_qgWe4qDQKrc4_owsAAK00TEb1zLBSXUeKR-DP1RUAQADAgADeAADNAQ",
"file_unique_id" : "AQADtNExG9cywUl9",
"file_size" : 62860,
"width" : 512,
"height" : 512
}
]


Добавлено спустя 52 секунды:
slyubez писал(а):Большое спасибо, я это понял, пока сейчас экспериментировал.

Понятно, пишите, если что
Аватара пользователя
Ichthyander
энтузиаст
 
Сообщения: 685
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

Re: Telegram bot API

Сообщение Ser9056 » 30.03.2024 17:31:32

Ichthyander Здравствуйте!
Спасибо за отличную разработку! Я только пытаюсь разобраться с ботом на паскале, и у меня следующий вопрос.
На рабочем компьютере бот работает без проблем, а вот на домашнем ни в какую не хочет. Никакие прокси не используются. На работе и дома используются два разных провайдера.
При попытке подключиться на домашнем компьютере к боту возникает следующая ошибка (см. аттач). Изображение
Подскажите, пожалуйста, из-за чего эта ошибка? Гугление ничем толком не помогло. Как можно проверить, что всё работает корректно?
На всякий случай сообщаю, что непосредственно по ссылке https://api.telegram.org/bot_bot_id/getUpdates в браузере переходит нормально и в json-формате отображаются последние отправленные боту данные. А вот в приложении на Lazarus'е не работает. (компилировал и тестировал пример longpolling_demo из каталога DesignTime.
Ser9056
незнакомец
 
Сообщения: 7
Зарегистрирован: 30.03.2024 17:20:36

Re: Telegram bot API

Сообщение Ichthyander » 30.03.2024 22:15:39

Здравствуйте!
Аттача не вижу. Но предположу, что fphttpclient не находит библиотеку OpenSSL. Попробуйте установить в систему OpenSSL https://slproweb.com/products/Win32OpenSSL.html или положите в папку с программой файлы libeay32.dll и ssleay32.dll (нужной битности)
Аватара пользователя
Ichthyander
энтузиаст
 
Сообщения: 685
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

Re: Telegram bot API

Сообщение Ser9056 » 30.03.2024 22:42:43

Ichthyander писал(а):Здравствуйте!
Аттача не вижу. Но предположу, что fphttpclient не находит библиотеку OpenSSL. Попробуйте установить в систему OpenSSL https://slproweb.com/products/Win32OpenSSL.html или положите в папку с программой файлы libeay32.dll и ssleay32.dll (нужной битности)

https://ibb.co/Hx6QPBz вот скрин
Ser9056
незнакомец
 
Сообщения: 7
Зарегистрирован: 30.03.2024 17:20:36

Re: Telegram bot API

Сообщение Ichthyander » 30.03.2024 23:15:42

Ser9056 писал(а):https://ibb.co/Hx6QPBz вот скрин

Собственно, скрин только усилил мою версию о проблеме с OpenSSL. Проблема в защищенного соединении https для нативного клиента fphttpclient. На рабочем компьютере у Вас OpenSSL библиотеки установлены. На домашнем - нет. Попробуйте мою инструкцию выше
Аватара пользователя
Ichthyander
энтузиаст
 
Сообщения: 685
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

Re: Telegram bot API

Сообщение Ser9056 » 31.03.2024 02:00:48

Ichthyander писал(а):
Ser9056 писал(а):https://ibb.co/Hx6QPBz вот скрин

Собственно, скрин только усилил мою версию о проблеме с OpenSSL. Проблема в защищенного соединении https для нативного клиента fphttpclient. На рабочем компьютере у Вас OpenSSL библиотеки установлены. На домашнем - нет. Попробуйте мою инструкцию выше


Установил, та же самая ошибка.
Ser9056
незнакомец
 
Сообщения: 7
Зарегистрирован: 30.03.2024 17:20:36

Re: Telegram bot API

Сообщение S_Gur » 31.03.2024 12:25:08

https://github.com/Bunker-x/DTelegram

Может, тут есть что-то полезное
S_Gur
постоялец
 
Сообщения: 130
Зарегистрирован: 30.12.2018 22:17:42

Re: Telegram bot API

Сообщение Ser9056 » 31.03.2024 13:56:24

В самом первом сообщении я написал, что на рабочем компе бот работает, а на домашнем нет. Файлы libeay32.dll и ssleay32.dll безусловно присутствуют в папке с ботом. И причём без этих файлов совсем другая ошибка. Следовательно проблема не в отсутствии файлов. К тому же в браузере ссылка на https://api.telegram.org работает и в json-е нормально отображаются последние отправленные данные. Вот и непонятка. :(

add.
На работе вин10, на домашнем 11. Но есть ещё ноут с вин10. На нём тоже такая же ошибка ESocketError: Connect to api.telegram.org:443 failed
Ser9056
незнакомец
 
Сообщения: 7
Зарегистрирован: 30.03.2024 17:20:36

Пред.След.

Вернуться в Разработки на нашем сайте

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

Сейчас этот форум просматривают: Yandex [Bot] и гости: 15

Рейтинг@Mail.ru