Перейти к содержанию
Fire Monkey от А до Я

Telega π - Библиотека для работы с Telegram Bot API в Delphi


Рекомендуемые сообщения

Я так понял, старт отправляется автоматически, как только пользователь "входит" в чат к боту или пишет первое сообщение (не знаю), т.к. я увидел, что боту пришло /start, хотя пользователь ничего ещё не писал.

Далее...

В общем, /start приходит боту автоматически или пользователь сам отправляет. И мой бот должен что-то отправить в ответ пользователю? Вот здесь проблема.

https://tlgrm.ru/docs/bots#global-commands

как реализовать ответ правильно, если при отправке любого сообщения, я получаю 401?

 

Ссылка на комментарий
  • Ответов 64
  • Создана
  • Последний ответ

Топ авторов темы

В структуре TtgUserLink я указываю только UserID получателя. Или здесь нужно заполнять обязательно ещё и Username?

Вот сейчас такой код:

procedure TForm1.btnSendMsgClick(Sender: TObject);
Var
 UserLink: TtgUserLink;
begin
  UserLink.ID := StrToIntDef(edUserId.Text, 0);

  if UserLink.ID = 0 then
  begin
    Memo1.Lines.Add('SendMsg: ' + edUserId.Text + ' is not valid integer value');
    exit;
  end;


  TelegramBot1.SendMessage(UserLink, edMsgText.Text);
end;

 

Ссылка на комментарий

Проблему решил следующим путём.

1. Нужно проверить, что в поле Domain нет токена, т.е. чтобы было только значение URL "https://api.telegram.org/bot" без кавычек, конечно же.

2. Не нужно заполнять UserName, вот код отправки личного сообщения от бота - пользователю:

 

procedure TForm1.btnSendMsgClick(Sender: TObject);
Var
 UserLink: TtgUserLink;
begin
  UserLink.ID := StrToIntDef64(edUserId.Text, 0);
//  UserLink.Username := edUserName.Text;

  if UserLink.ID = 0 then
  begin
    Memo1.Lines.Add('SendMsg: ' + edUserId.Text + ' is not valid integer value');
    exit;
  end;


  TelegramBot1.SendMessage(UserLink, edMsgText.Text);
end;

т.е. я закоментировал "UserLink.Username := edUserName.Text;", как видите.

То ли это баг, то ли фича, то ли фиг его знает.

Если раскомментировать строку "UserLink.Username := edUserName.Text;", то сообщение будет передаваться вот такой ссылкой:

"https://api.telegram.org/bot<token>/sendMessage?chat_id=@channelusername&text=12345"

и по такой ссылке я получаю ошибку: 400 bad request: chat not found,

хотя согласно документации https://tlgrm.ru/docs/bots/api#sendmessage - (см. снимок) написано, что можно отправлять @имя_юзера_канала, кому предназначено сообщение.

 

Но когда я закоментировал строку, то библиотека создала вот такой URL: "https://api.telegram.org/bot<token>/sendMessage?chat_id=12345678&text=12345"

т.е. в параметр chat_id библиотека подставила уже ID пользователя-получателя (12345678).

И тогда бот успешно отправил сообщение.

 

 

Screenshot_1.png

Изменено пользователем x11
Ссылка на комментарий

Разобрался.

когда бот отправляет личное сообщение пользователю, то нужно заполнять только ID, а когда сообщение в канал, то - имя.

 

Пользователю: UserLink.ID := StrToIntDef64(edUserId.Text, 0);

В канал UserLink.Username := edUserName.Text;

 

Для отправки сообщения в канал можно в качестве ID подставить отрицательное  значение chat_ID, у каналов всегда оно отрицательное.

Т.е. в любом случае можно всегда заполнять только UserLink.ID

 

В документации Телеграм этого нет :(

https://tlgrm.ru/docs/bots/api#sendmessage

Изменено пользователем x11
Ссылка на комментарий

Начинает доходить, как скачать, переданные боту картинки.

У TItgMessage есть свойство "&Type", не знаю, зачем разработчики сделали с "&". Этот "TItgMessage.&Type" определяет тип сообщения: картинка, видео, контакт и т.д. И вот в событии tgReceiverUI.OnUpdate можно определить тип сообщения:


 

if Assigned(AUpdate.message) then

begin

case AUpdate.message.&Type of
      TtgMessageType.Photo: ReceivePhoto(AUpdate.message.Photo);

    end;// case

end;

 

обрабатываем массив полученных фото
 

procedure TForm1.ReceivePhoto(Photos: TArray<TelegAPi.Types.ItgPhotoSize>);
Var
  PhotoSize: TelegAPi.Types.ItgPhotoSize;
  tgFile: ItgFile;
  FileUrl: string;
begin
  for PhotoSize in Photos do
  begin
    tgFile := TelegramBot1.GetFile(PhotoSize.FileId);
    if tgFile.CanDownload then
    begin
      FileUrl := tgFile.GetFileUrl(TelegramBot1.Token);
      Memo1.Lines.Add('ReceivePhoto, FileUrl: ' + FileUrl);// получаем прямую  https-ссылку на картинку jpg.

    end;

  end;

end;

Дальше пока не разобрался с методом скачивания. То ли у библиотеки уже есть встроенные методы скачивания, то я сам должен скачать.

Поискал по исходникам слово Download - ничего такого не нашёл :(

 

 

Изменено пользователем x11
Ссылка на комментарий
1 час назад, x11 сказал:

У TItgMessage есть свойство "&Type", не знаю, зачем разработчики сделали с "&"

Потому что слово "Type" - зарезервированное слово для объявления типов.

Ссылка на комментарий
  • 1 месяц спустя...

Кто-нибудь пытался получить аватарку (картинку) канала?

Бот добавлен в публичный канал и имеет доступ к сообщениям.

При получении сообщения хочу получить аву, но код всегда возвращает false

if Assigned(AMessage.Chat.Photo) then

 

Или подскажите, как правильно, в какой момент получить значок канала?

Может нужен специальный запрос в API?

Спасибо.

Ссылка на комментарий

В общем сделал через GetFileUrl

 

procedure GetChatAva;
Var
  chat: ItgChat;
  iChatID: int64;
  s: string;
  tgFile: ItgFile;
  img_stream: TMemoryStream;
begin

  iChatID := ....;
  
  chat := bot.GetChat(iChatID);
  if not Assigned(chat) then
  begin

    exit;
  end;

  s := chat.Photo.SmallFileId;
  tgFile := bot.GetFile(s);
  if not Assigned(tgFile) then
  begin

    exit;
  end;

  s := tgFile.GetFileUrl(aBotToken);
  if s.IsEmpty then
  begin

    exit;
  end;

  img_stream := TMemoryStream.Create;
  try
    DownloadImage(s, img_stream);
    
    if img_stream.Size <= 0 then
    begin

      exit;
    end;



  finally
    img_stream.DisposeOf;
  end;


end;

 

Ссылка на комментарий
  • 3 месяца спустя...

У кого есть пример использования клавиатуры?

TtgInlineKeyboardMarkup

TtgInlineKeyboardButton

procedure TForm1.btnSendKeyBoardClick(Sender: TObject);
Var
 UserLink: TtgUserLink;
 Kb: TtgInlineKeyboardMarkup;
begin
  UserLink := StrToInt64Def(edChatId.Text, 0);

  if UserLink.ToString = '0' then
  begin
    Memo1.Lines.Add('SendMsg: ' + edChatId.Text + ' is not valid integer value');
    exit;
  end;


  Kb := TtgInlineKeyboardMarkup.Create;
  try
    Kb.AddRow([TtgInlineKeyboardButton.Create('1'),
               TtgInlineKeyboardButton.Create('2'),
               TtgInlineKeyboardButton.Create('3'),
               TtgInlineKeyboardButton.Create('4')]);

    Kb.AddRow([TtgInlineKeyboardButton.Create('5'),
               TtgInlineKeyboardButton.Create('6'),
               TtgInlineKeyboardButton.Create('7'),
               TtgInlineKeyboardButton.Create('8')]);


    TelegramBot1.SendMessage(UserLink, edChatMsgText.Text, TtgParseMode.default, False, False, 0, KB);
  finally
    kb.DisposeOf;
  end;
end;

в итоге получаю ошибку

Project raised exception class EArgumentException with message 'В данном методе указанное значение не может быть таким, как и значение по-умолчанию'.

Ссылка на комментарий
  • 2 месяца спустя...
  • 2 недели спустя...
В 05.06.2019 в 11:26, Oleh Mokrii сказал:

Подскажите пожалуйста в чем может быть проблема?

[dcc32 Error] Unit2.pas(39): E2361 Cannot access private symbol TtgUserLink.ID

покажи как используешь

Ссылка на комментарий
  • 3 года спустя...

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...