Re: Telegram bot API
Добавлено: 30.11.2022 21:10:39
Ясно. *тут Эмоджи класс* (как в телеграм)
Код: Выделить всё
procedure sendVideo;
procedure sendVideoByFileName;
procedure sendVideoStream;
procedure sendPhoto;
procedure sendPhotoByFileName;
procedure sendMediaGroup;
procedure sendMediaGroupByFileName;Код: Выделить всё
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; Код: Выделить всё
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; А не сразу понял. Так Вы все правильно разобрались. Но есть один момент. При отправке изображений как фото (изображение в телеграм можно отправлять как файл, тогда он не будет сжиматься в несколько форматов), телеграм в обновлении присылает массив разных размеров одного фото. В первом будет самое сжатое. Поэтому, чтобы получить самое большое нужно использовать Photo.Last (ну или как в вашем примере, я вижу: Photo[Photo.Count-1]). Но, нужно понимать, что оно все равно будет сжатый - в этом смысле отправки подготовленного фото в мессенджере. Если через телеграм боту нужно отправить несжатое фото, то отправлять его нужно как документ (в телеграм мессенджерах можно просто снимать галочку сжимать фото) и отправлять как sendDocumentslyubez писал(а):Я имел в виду прием файлов из сообщений.
Анализируя библиотеку, решил пока ограничиться записью в файл. Написал такой код, но он почему-то сохраняет только сжатую картинку.Добавлено спустя 16 минут 36 секунд:Код: Выделить всё
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;
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
Телеграм сервер при отправке фото сам делает несколько размеров и отправляет их в JSON массиве Photo.slyubez писал(а):Я пока не очень понимаю, как так происходит, но при отправке фото с телефона число файлов оказывается равно четырем.
Добавлено спустя 52 секунды:"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
}
]
Понятно, пишите, если чтоslyubez писал(а):Большое спасибо, я это понял, пока сейчас экспериментировал.
https://ibb.co/Hx6QPBz вот скринIchthyander писал(а):Здравствуйте!
Аттача не вижу. Но предположу, что fphttpclient не находит библиотеку OpenSSL. Попробуйте установить в систему OpenSSL https://slproweb.com/products/Win32OpenSSL.html или положите в папку с программой файлы libeay32.dll и ssleay32.dll (нужной битности)
Собственно, скрин только усилил мою версию о проблеме с OpenSSL. Проблема в защищенного соединении https для нативного клиента fphttpclient. На рабочем компьютере у Вас OpenSSL библиотеки установлены. На домашнем - нет. Попробуйте мою инструкцию вышеSer9056 писал(а):https://ibb.co/Hx6QPBz вот скрин
Установил, та же самая ошибка.Ichthyander писал(а):Собственно, скрин только усилил мою версию о проблеме с OpenSSL. Проблема в защищенного соединении https для нативного клиента fphttpclient. На рабочем компьютере у Вас OpenSSL библиотеки установлены. На домашнем - нет. Попробуйте мою инструкцию вышеSer9056 писал(а):https://ibb.co/Hx6QPBz вот скрин