Перейти к содержанию
rareMax

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

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

 

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

Репозиторий: 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

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


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

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


Ссылка на сообщение

При компиляции 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

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


Ссылка на сообщение

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

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

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

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

  Разрешено использовать не более 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 пользователей онлайн

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

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