Перейти к содержанию
  • Регистрация
rareMax

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

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

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

Далее...

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

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

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В структуре 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" - зарезервированное слово для объявления типов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

При получении сообщения хочу получить аву, но код всегда возвращает 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;

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А кто-нибудь пробовал метод

bot.KickChatMember

получилось ли забанить пользователя в группе?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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 'В данном методе указанное значение не может быть таким, как и значение по-умолчанию'.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
В 05.06.2019 в 11:26, Oleh Mokrii сказал:

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

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

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

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


  • Похожий контент

    • От zairkz
      Создана группа для знакомства и общения разработчиков, использующих инструменты Fire-Monkey.
      Небольшой свод правил в группе Fire-Monkey:
      - Не стоит описывать проблему, скрины и тд. не изучив необходимую литературу и форум, если решения все-таки нет, необходимо создать тему на форуме fire-monkey.ru и скинуть в группу ссылку; 
      - необходимо учитывать часовые пояса, в случае если на тему в Форуме долго нет ответа;
      - можно постить новости IT-рынка связанных с Fire-Monkey и RAD-studio, iOS и Android;
      - «баяны», «мемы» и приколы касательно тематике чата приветствуются, желательно в небольшом количестве;
      - скриншоты и описание программ написанных на Fire-Monkey тоже приветствуются;
      - будьте вежливыми, ведь вежливость – это утонченность речи, благопристойность манер и поведения;
      Запрещено:
      - запрещено задавать элементарные вопросы касательно разработки, для этого есть куча литературы;
      - запрещены сообщения с большим описание проблемы и кода, для этого есть всем известный форум;
      - навязчивая реклама компании\приложения в чате под запретом;
      - оскорбления в адрес участников и в адрес Embarcadero запрещены;
      - запрещены спам, порнография и подобная грязь;
      @fire_monkey в Telegram
    • От Axbor
      Если кто то обращал внимание у Формы телеграма есть ShadowEffect, и есть много еще интересных вещей? Как добиться такого эффекта?
      У меня получилось вот такое Я сделал так: убрал границу формы и с Rectangle создал собственную. Но такой подход очень глючный. Можно ли изменить стиль самой границы формы?
       
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

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