rareMax

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

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

 

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

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

Связь со мной: Комментарии в этой теме, ЛС, Телеграмм

 

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

Если вы решили писать своих ботов для телеграмма - тогда предлагаю вам взаимопомощь: я вам полуготовое решение, а с вас предложения для улучшения, багрепорты.

Помощь проекту

Вы можете помочь проету:

  • Созданием баг-репортов и запросов новых возможностей

  • Рекламой проекта

  • Жертвоприношения в виде денег

Зависимости

Примеры

Получение 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. Репозиторий клонируется также на ГитХаб.
  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

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


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

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

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

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

C Indy так же.

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

Изменено пользователем Paradox Naxer

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


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

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

попробуй так

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


Ссылка на сообщение
Поделиться на другие сайты
В 02.05.2016 в 14:01, rareMax сказал:

Зависимости

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

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


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

Т.к. тема создана на http://fire-monkey.ru то вопрос: это только для FMX проектов или в обычном VCL тоже можно использовать?

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


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

Ещё вопрос.

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

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

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


Ссылка на сообщение
Поделиться на другие сайты
В 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" пустая. Что это такое? Где взять, какую версию?

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


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

Не могу понять, почему в скачанном архиве папка CrossUrl пустая?

Screenshot_1.png

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


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

Ок, скачал отдельно https://github.com/ms301/CrossUrl

Пытаюсь скомпилировать, получаю:

Could not compile used unit 'TelegAPI.Base.pas'

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


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

Ага, нужно сперва открыть "CrossUrlProject" и установить это.

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


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

При компиляции 2 предупреждения:

[dcc32 Warning] TelegraPh.Types.pas(55): W1010 Method 'Create' hides virtual method of base type 'TBaseJson'

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


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

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

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

 

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

Изменено пользователем x11

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


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

У компоненты TtgExceptionManagerUI щёлкаю дважды для создания события и получаю ошибку:

Cannot find implementation of method tgExceptionManagerUI1Log.

 

Screenshot_5.png

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


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

Так, дошло. Только в примере пункт 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

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


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

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

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

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

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

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

Войти

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

Войти

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

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

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