Telegram bot API

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

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

Re: Telegram bot API

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

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

Re: Telegram bot API

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

Возник еще вопрос по обертке.
Пишу бота, который по плану будет принимать фото и сохранять их в базу данных. Есть ли какой-то готовый примерчик обработки поступающих сообщений с файлами или даже с фотками? Или нужно допиливать обертку?
slyubez
постоялец
 
Сообщения: 173
Зарегистрирован: 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
энтузиаст
 
Сообщения: 668
Зарегистрирован: 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
постоялец
 
Сообщения: 173
Зарегистрирован: 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
энтузиаст
 
Сообщения: 668
Зарегистрирован: 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
постоялец
 
Сообщения: 173
Зарегистрирован: 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
энтузиаст
 
Сообщения: 668
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

Пред.

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

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

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

Рейтинг@Mail.ru