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

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


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

 

Автор: Максим Сысоев

Репозиторий: Github

Связь со мной: Telegram

 

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

Библиотека для работы с Telegram Bot API

Зависимости

Примеры

Получение Username бота

program Project5;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  TelegaPi.Bot,
  TelegaPi.Types,
  System.SysUtils;

var
  Telegram: TTelegramBot;

begin
  Telegram := TTelegramBot.Create({$I TokenTelegramBot.inc});
  try
    { TODO -oUser -cConsole Main : Insert code here }
    Writeln(Telegram.getMe.Username);
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;
  Telegram.Free;
end.

Пример автоответчика

Напишите ему "привет"

 

J2WkZxZ.png

Изменено пользователем rareMax
Ссылка на комментарий
  • 1 месяц спустя...
  • Ответов 64
  • Создана
  • Последний ответ

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

В начале пару новостей: 

  1. Репозиторий клонируется также на ГитХаб.
  2. Можно устанавливать с помощью Delphinus'a

Бот калькулятор для Telegram.

А сейчас мы напишем своего бота, который сможет решать арифметические выражения(и не только).

Что для этого нужно:

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

После установки библиотек свыше - создаем новое консольное приложение. Далее создаем новый модуль(unit) и называем его, например, Telegram.Plugin.Calculator

В этом модуле мы будем писать логику калькулятора, а точнее взаимодействие команд от пользователя и модуля выражений BI.Expression(TeeBI).

Для наглядности, сразу код модуля:

unit Telegram.Plugin.Calculator;

interface

uses
  TelegAPI.Bot,
  TelegAPI.Types,
  TelegAPI.Utils,
  TelegAPI.Module;

Type
  TTgCalculatorBot = Class(TTgModule)
  private
    FIsCommandWait: Boolean;
  protected
    procedure OnUpdate(Sender: TObject; Const Update: TtgUpdate); override;
  End;

implementation

uses
  BI.Expression, System.SysUtils;

{ TTgWelcomeBot }

procedure TTgCalculatorBot.OnUpdate(Sender: TObject; const Update: TtgUpdate);
var
  Cmd: TCommandHelper;
  Procedure Calculation;
  var
    TextExpr: String;
  Begin
    FIsCommandWait := False;
    if Cmd.ParamCount = 0 then
      TextExpr := Update.Message.Text
    else
      TextExpr := Cmd.ParamsToString;
    try
      (Sender as TTelegramBot).sendTextMessage(Update.Message.Chat.ID,
        TExpression.FromString(TextExpr).Value);
    except
      on E: Exception do
        (Sender as TTelegramBot).sendTextMessage(Update.Message.Chat.ID,
          'упс, ошибочка вышла: ' + E.ClassName + ' ' + E.Message);
    end;
  End;

begin
  Cmd := TCommandHelper.Create(Update.Message.Text);
  try
    if Cmd.Command = '/calc' then
    Begin
      if Cmd.ParamCount = 0 then
      Begin
        FIsCommandWait := true;
        (Sender as TTelegramBot).sendTextMessage(Update.Message.Chat.ID,
          'ожидаю выражение:');
      End
      else
      Begin
        Calculation;
      End;
    End
    else if FIsCommandWait then
    Begin
      Calculation;
    End;
  finally
    Cmd.Free;
  end;

end;

end.

Первое на что обращаем внимание -  наш класс TTgCalculatorBot  будет наследоваться от TTgModule, в котором заложен базовый функционал для расширения функционала бота(на данный момент только получение обновлений от сервера).

В метод OnUpdate будут поставляться обновления, которые приходят от сервера, в нем мы и будем работать. 

Насчет поля FIsCommandWait. Уж так сложилось - что, как правило, пользователь сразу отправляет боту команду - а потом параметры. Поэтому, если придет поддерживаемая модулем команда - мы устанавливаем это поле в True. Если это поле - правда - значит нужно обработать текст.

Теперь вернемся к нашему консольному приложению:

program CalculatorBot;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  TelegaPi.Bot,
  TelegaPi.Types,
  System.SysUtils,
  Telegram.Plugin.Calculator in 'Telegram.Plugin.Calculator.pas';

Const
  C_PAUSE_UPDATE = 1000; { 1sec. }

Var
  TelegramBot: TTelegramBot;
  TelegramCalc: TTgCalculatorBot;

Procedure InitRecesive;
var
  Offset: Integer;
  Updates: TArray<TtgUpdate>;
  Update: TtgUpdate;
Begin
  Offset := 0;
  while True do
  begin
    Sleep(C_PAUSE_UPDATE); // Update pause
    Updates := TelegramBot.getUpdates(Offset); // Get updates
    if Length(Updates) = 0 then
      Continue;
    Offset := Updates[High(Updates)].ID + 1;
  end;
End;

begin
  WriteLn('Telegram Calculator Sample');
  { Here you Api key }
  TelegramBot := TTelegramBot.Create({$I ..\telegaToken.inc} );
  TelegramCalc := TTgCalculatorBot.Create(TelegramBot);
  try
    WriteLn('Bot token: ', TelegramBot.getMe.ID <> -1);
    InitRecesive;
  except
    on E: Exception do
      WriteLn(E.ClassName, ': ', E.Message);
  end;
  TelegramBot.Free;
  TelegramCalc.Free;

end.

  TelegramCalc := TTgCalculatorBot.Create(TelegramBot); - во время создания модуля - происходит подписка на сообщения от сервера. Никаких данных программисту передавать не нужно. 

Далее, что бы консоль сразу же не закрылась - нужно зациклить прием данных от сервера. Пример - в процедуре InitRecesive.

Что получаем в итоге:

QnY8ncA.png

 

Так же можете сами протестировать бота(если он конечно будет запущен): @test_delphi_api_bot

Готовый пример: https://bitbucket.org/uasoft/telegapi/src//examples/PluginCalculator/?at=master

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

Прокси не работает? 

cuHttpClientSysNet1.Proxy.Create(EditHost.Text, EditPort.Value, EditUserName.Text, EditPassword.Text);

[dcc32 Error] Unit1.pas(45): E2036 Variable required

C Indy так же.

Или я что-то не то пишу?

Изменено пользователем Paradox Naxer
Ссылка на комментарий
  • 4 месяца спустя...
В 02.05.2016 в 14:01, rareMax сказал:

Зависимости

Первое предложение: заменить XSuperObject на стандартную, встроенную библиотеку. Меньше зависимостей - лучше, ПМСМ.

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

Ещё вопрос.

Можно ли отправлять персональные, личные сообщения?

Почему такой вопрос? Раньше, допустим, некая программа или сервис отправляли СМС с каким-нибудь оповещением своим корпоративным пользователям или клиентам. А теперь это бы переделать на Телеграм. Получится? Стоит ли пробовать?

Ссылка на комментарий
  • Модераторы
В 12.10.2018 в 01:20, x11 сказал:

Ещё вопрос.

Можно ли отправлять персональные, личные сообщения?

Почему такой вопрос? Раньше, допустим, некая программа или сервис отправляли СМС с каким-нибудь оповещением своим корпоративным пользователям или клиентам. А теперь это бы переделать на Телеграм. Получится? Стоит ли пробовать?

получится если пользователи подпишутся на канал либо на бота

Ссылка на комментарий
1 час назад, Равиль Зарипов (ZuBy) сказал:

если пользователи подпишутся на канал либо на бота

 

это понятно, в вайбере так же: пользователь при подписке "сообщает" боту свой ID

Ссылка на комментарий
В 11.10.2018 в 22:18, x11 сказал:

 

Не обязательно подписываться. Можно просто сообщение боту отправить. Тогда бот может ответить. Но, я думаю, там есть ограничения.

Ссылка на комментарий
В 24.06.2016 в 14:40, rareMax сказал:

После установки

 

А где инструкция по установке?

 

 

В 02.05.2016 в 14:01, rareMax сказал:

Зависимости

При построении проекта "TelegaPiIntegrations.bpl" получаю ошибку: Required package 'CrossUrl' not found

Папка "CrossUrl" пустая. Что это такое? Где взять, какую версию?

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

Demo пример "SendMethods" не компилируется:

[dcc32 Fatal Error] Main.pas(11): F2613 Unit 'TelegaPi.Exceptions' not found.

 

А ещё что такое "EApiRequestException" и где это живёт?

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

Так, дошло. Только в примере пункт 0 должен быть таким:

0. Установить CrossUrl, кинуть на форму TcuHttpClientSysNet или TcuHttpClientIndy и указать в свойстве TelegramBot1.HttpCore нужную вам библиотеку для работы с
сетью.

Ещё один пункт допишите:

в папку \TelegaPi\Bin\Win32-Debug\ скопируйте 2 файла: libeay32.dll и ssleay32.dll для работы с SSL.

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

Ввёл token, нажал Apply, перешёл на вкладку SenMessage и нажал на Send, получил ошибку:


Project SendMethods.exe raised exception class Exception with message 'Not assigned required data'.

Использую TcuHttpClientIndy.

Если использовать TcuHttpClientSysNet, то исключений нет, но и сообщения не отправляются и на вкладке OnUpdate появляется {"ok":false,"error_code":400,"description":"Bad Request: chat_id is empty"}

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

Пункт 2 правильно было бы переписать так. Запустить пример, заполнить Token и нажать Apply. Перейти на вкладку OnUpdate и со своего смартфона что-то написать от имени бота и в компоненте "mmoOnUpdadtes" появится Chat ID.

 

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

Заполнил и токен, и chat id, но при отправке  {"ok":false,"error_code":400,"description":"Bad Request: chat not found"}

хотя если со смартфона я пишу сообщения в чат, то вижу их на вкладке OnUpdate

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

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

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

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

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

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

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

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

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

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