Telegram bot API
Модератор: Модераторы
Ichthyander, честно говоря, не силен в обновлении Лазаруса. Ставил из репозитория, который идёт с raspbian os.
Пока попробую докопаться до причины.
Из того, что нашел, на моей малине срабатывает вот эта директива компиляции
{$IF FPC_FULLVERSION < 30200}{$DEFINE ExplSSL}{$else}{$DEFINE SSLOpenSockets}{$ENDIF}
из модуля tgfclhttpclientbroker.pas и дальше компилится код, у которого стоит {$IFDEF ExplSSL}. Похоже, что он не совсем рабочий.
Под windows компилится код с директивой {$IFDEF SSLOpenSockets}
Поразбираюсь дальше. Вроди бы логика не замудреная.
Пока попробую докопаться до причины.
Из того, что нашел, на моей малине срабатывает вот эта директива компиляции
{$IF FPC_FULLVERSION < 30200}{$DEFINE ExplSSL}{$else}{$DEFINE SSLOpenSockets}{$ENDIF}
из модуля tgfclhttpclientbroker.pas и дальше компилится код, у которого стоит {$IFDEF ExplSSL}. Похоже, что он не совсем рабочий.
Под windows компилится код с директивой {$IFDEF SSLOpenSockets}
Поразбираюсь дальше. Вроди бы логика не замудреная.
- Ichthyander
- энтузиаст
- Сообщения: 701
- Зарегистрирован: 04.04.2007 08:32:43
- Откуда: Астрахань
- Контактная информация:
Рекомендую присмотреться к двум вариантам:ssm78 писал(а):Ichthyander, честно говоря, не силен в обновлении Лазаруса. Ставил из репозитория, который идёт с raspbian os.
1) Вы можете использовать кросскомпиляцию из любой другой ОС, к примеру https://wiki.freepascal.org/Lazarus_on_ ... om_Windows
Для этого рекомендую использовать fpcupdeluxe
2) Если не ошибаюсь, то fpcupdeluxe работает и на малинке, а значит с его помощью можно установить любую версию Lazarus. Рекомендую текущую stable версию
Ух, шаманство
Заработало!
Ichthyander, спасибо!
Заработало!
Ichthyander, спасибо!
- Ichthyander
- энтузиаст
- Сообщения: 701
- Зарегистрирован: 04.04.2007 08:32:43
- Откуда: Астрахань
- Контактная информация:
Пожалуйста, обращайтесь
Ichthyander, заранее извиняюсь за глупый вопрос.
Едва начал изучать Telegram API, пока не до конца понимаю, что к чему.
Мне нужно, что бы в ответ на запрос пользователя, бот прислал клавиатуру с несколькими вариантами выбора.
В интернетах пишут, что нужно прислать JSON вот такого вида:
"reply_markup": { "keyboard": [ [{"text": "FIRST_BUTTON"}], [{ "text": "SECOND_BUTTON"}], [{ "text": "THIRD_BUTTON"}] ]}
Отправляю через метод sendMessage и вижу ответ в мессенджере просто как текст. Что, видимо, логично.
Можете подсказать, что я не так делаю?
Добавлено спустя 16 минут 58 секунд:
Сам спросил, сам и отвечу
procedure TTGSupportSvc.SetPropCommandHandler(ASender: TObject; const ACommand: String; AMessage: TTelegramMessageObj);
var
replyMarkup : TReplyMarkup;
begin
replyMarkup := TReplyMarkup.CreateFromString(' {"keyboard": [[{"text": "FIRST_BUTTON"}], [{ "text": "SECOND_BUTTON"}], [{ "text": "THIRD_BUTTON"}]]}');
fReceiverThread.Bot.sendMessage('select service',pmDefault,False,replyMarkup);
replyMarkup.Free();
end;
Едва начал изучать Telegram API, пока не до конца понимаю, что к чему.
Мне нужно, что бы в ответ на запрос пользователя, бот прислал клавиатуру с несколькими вариантами выбора.
В интернетах пишут, что нужно прислать JSON вот такого вида:
"reply_markup": { "keyboard": [ [{"text": "FIRST_BUTTON"}], [{ "text": "SECOND_BUTTON"}], [{ "text": "THIRD_BUTTON"}] ]}
Отправляю через метод sendMessage и вижу ответ в мессенджере просто как текст. Что, видимо, логично.
Можете подсказать, что я не так делаю?
Добавлено спустя 16 минут 58 секунд:
Сам спросил, сам и отвечу
procedure TTGSupportSvc.SetPropCommandHandler(ASender: TObject; const ACommand: String; AMessage: TTelegramMessageObj);
var
replyMarkup : TReplyMarkup;
begin
replyMarkup := TReplyMarkup.CreateFromString(' {"keyboard": [[{"text": "FIRST_BUTTON"}], [{ "text": "SECOND_BUTTON"}], [{ "text": "THIRD_BUTTON"}]]}');
fReceiverThread.Bot.sendMessage('select service',pmDefault,False,replyMarkup);
replyMarkup.Free();
end;
- Ichthyander
- энтузиаст
- Сообщения: 701
- Зарегистрирован: 04.04.2007 08:32:43
- Откуда: Астрахань
- Контактная информация:
Все верно, только все это можно сделать еще в Паскаль стиле, если конечно по какой-то причине выгодно именно подавать на вход процедуры клавиатуру в виде JSON строки.
Код: Выделить всё
procedure TTGSupportSvc.SetPropCommandHandler(ASender: TObject; const ACommand: String; AMessage: TTelegramMessageObj);
var
replyMarkup : TReplyMarkup;
begin
replyMarkup := TReplyMarkup.Create;
replyMarkup.ReplyKeyboardMarkup:=TKeybordButtonArray.Create;
replyMarkup.ReplyKeyboardMarkup.Add.AddButtons(['FIRST_BUTTON', 'SECOND_BUTTON', 'THIRD_BUTTON']);
fReceiverThread.Bot.sendMessage('select service',pmDefault,False,replyMarkup);
replyMarkup.Free();
end;Там появилась библиотека с тестовым проектомIchthyander писал(а):Если имеется ввиду телеграм мессенджер, то для него требуется другой API (telegram client API), такого нет ни в Delphi, ни FPC пока, к сожалению. Теоретически можно импортировать TdLib через C-заголовки, но я это не умею
Добавлено спустя 59 минут 6 секунд:
https://github.com/tdlib/td
https://github.com/dieletro/tdlib-lazarus
- Ichthyander
- энтузиаст
- Сообщения: 701
- Зарегистрирован: 04.04.2007 08:32:43
- Откуда: Астрахань
- Контактная информация:
Я знаю об этом проекте. Мы с ним общались. ВРоде он даже что-то использовал в своем проекте из моего. Но он к сожалению сырой пока по отзывам. Если когда-нибудь доберусь попробую расширить свою либу до клиентского API. Особенно, если будут запросы на разработку )jsa писал(а):Там появилась библиотека с тестовым проектомIchthyander писал(а):Если имеется ввиду телеграм мессенджер, то для него требуется другой API (telegram client API), такого нет ни в Delphi, ни FPC пока, к сожалению. Теоретически можно импортировать TdLib через C-заголовки, но я это не умею
Добавлено спустя 59 минут 6 секунд:
https://github.com/tdlib/td
https://github.com/dieletro/tdlib-lazarus
Кстати, требования к подобным программу кажется усилились. К примеру, обязательный показ рекламы и т.д. В некоторым смысле и актуальность.
Уважаемый, Ichthyander.
Если не сложно подскажите, как быть в такой ситуации.
На устройстве, где крутится бот с Вашим компонентом, предусмотрена возможность отправки команды на принудительную перезагрузку.
Устройство работает на ОС Raspbian. Соответственно перезагрузку выполняю командой 'sudo reboot'.
Пока я использовал Raspbian в в стандартной комплектации, всё работало нормально.
После перехода на Raspbian Lite (только командная строка без визуальной части) я словил ситуацию, когда устройство начало перезагружаться в цикле.
Видимо, процесс с ботом прибивается системой раньше, чем он успевает пометить сообщение в телеграме как прочитанное.
Можете подсказать, в какую сторону копнуть, что бы поправить этот момент?
Если не сложно подскажите, как быть в такой ситуации.
На устройстве, где крутится бот с Вашим компонентом, предусмотрена возможность отправки команды на принудительную перезагрузку.
Устройство работает на ОС Raspbian. Соответственно перезагрузку выполняю командой 'sudo reboot'.
Пока я использовал Raspbian в в стандартной комплектации, всё работало нормально.
После перехода на Raspbian Lite (только командная строка без визуальной части) я словил ситуацию, когда устройство начало перезагружаться в цикле.
Видимо, процесс с ботом прибивается системой раньше, чем он успевает пометить сообщение в телеграме как прочитанное.
Можете подсказать, в какую сторону копнуть, что бы поправить этот момент?
- Ichthyander
- энтузиаст
- Сообщения: 701
- Зарегистрирован: 04.04.2007 08:32:43
- Откуда: Астрахань
- Контактная информация:
Хотелось бы чуть больше информации.
1) Самое лучшее конечно - это поставить дополнительные логи. В классе TTelegramSender и его наследниках это делается так: Bot.Logger:=TEventLog.Create(nil); с соответствующими настройками: AppendCOntent:=True и т.д. Также для Бота лучше будет выставить DebugLog:=True для полноты отладочной информации. Посмотреть содержимое лога
Если же погадать, то возможно причина какая-то общая. К примеру:
2) Это не могло быть связано как то с тем, что ваш сервис использует Synchronize, который срабатывает в общем случае только для десктопных приложений (потребуется небольшая доработка, чтобы это работало)?
3) Раньше он тоже может работал не совсем корректно, но просто процесс успевал закрыться обычным способом перед перезагрузкой. Теперь же ОСь это делает быстро и ваш сервис не успевает отправить ответ телеграм серверу, что сообщение принято.
1) Самое лучшее конечно - это поставить дополнительные логи. В классе TTelegramSender и его наследниках это делается так: Bot.Logger:=TEventLog.Create(nil); с соответствующими настройками: AppendCOntent:=True и т.д. Также для Бота лучше будет выставить DebugLog:=True для полноты отладочной информации. Посмотреть содержимое лога
Если же погадать, то возможно причина какая-то общая. К примеру:
2) Это не могло быть связано как то с тем, что ваш сервис использует Synchronize, который срабатывает в общем случае только для десктопных приложений (потребуется небольшая доработка, чтобы это работало)?
3) Раньше он тоже может работал не совсем корректно, но просто процесс успевал закрыться обычным способом перед перезагрузкой. Теперь же ОСь это делает быстро и ваш сервис не успевает отправить ответ телеграм серверу, что сообщение принято.
Приветствую. Огромное спасибо за эту обертку для BotAPI, очень выручила.
Возник такой вопрос. Есть моя софтина-бот с этой оберткой, крутившаяся до недавнего времени на серверной Бубунте 20 х64, все работало отлично. Потом понадобилось заменить железо на amd64 и поставить серверную Бубунту 22 в минимальной комплектации, добавив к ней ufw. На обновленной машине тот же бот работать отказывается, говоря, что не проходит выполнение метода getMe. К сожалению, отладка софтины на боевом сервере не удается. Пробовал выполнять из командной строчки wget к серверу t.me - это проходит. Нужны ли какие-то дополнительные системные пакеты конкретно под эту обертку? Может быть, там есть какие-то спецпорты, которые надо открыть (хотя отключение ufw не помогает)? На моем ПК разработчика всё четко работает.
Возник такой вопрос. Есть моя софтина-бот с этой оберткой, крутившаяся до недавнего времени на серверной Бубунте 20 х64, все работало отлично. Потом понадобилось заменить железо на amd64 и поставить серверную Бубунту 22 в минимальной комплектации, добавив к ней ufw. На обновленной машине тот же бот работать отказывается, говоря, что не проходит выполнение метода getMe. К сожалению, отладка софтины на боевом сервере не удается. Пробовал выполнять из командной строчки wget к серверу t.me - это проходит. Нужны ли какие-то дополнительные системные пакеты конкретно под эту обертку? Может быть, там есть какие-то спецпорты, которые надо открыть (хотя отключение ufw не помогает)? На моем ПК разработчика всё четко работает.
- Ichthyander
- энтузиаст
- Сообщения: 701
- Зарегистрирован: 04.04.2007 08:32:43
- Откуда: Астрахань
- Контактная информация:
Рад, что обертка оказалась полезнойslyubez писал(а):Приветствую. Огромное спасибо за эту обертку для BotAPI, очень выручила.
Попробуйте логгирование и перехват ошибки. Также в самом боте есть встроенное логгирование. Наверняка должно показать, в чем причина.slyubez писал(а):К сожалению, отладка софтины на боевом сервере не удается
Сложно сказать наверняка, но я почти уверен, что нужно установить библиотеку SSL OpenSSL (скорее всего примерно такая: libssl, libssl-dev)slyubez писал(а):Нужны ли какие-то дополнительные системные пакеты конкретно под эту обертку? Может быть, там есть какие-то спецпорты, которые надо открыть (хотя отключение ufw не помогает)? На моем ПК разработчика всё четко работает.
Сейчас сделал наследников методов DebugMessage, ErrorMessage. Посмотрю, что покажет. Ни в системном логе, ни в логе ufw нет ничего подозрительного.Попробуйте логгирование и перехват ошибки. Также в самом боте есть встроенное логгирование. Наверняка должно показать, в чем причина.
И это сейчас гляну. Небольшой опыт геморроя после установки серверной убунты в минимальной комплектации показал, что там нет даже таких базовых вещей, как tzdata, из-за чего я получил сбой часового пояса. Спасибо!Сложно сказать наверняка, но я почти уверен, что нужно установить библиотеку SSL OpenSSL (скорее всего примерно такая: libssl, libssl-dev)
Добавлено спустя 1 час 15 минут 54 секунды:
В общем, дело оказалось в отсутствии почему-то именно libssl-dev. После ее установки пошли отладочные сообщения, и все заработало. Большое спасибо. Реально крутая работа. Еще найти бы что-то подобное под WhatsApp для Lazarus...
- Ichthyander
- энтузиаст
- Сообщения: 701
- Зарегистрирован: 04.04.2007 08:32:43
- Откуда: Астрахань
- Контактная информация:
Код: Выделить всё
В общем, дело оказалось в отсутствии почему-то именно libssl-devКод: Выделить всё
Сейчас сделал наследников методов DebugMessage, ErrorMessage. А, имелось ввиду override видимо, а логгер свой: кажется понялДобавлено спустя 9 минут 46 секунд:А зачем, кстати? Интересно что имеется ввиду.Код: Выделить всё
Сейчас сделал наследников методов DebugMessage, ErrorMessage.
Это наследники для логирования этих сообщений, подобные тем, что в примере getMe. Рассчитывал увидеть в логе какие-то сообщения об ошибках при провале отправки getMe, но перед запуском решил установить библиотеку и в итоге при запуске получил успешное подключение и замусоренные логиА зачем, кстати? Интересно что имеется ввиду.
