rareMax

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

В теме 57 сообщений

Я так понял, старт отправляется автоматически, как только пользователь "входит" в чат к боту или пишет первое сообщение (не знаю), т.к. я увидел, что боту пришло /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" - зарезервированное слово для объявления типов.

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

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

    • От 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 пользователей онлайн

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