Телеграм бот для DataExpress

разработка прекращена

Автор: jurist23rus
Версия: 1.4
Последнее обновление: 24 сентября 2018 г.
Фотогалерея
Скачать
Обсудить на форуме

Понятия

Боты (роботы) — специальные аккаунты в Telegram, созданные для того, чтобы автоматически обрабатывать и отправлять сообщения. Пользователи могут взаимодействовать с ботами при помощи сообщений, отправляемых через обычные или групповые чаты. Логика бота контролируется при помощи HTTPS запросов.

Настоящий модуль - это, по существу, «мозг бота», то есть та его часть, которая обрабатывает получаемую из чата Телеграм информацию и формирует ответ и (или) выполняет какие-либо действия в базе данных, заданные пользователем.

Как работает модуль?

Как уже было сказано ранее, роботы — особые аккаунты, которые не требуют номера телефона при создании. По сути, эти аккаунты играют роль интерфейса к DataExpress, который работает на удалённом сервере. Самое приятное в данном модуле, что для его использования вам не нужно знать языка скриптов, достаточно уметь пользоваться выражениями DX.

Чем бот отличается от обычного аккаунта?

  • У роботов нет статусов «онлайн» и «был в сети», вместо этого отображается надпись «робот».
  • Для роботов выделено ограниченное место на серверах — все сообщения буду удалены по прошествии определённого срока после обработки.
  • Роботы не могут сами начать общение с пользователем. Пользователь должен либо добавить робота в группу, либо первым начать с ним диалог. Для этого можно использовать ссылки вида telegram.me/<bot_username> или поиск по имени пользователя.
  • Имя пользователя у робота должно заканчиваться на «bot» (например, @TriviaBot, @gadalka_bot).
  • При добавлении в конференцию, по умолчанию робот не получает всех сообщений (см. режим приватности).
  • Роботы никогда не спят, не едят и не жалуются (если только вы не запрограммируете их на обратное).

Как создать робота (бота)?

  • Откройте приложение Телеграм на своём устройстве (телефон, компьютер и т.д.) и введите @BotFather - это отец всех ботов Телеграм. Следуя его инструкциям вы создадите своего бота.
  • Чтобы создать бота нужно ввести команду /newbot.
  • После чего вам будет предложено ввести имя бота, которое в обязательном порядке должно заканчиваться словом …bot. Если имя уже занято, то вас попросят ввести другое имя.
  • Если имя подошло, то бот будет создан о чём появится соответствующее сообщение.
  • Помимо прочего в сообщении будет указан токен - это уникальный идентификатор вашего бота (то есть уникальный (никогда не повторяющийся) набор символов позволяющий отличить вашего бота от других). Его нужно сохранить, так как он нам ещё пригодится.

Зачем DataExpress нужен робот (бот)?

Может быть для ваших нужд он и не нужен, но для всех остальных это окно возможностей, которое позволяет связать вашу базу данных с телефоном или любым другим устройством, на котором можно установить приложение Telegram. Так как бот управляется вами с помощью команд в чате - это даст возможность прямо из чата телефона управлять базой данных DataExpress. Например, вы можете настроить модуль так, чтобы он, получив определённую команду, отправлял вам отчёт о работе вашей базы данных за день, сведения о клиенте, остатке товаров, выполненных работах и т.д. Или вы бы хотели, создавать записи в базе данных прямо с телефона - это тоже возможно. Вообщем, бот позволяет вам осуществлять любые действия с базой данных, которые вы сможете запрограммировать, используя выражения DX.

"Общение" с ботом

Поняв логику работы бота, вы быстро поймёте принцип его работы и возможности.

Бот понимает два типа сообщений. Первый, называется командами. Второй, запросами. Синтаксически они отличаются только наличием или отсутствием символа «слэш» (/) в начале. У команд есть слэш, а у запросов его нет. Хотя внешне команды и запросы похожи у них принципиально разное назначение. Команда - устанавливает режим ответа на запрос, а запрос ничего не устанавливает, при его поступлении просто вычисляется выражение, записанное в соответствующем поле, установленного режима.

Обработка команд

Бот, получив команду, устанавливает дальнейший режим обработки запросов. Команда должна начинаться с символа косой черты / и не может быть длиннее 32 символов. Команды могут состоять из букв латинского алфавита, цифр и подчёркивания. Несколько примеров:

/отчёт
/пользователь
/справка

Итак, как только команда написана вами в чате и нажата кнопка отправить, она сразу же поступает на сервер Телеграм, откуда её забирает модуль. Получив с сервера команду, модуль открывает форму BotCommands и ищет по записям формы запись соответствующую поступившей команде. Здесь может быть два варианта развития событий.

  1. Бот не нашёл соответствующей команды в форме. В таком случае, он отправляет пользователю ответ, что команда не найдена и ждёт новую команду.
  2. Бот нашёл соответствующую команду. Тогда бот устанавливает дальнейший режим обработки запросов, согласно поступившей команде.

Режим обработки запросов

Режим обработки запросов - это набор, заданных вами на языке выражений DataExpress команд, которые будут выполняться всякий раз при поступлении запроса, если режим установлен. Режим обработки запросов нужно устанавливать каждый раз при запуске модуля. Как понятно из текста выше, режим обработки запроса устанавливается посредством направления команды боту /пример команды.

Запрос и его обработка

Все дальнейшие сообщения без слэша /, после того как режим установлен, будем именовать запросами.

Запросы - это любой текст пользователя, который будет обрабатываться ботом в соответствии с правилами режима.

Напоминаю, что перед командой обязателен слэш /, а перед запросом он не нужен. Именно по данному символу модуль отличает команду от запроса.

Как только установлен режим обработки запросов модуль принимает и обрабатывает запросы пользователя из чата. При поступлении запроса, модуль выполняет набор команд из поля «Выражение» формы «BotCommands» и возвращает пользователю результат вычисленного выражения. Если результатом вычиcления выражения будет null или пустая строка (''), то ответа в чат пользователя не последует, однако это не значит, что выражение не было выполнено.

Чтобы быть уверенным, что ваш запрос выполнен, всегда составляйте выражения так, чтобы они возвращали какой-то текст.

Смена режима

Для смены режима обработки запросов достаточно направить новую команду боту. Если команда принята, то есть найдена на форме 'BotCommands', значит новый режим обработки запросов установлен, о чём вам поступит соответствующее сообщение. Если команда отклонена, то есть на форме не найдено соответствующей команды, то останется в силе ранее установленный режим (если он был установлен), а в ответ вам придёт сообщение, что команда не найдена.

Я так и не понял что такое режим и запрос, можно пример?

Давайте на примере.

Вам надо получать из базы в чат телеграмма на телефоне данные, например, телефон вашего клиента, ведь у вас в справочнике на телефоне его нет. Клиентов много, а вы один.

В чате вы пишите боту команду

/клиент

. Он устанавливает соответствующий режим. Это значит, что теперь он ждет от вас фамилии клиента (запроса), чтобы вернуть вам его номер телефона. Вы не заставляете его ждать (даже если заставите он не обидится) и пишите в чат

Иванов

Бот, у вас на компе, вычисляет ваше варажение и ищет запись с клиентом Ивановым, находит её и отправляет вам в чат его номер телефона. Затем вы пишите Петров и получаете номер Петрова и т.д.

Вы всех обзвонили и теперь вам нужно узнать что Иванов заказал.

Вы меняете режим на

/заказы

. Вводите номер заказа (запрос)

123

и получаете ответ «Зефир Кефир» и т.д.

Теперь ясно что такое режим, а что такое запрос?

Установка модуля

  1. Скачайте архив с модулем и распакуйте его.
  2. Файлы dll поместите в папку с программой DataExpress (это та же папка, где находится файл dataexpress.exe).
  3. Сделайте резервную копию вашей базы данных (без этого категорически не советую что-либо делать дальше, иначе есть риск потерять все данные).
  4. Установите модуль расширения для чего:
    1. Открыть вашу базу данных и войти под учётной записью Разработчика (нужно иметь доступ к дизайнеру). Выбрать меню: Файл - Расширения - кнопка Импорт модуля - выбрать скачанный файл Bot.epas
    2. Если появилось окно ошибок компилятора, значит есть какие-то ошибки совместимости модулей. В этом случае установку лучше не продолжать, а сделать скриншот окна ошибок и написать о проблеме на форум.
  5. Установить форму «BotCommands» для чего:
    1. Проверить, что в Вашей базе нет родительских форм с именем «BotCommands». Если такая форма у вас уже есть, то нужно переименовать её или удалить.
    2. Войти в дизайнер и выбрать пункт меню Сервис - Объединение проектов - выбрать файл TlgrmBot.dxp - в появившемся окне на вкладке Формы установить флажок в поле 'BotCommands' и нажать ОК.
  6. Если вы всё сделали правильно, то в вашей базе появиться новая форма «BotCommands», а в редакторе скриптов модуль формы.

Настройка модуля

После установки модуля по инструкции и при условии, что все компоненты установлены успешно и не появилось никаких ошибок, вы можете приступить к настройке модуля, которая сводится к работе с формой «BotCommands».

Форма "BotCommands"

Для работы с модулем вам не нужно знать языка скриптов! Достаточно небольшого опыта работы с выражениями DX.

Каждая запись формы соответствует режиму обработки запросов. Форма содержит следующие поля:

  • «Команда» - содержит имя команды, которая будет устанавливать режим обработки запроса. Указывается без слэша (/).

Имя команды в поле «Команда», указывается без слэша (/).

  • «Сообщение об успехе» - текст сообщения, которое будет отправлено в чат, если команда применена и установлен режим обработки запроса.
  • «Описание» - может содержать небольшой текст, описывающий возможности команды. Не несёт функциональной нагрузки. Только для удобства пользователя.
  • «Запрос» - в это поле поступает текст вашего запроса из чата.
  • «Выражение» - содержит выражение DX, которое будет вычислено при поступлении запроса, а результат вычисления отправлен пользователю в чат.

Кнопки:

  • «Редактор» - открывает редактор выражений.
  • «Вычислить» - вычисляет выражение и показывает сообщение с результатом вычисления.

Составление и вычисление выражений

Выражения для бота составляются по общим правилам без каких-либо исключений, но с некоторыми особенностями.

  • Вычисляется выражения только при поступлении запроса и только, если какой-либо режим активен.
  • Результат вычисления не записывается в поле с выражением и вообще не сохраняется в базе данных (если из выражения не следует иной алгоритм), а сразу направляется в качестве ответа в чат пользователя, отправившего запрос.
  • Результатом вычисления выражения может быть только текст, а если это не так, то модуль принудительно преобразует результат в текст.

При составлении выражений вы можете использовать поле «Запрос». Именно в нём будет храниться текст запроса пользователя. Например:

DBGET ("Заказы", "ФИО клиента", "[!Номер заказа]=[Запрос]")

Данное выражение иллюстрирует как использовать текст запроса, присланный вам из чата, в выражениях при поиске данных в базе. Когда боту поступит номер заказа, он начнёт вычислять выражение. В данном случае функция DBGET найдёт на форме «Заказы» ФИО клиента, соответствующего номеру заказа, указанному в запросе и вернёт в чат ФИО клиента. Если же функция не найдёт записи с таким номером заказа, то в чат ничего возвращено не будет (ведь dbget вернёт null).

Это не самое удачное выражение для бота, так как при отсутствии номера искомого заказа пользователь не получит в чат никакого ответа и не будет знать выполнен ли его запрос или он вообще (по какой-то причине) не получен ботом. Чтобы не вводить пользователя в заблуждение рекомендуется, чтобы каждое выражение возвращало текстовый результат. Например:

 
block (
setvar ('z', DBGET ("Заказы", "ФИО клиента", "[!Номер заказа]=[Запрос]")),
iif (getvar ('z') = null, 'Заказ не найден!', getvar('z'))
      ) 

В данном примере, если функция DBGET нет нашла заказа, то пользователь будет оповещён об этом сообщением «Заказ не найден!».

Запуск бота

Действие для формы

Бот подключается к любой форме через свойство формы «Подключить действие». В настройках действия следует указать ваш токен, полученный от @BotFather, а также необходимые параметры.

  • Показывать сведения о боте при старте - при каждом запуске показывает сообщение с именем бота.
  • Вести лог - Опция для разработчика. Записывает действия модуля в файл, для более удобного поиска и устранения ошибок. Следует включать, если модуль не работает или работает некорректно.

Опцию «Показывать сведения о боте при старте» уместно включить при первом запуске - это позволит понять, зарегистрировали ли вы бота и правильно ли указали токен. После чего опцию можно отключить или оставить, тогда сообщение будет появляться при каждом запуске.

Кнопка запуска бота
При открытии формы с подключённым ботом, на панели инструментов окна приложения DataExpress появиться дополнительная кнопка со значком приложения «Телеграм».
Кнопка запуска бота

При открытии формы, модуль проверяет наличие необходимых для работы библиотек и получает список прокси-серверов. В этот момент иконка на кнопке жёлтого цвета. После того как все подготовительные действия будут закончены иконка изменит цвет на зелёный, что является сигналом для пользователя о возможности запустить бота.

После запуска (нажатия кнопки), бот проверит соединение с сервером и токен. Если проверка прошла успешно, то бот продолжит работу в штатном режиме без дополнительных уведомлений. В ином случае, появиться сообщение с описанием проблемы, а кнопка запуска на панели станет чёрно-белой и будет заблокирована для дальнейших нажатий, вплоть до устранения проблемы и перезапуска базы данных.

Если у вас сетевая база данных и к ней подключены несколько пользователей, то запускайте бота только на одном из клиентов.

При сетевом доступе нескольких клиентов к одной базе данных, не допускайте, чтобы бот был запущен сразу у двух и более клиентов.

Остановка бота

Бот останавливается при нажатии на кнопку на панели инструментов или закрытии формы к которой он подключён, а также при закрытии всей базы данных.

Работа бота с сервером Телеграм

При запуске бота, он, с определённой периодичностью, начинает опрашивать сервера Телеграм на предмет наличия новых сообщений. Опрос происходит в фоновом режиме и не заметен для пользователя.

Стандартно, при запуске бота, опрос серверов происходит каждые 5-10 секунд. Если бот не используется (ему не поступает сообщений) в течение 5 минут, то частота опроса снижается до одного запроса к серверу в минуту. При простое бота 20 минут и более частота опроса снижается до одного опроса в 3 минуты. Даже если частота опросов снижена, то при поступлении первого сообщения бот начнёт опрашивать сервер в штатном режиме каждые 5-10 секунд, чтобы обеспечивать максимально короткие ответы на дальнейшие запросы пользователя.

При простое, скорость ответа на запрос сильно падает в связи с увеличением интервала опроса сервера. При поступлении первого запроса она восстановиться к стандартным значениям.

Как и любой процесс в системе Windows взаимодействие бота с сервером создаёт дополнительную нагрузку как на вашу систему, (помимо той нагрузки, которую штатно создаёт приложение DataExpress), так и на сервера Телеграм. Поэтому, если в работе бота нет необходимости и его не планируется использовать в ближайшее время, не запускайте его.

Не запускайте бота без необходимости!

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

Отладка и поиск ошибок

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

Возможно, что никакого сообщения об ошибке не было, но бот всё равно не работает. Тогда в настройках бота поставьте галочку «Вести лог» и запустите бота. Направьте боту несколько тестовых сообщений, чтобы наполнить лог информацией и остановите бота. После остановки бота в папке с программой появятся три файла с именами: «TlgrmRequest.log», «TlgrmProxy.log» и TlgrmSendMessage.log, их тоже нужно передать мне для анализа, но в личном сообщении на форуме или по электронной почте.

Не выкладывайте лог-файлы в публичную часть форума, или в любое место где к ним смогут получить доступ посторонние, так как они содержат ваши личные данные. Например, ваш токен.

Фотогалерея

История версий

1.4

  • Запретил запуск бота с его же служебной формы (BotCommands)
  • Исправил ошибку при приёме сообщений с пробелами и запятыми, теперь в запросе могут быть любые символы в любом порядке.
  • На форму BotCommands добавил опцию «Вычислять выражение при поступлении команды».
  • На форму BotCommands добавил опцию «Не вычислять выражение при сохранении записи».
  • Убрал опцию «Вести лог». Логи ведутся всегда.

1.3

  • Оптимизировал логику работы кнопки запуска бота. Помимо прочего, кнопка является индикатором (жёлтая иконка) при разрыве соединения с интернетом, который произошёл вовремя работы бота.
  • Исправил ошибки.

1.2

  • Сам загружает необходимые SSL библиотеки. (при установке TlgmBot.dll надо самому положить в папку с программой.)
  • Сам загружает список прокси-серверов и проверяет их работоспособность, выбирая лучший для подключения.
  • У кнопки запуска появилось три цвета в зависимости от состояния бота.
  • Изменил интервалы опросов сервера. Всё должно работать веселее.

1.1

  • Изменён алгоритм запуска бота.
  • Добавил появление окна с ошибкой, в случае невозможности установления соединения с сервером.
  • Убрал опцию «Проверить токен», теперь проверка происходит автоматически.
  • Добавил опцию «Показывать сведения о боте при старте».
  • При старте проверяет не запущен ли уже бот, во избежание запуска двух ботов с разных форм.

Скачать