Telegram bot API
Модератор: Модераторы
- Ichthyander
- энтузиаст
- Сообщения: 701
- Зарегистрирован: 04.04.2007 08:32:43
- Откуда: Астрахань
- Контактная информация:
Ясно. *тут Эмоджи класс* (как в телеграм)
- Ichthyander
- энтузиаст
- Сообщения: 701
- Зарегистрирован: 04.04.2007 08:32:43
- Откуда: Астрахань
- Контактная информация:
Итак, сделал дизайн-тайм компонент.
https://github.com/Al-Muhandis/fp-teleg ... ram_dt.lpk
Это готовый longpolling телеграм бот, который вы можете использовать для быстрой разработки ботов для телеграм. здесь (https://github.com/Al-Muhandis/fp-teleg ... ngpolling)) о longpolling телеграм ботах. Этот компонент можно использовать в приложениях с графическим и не графическим интерфейсом, демонах и службах и даже на веб-сервере (хотя на веб-сервере я предпочитаю web-хуки).
Реализовал создание клавиатуры для телеграм ботов в дизайн-тайм.
Простой пример использования: https://github.com/Al-Muhandis/fp-teleg ... DesignTime и почти никакого кодинга.
https://github.com/Al-Muhandis/fp-teleg ... ram_dt.lpk
Это готовый longpolling телеграм бот, который вы можете использовать для быстрой разработки ботов для телеграм. здесь (https://github.com/Al-Muhandis/fp-teleg ... ngpolling)) о longpolling телеграм ботах. Этот компонент можно использовать в приложениях с графическим и не графическим интерфейсом, демонах и службах и даже на веб-сервере (хотя на веб-сервере я предпочитаю web-хуки).
Реализовал создание клавиатуры для телеграм ботов в дизайн-тайм.
Простой пример использования: https://github.com/Al-Muhandis/fp-teleg ... DesignTime и почти никакого кодинга.
Возник еще вопрос по обертке.
Пишу бота, который по плану будет принимать фото и сохранять их в базу данных. Есть ли какой-то готовый примерчик обработки поступающих сообщений с файлами или даже с фотками? Или нужно допиливать обертку?
Пишу бота, который по плану будет принимать фото и сохранять их в базу данных. Есть ли какой-то готовый примерчик обработки поступающих сообщений с файлами или даже с фотками? Или нужно допиливать обертку?
- Ichthyander
- энтузиаст
- Сообщения: 701
- Зарегистрирован: 04.04.2007 08:32:43
- Откуда: Астрахань
- Контактная информация:
В папке tests в модуле testtelegram.pas есть процедуры:
Можно посмотреть как они реализованы (это не все примеры возможной работы с медиа конечно - в тесты добавляю процедуры по необходимости).
В принципе, если кратко: можно отправлять через Stream, можно отправлять по имени файла, можно отправлять ко предварительно сохраненному хешу/ID в самом телеграме. Если нужно могу добавить в примере то, что требуется показать
Код: Выделить всё
procedure sendVideo;
procedure sendVideoByFileName;
procedure sendVideoStream;
procedure sendPhoto;
procedure sendPhotoByFileName;
procedure sendMediaGroup;
procedure sendMediaGroupByFileName;В принципе, если кратко: можно отправлять через Stream, можно отправлять по имени файла, можно отправлять ко предварительно сохраненному хешу/ID в самом телеграме. Если нужно могу добавить в примере то, что требуется показать
Я имел в виду прием файлов из сообщений.
Анализируя библиотеку, решил пока ограничиться записью в файл. Написал такой код, но он почему-то сохраняет только сжатую картинку.
Добавлено спустя 16 минут 36 секунд:
UPD.
Модифицировал код.
Я пока не очень понимаю, как так происходит, но при отправке фото с телефона число файлов оказывается равно четырем.
Скачал все файлы, посмотрел их... Это картинки с разной степенью сжатия по размеру. Но исходной картинки, по-видимому, нет.
Анализируя библиотеку, решил пока ограничиться записью в файл. Написал такой код, но он почему-то сохраняет только сжатую картинку.
Код: Выделить всё
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, 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 11:42:11, всего редактировалось 1 раз.
- Ichthyander
- энтузиаст
- Сообщения: 701
- Зарегистрирован: 04.04.2007 08:32:43
- Откуда: Астрахань
- Контактная информация:
А не сразу понял. Так Вы все правильно разобрались. Но есть один момент. При отправке изображений как фото (изображение в телеграм можно отправлять как файл, тогда он не будет сжиматься в несколько форматов), телеграм в обновлении присылает массив разных размеров одного фото. В первом будет самое сжатое. Поэтому, чтобы получить самое большое нужно использовать 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
- Ichthyander
- энтузиаст
- Сообщения: 701
- Зарегистрирован: 04.04.2007 08:32:43
- Откуда: Астрахань
- Контактная информация:
Телеграм сервер при отправке фото сам делает несколько размеров и отправляет их в JSON массиве Photo.slyubez писал(а):Я пока не очень понимаю, как так происходит, но при отправке фото с телефона число файлов оказывается равно четырем.
Чтобы получить самое сжатое: Photo.First, самое несжатое Photo.Last. Элементы массива содержат также размеры каждого фото. К примеру, телеграм сервер нашему боту отправляет что-то вроде этого в массиве Photo:
Добавлено спустя 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 писал(а):Большое спасибо, я это понял, пока сейчас экспериментировал.
Ichthyander Здравствуйте!
Спасибо за отличную разработку! Я только пытаюсь разобраться с ботом на паскале, и у меня следующий вопрос.
На рабочем компьютере бот работает без проблем, а вот на домашнем ни в какую не хочет. Никакие прокси не используются. На работе и дома используются два разных провайдера.
При попытке подключиться на домашнем компьютере к боту возникает следующая ошибка (см. аттач).
Подскажите, пожалуйста, из-за чего эта ошибка? Гугление ничем толком не помогло. Как можно проверить, что всё работает корректно?
На всякий случай сообщаю, что непосредственно по ссылке https://api.telegram.org/bot_bot_id/getUpdates в браузере переходит нормально и в json-формате отображаются последние отправленные боту данные. А вот в приложении на Lazarus'е не работает. (компилировал и тестировал пример longpolling_demo из каталога DesignTime.
Спасибо за отличную разработку! Я только пытаюсь разобраться с ботом на паскале, и у меня следующий вопрос.
На рабочем компьютере бот работает без проблем, а вот на домашнем ни в какую не хочет. Никакие прокси не используются. На работе и дома используются два разных провайдера.
При попытке подключиться на домашнем компьютере к боту возникает следующая ошибка (см. аттач).
Подскажите, пожалуйста, из-за чего эта ошибка? Гугление ничем толком не помогло. Как можно проверить, что всё работает корректно?
На всякий случай сообщаю, что непосредственно по ссылке https://api.telegram.org/bot_bot_id/getUpdates в браузере переходит нормально и в json-формате отображаются последние отправленные боту данные. А вот в приложении на Lazarus'е не работает. (компилировал и тестировал пример longpolling_demo из каталога DesignTime.
- Ichthyander
- энтузиаст
- Сообщения: 701
- Зарегистрирован: 04.04.2007 08:32:43
- Откуда: Астрахань
- Контактная информация:
Здравствуйте!
Аттача не вижу. Но предположу, что fphttpclient не находит библиотеку OpenSSL. Попробуйте установить в систему OpenSSL https://slproweb.com/products/Win32OpenSSL.html или положите в папку с программой файлы libeay32.dll и ssleay32.dll (нужной битности)
Аттача не вижу. Но предположу, что fphttpclient не находит библиотеку OpenSSL. Попробуйте установить в систему OpenSSL https://slproweb.com/products/Win32OpenSSL.html или положите в папку с программой файлы libeay32.dll и ssleay32.dll (нужной битности)
https://ibb.co/Hx6QPBz вот скринIchthyander писал(а):Здравствуйте!
Аттача не вижу. Но предположу, что fphttpclient не находит библиотеку OpenSSL. Попробуйте установить в систему OpenSSL https://slproweb.com/products/Win32OpenSSL.html или положите в папку с программой файлы libeay32.dll и ssleay32.dll (нужной битности)
- Ichthyander
- энтузиаст
- Сообщения: 701
- Зарегистрирован: 04.04.2007 08:32:43
- Откуда: Астрахань
- Контактная информация:
Собственно, скрин только усилил мою версию о проблеме с OpenSSL. Проблема в защищенного соединении https для нативного клиента fphttpclient. На рабочем компьютере у Вас OpenSSL библиотеки установлены. На домашнем - нет. Попробуйте мою инструкцию вышеSer9056 писал(а):https://ibb.co/Hx6QPBz вот скрин
Установил, та же самая ошибка.Ichthyander писал(а):Собственно, скрин только усилил мою версию о проблеме с OpenSSL. Проблема в защищенного соединении https для нативного клиента fphttpclient. На рабочем компьютере у Вас OpenSSL библиотеки установлены. На домашнем - нет. Попробуйте мою инструкцию вышеSer9056 писал(а):https://ibb.co/Hx6QPBz вот скрин
В самом первом сообщении я написал, что на рабочем компе бот работает, а на домашнем нет. Файлы libeay32.dll и ssleay32.dll безусловно присутствуют в папке с ботом. И причём без этих файлов совсем другая ошибка. Следовательно проблема не в отсутствии файлов. К тому же в браузере ссылка на https://api.telegram.org работает и в json-е нормально отображаются последние отправленные данные. Вот и непонятка. 
add.
На работе вин10, на домашнем 11. Но есть ещё ноут с вин10. На нём тоже такая же ошибка ESocketError: Connect to api.telegram.org:443 failed
add.
На работе вин10, на домашнем 11. Но есть ещё ноут с вин10. На нём тоже такая же ошибка ESocketError: Connect to api.telegram.org:443 failed
