У меня уже было несколько статей про работу с Телеграм-ботами в 1С.
В этой статье расскажу, как можно получить сообщение отправленное Телеграм-боту в 1С.
Давайте будем разбираться по порядку.
Первое. Для начала у нас должен быть зарегистрирован бот, как это сделать можно прочитать в этой статье:
Второе. Наша задача получить сообщение в 1С, которое отправляет пользователь бота. Потом это сообщение обработать и отправить ответ.
Как мы можем получать сообщения в 1С?
Есть два варианта:
- Вебхук — Телеграм сам будет отправлять сообщения к нам в 1С;
- Поллинг — регулярно отправлять запрос из 1С к серверу Телеграма для получения новых сообщений;
Вебхук / Webhook
В этом варианте сообщения от пользователей, которые они отправили в бот доставляются напрямую к нам в 1С, вернее сервера Телеграм отправляют все сообщения на определенный URL. В терминах 1С это http-сервис, который опубликован на веб-сервере. Внешний адрес этого сервиса (URL) нужно зарегистрировать специальным образом в Телеграме, чтобы он отправлял на него все пакеты с сообщениями.
Преимуществом такой схемы является мгновенная доставка сообщений. Пользователь написал, что в бот и тут же это сообщение будет передано в 1С.
Для реализации такой схемы, необходимо:
- Написать соответствующий http-сервис в 1С;
- Опубликовать его на веб-сервере, при этом веб-сервер должен быть доступен из интернета;
Т.е. фактически нам нужно решить не только программную задачу по обработке входящих сообщений, но и техническую для организации взаимодействия серверов Телграма и нашей 1С.
Поллинг / Polling
При таком варианте мы из 1С отправляем запрос на сервера Телеграм и целью проверить не появились ли там новые сообщения. Т.е. в отличии от вебхука мы сами запрашиваем сообщения, автоматически они нам в 1С не упадут.
При поллинге нам не требуется дополнительные технические средства, мы сами отправляем запрос через интернет на сервер Телеграма и забираем от туда сообщения пользователя.
Основной недостаток такой схемы, это постоянные запросы к серверу, при этом мы их должны делать достаточно часто, чтобы пользователю на другой стороне было комфортно работать с наши ботом, ведь он ожидает, что на его вопросы бот будет выдать ответы достаточно быстро и без задержек.
В этой статье я рассмотрю пример получения сообщений бота как раз по этой схеме. 1С отправляет запрос на проверку новых сообщений и в случае их наличия их обрабатывает.
Получение сообщений
Для получения сообщения нам нужно отправить запрос на адрес: api.telegram.org
Пример текста запроса:
bot<token>/getUpdates?offset=<update_id>&limit=1
- <token> — Это токен, который вы получили при регистрации бота;
- <update_id> — Идентификатор обновления, это номер сообщения который вы хотите получить;
- limit=1 — Количество сообщений в пакете;
Номер последнего идентификатора полученного обновления сообщений необходимо будет хранить в нашей базе. Если не указывать при запросе данных следующий по порядку идентификатор, то мы всегда будем получать одни и те же сообщения.
Т.е. параметр запроса offset говорит нам, какой номер обновления мы хотим получить. В случае если мы делаем первый запрос, то можно указать offset=0.
В примере ниже я запрашиваю пакет обновления с номером 223721281, при успешном получении я его сохраню и в следующий раз уже буду запрашивать: ИдентификаторОбновления + 1
Запрос нам вернет JSON (переменная СтрокаОтвет) в котором будет вся информация об отправленном сообщении:
- Результат выполнения;
- Номер идентификатора обновления;
- Информация об отправителе;
- Текст сообщения;
Для удобства этот JSON мы можем преобразовать в Соответствие и дальше работать с ним.