Сравнение версий

Ключ

  • Эта строка добавлена.
  • Эта строка удалена.
  • Изменено форматирование.
Подсказка
titleДля кого нужна эта статья

Эта статья поможет вам интегрировать чат-бота TWIN в стороннее приложение. Как мобильное, так и десктопное. 

Предупреждение
titleАктуальность информации
Мы стараемся поддерживать информацию в данной статье в актуальном состоянии. Все последние обновления для работы с сервисами TWIN в первую очередь публикуются на ресурсе https://developers.twin24.ai
note
Предупреждение
titleУчтите при интеграции
Команда TWIN постоянно совершенствуем свои сервисы. В связи с этим возможно внесение изменений в наше API. Просим вас учитывать этот факт при реализации интеграции чат-платформы TWIN с вашими приложениями. Важно обратить на это внимание при согласовании гарантийных обязательств.

Оглавление

...

titleSDK как основной инструмент интеграции

...

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

Оглавление


...

Вступление

В данной статье рассмотрены 2 варианта интеграции чат-бота TWIN с собственным приложением. 

  1. Интеграция через websockets
    • Более продвинутая технически
    • Позволяет вести общение через сервис чатов TWIN
      • Имеет большое количество дополнительных настроек
      • Ознакомиться с возможностями чатов можно по ссылке 
  2. Интеграция через HTTP REST API
    • Упрощенный способ интеграции
    • Интеграция производится напрямую с сервисом бота TWIN
      • Дополнительные настройки отсутствуют
      • Простое взаимодействие с ботом в формате "вопрос-ответ"

Интеграция через websockets

Основные шаги интеграции

  • Создание сессии бота
    • Происходит путем запроса к API
    • В ответ будет получено сообщение бота (если есть) и id созданной сессии
  • Подключение к соккет-серверу
    • В соккеты будут приходить события от бота и оператора
  • Обмен сообщениями бот-клиент
    • Отправка сообщений клиента производится через API
    • Получение сообщений и событий бота и оператора происходит через соккеты

Основные методы API

Создание сессии бота

(Детальное описание с комментариями будет позже)

https://developers.twin24.ai/reference/startchatsessions

Отправка сообщений клиента в сессию бота

(Детальное описание с комментариями будет позже)

https://developers.twin24.ai/reference/continuelastorstartnewchatsessions

Прочие доступные методы

Со всеми доступными методами можно ознакомиться в документации разработчика:

https://developers.twin24.ai/reference/operatorchatsessionlist

Live события

Подключение к соккет-серверу

Для работы с соккет-сервером используется инструмент Centrifuge. 

Подробности о доступных SDK для работы с Centrifuge можно получить в официальной документации Centrifuge

Эндпоинт для подключения: wss://twin24.ai/centrifugo/connection/websocket 

  • При подключении нужно отправить data и name
Блок кода
languagejson
titledata

Оглавление

Оглавление

Информация об интеграции

Интеграция чат-платформы TWIN в приложение (кодовую базу) клиента идёт на стороне клиента. Так как интеграция осуществляется силами клиента, счёт за такую интеграцию не выставляется.

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

Для обеспечения двухсторонней связи используется библиотека Socket.IO, построенная на основе протокола WebSocket.

Старт новой чат-сессии

Метод: POST

Authorization: No Auth 

URL: https://tcl.twin24.ai/api/chats/v1/chats/{chat_id}/sessions?x_widget=1

Ссылка на документацию

Описание параметров пути:

...

Поле

...

Тип

...

Обязательно

...

Описание

...

chatId

...

string

...

Да

...

Идентификатор чата. Он определяет настройки чата и схему работы бота.

Тело запроса

Блок кода
languagepy
themeDJango
firstline1
titleТело запроса в формате Json:
linenumberstrue
{
    "nameapplication": "stringwidget", // REQUIERD. Всегда widget
   "botId "settings": {
        "userId": "bce7d22e-dde6-4427-b391-ebbdfda44de6", // OPTIONAL. Уникальный идентификатор пользователя
        "sessionIdsessions": [
            "bce7d22e-dde6-4427-b391-ebbdfda44de6",
  "sessionTtl": 3600,
  "messengerType": "WHATSAPP",
  "messengerUserId": "string",
  "messageBody": "string",
  "messageAttachments": [
    " // REQUIRED. Идентификатор сессии бота (можно передать несколько для прослушивания сразу нескольких сессий)
        ]
    }
}
Блок кода
languagejson
titlename
linenumberstrue
Всегда равно "js"
  • В ответ на подключение будет получено следующее сообщение:
Блок кода
languagejson
linenumberstrue
{
    "id": 1, // Порядковый номер сообщения
    "connect": { // Подробная информация о подключении
        "client": "bce7d22e-dde6-4427-b391-ebbdfda44de6", // Идентификатор клиента
   ],
     "clientNameForOperatorversion": "string",
  "clientId": "6.2.1 OSS", // Системная информация. Не имеет роли для интеграции
        "subs": { // Список доступных подписок
            "widget:bce7d22e-dde6-4427-b391-ebbdfda44de6",
  "clientExternalId": "string",
  "clientPhone": 75555673245,
  "clientEmail": "string",
  "clientDeviceId": "string",
  "clientTimezone": 300,
  "clientMetadata": {
    "var1": "val1",
    "var2": "val2",
    "var3": "val3"
  },
  "returnAnswerAsync": true
}

...

Поле

...

Тип

...

Обязательно

...

Описание

...

name

...

string

...

Нет

...

Имя сессии

...

botId

...

string

...

Нет

...

Пароль учётной записи аккаунта.

...

sessionId

...

Идентификатор существующего сеанса чата.

...

sessionTtl

...

Время жизни чат-сессии. Указывается в секундах и не может быть больше 12 часов. По умолчанию равен 3 600 секундам.

...

messengerType

...

messengerUserId

...

messageBody

...

messageAttachments

...

clientNameForOperator

...

Нет

...

Имя клиента, которое будет видно оператору.

...

clientId

...

Нет

...

clientExternalId

...

string

...

Нет

...

Определяемый пользователем идентификатор клиента, инициировавшего сеанс чата.

...

clientPhone

...

string

...

Нет

...

clientEmail

...

string

...

Нет

...

Электронная почта клиента

...

clientDeviceId

...

string

...

Нет

...

Идентификатор клиентского устройства для отправки PUSH-уведомлений.

...

clientTimezone

...

integer

...

Нет

...

Смещение часового пояса клиента в минутах.

...

clientMetadata

...

object

...

Нет

...

Любые определенные пользователем пары ключ/значение в качестве переменных бота.

: { // Имя канала подписки
                "recoverable": true, // Системная информация. Не имеет роли для интеграции
                "epoch": "1769579399", // Системная информация. Не имеет роли для интеграции
                "positioned": true // Системная информация. Не имеет роли для интеграции
            }
        },
        "ping": 25, // Частота пинга
        "pong": true // Флаг наличия понга
    }
}
  • Далее необходимо подписаться на доступные каналы подписки, чтобы получать в них события. Название канала – ключи из объектов subs ("widget:bce7d22e-dde6-4427-b391-ebbdfda44de6")
  • Далее нужно присоединиться к сессии 
    • Нужно передать rpc
    • Метод: joinSession
    • data: {"id": "bce7d22e-dde6-4427-b391-ebbdfda44de6"} // Идентификатор сессии
    • При успешно подключении в ответ будет получено сообщение: {"success": true}
  • Теперь в соккеты будут приходить события от бота и оператора, а также системные события

Список событий

  • showTypingIndicator – уведомление о наборе сообщения ботом или оператором
    Блок кода
    languagejson
    titlePayload события
    linenumberstrue
    {
        "authorType": "BOT" // Автор события: BOT | OPERATOR
    }
  • chatMessageCreated – сообщение от бота или оператора
    Блок кода
    languagejson
    titlePayload события
    linenumberstrue
    {
      

...

returnAnswerAsync

...

boolean

...

Нет

Ответы

Код 201

Description: Successful session creation

...

languagepy
themeDJango
firstline1
titleОтвет в формате JSON
linenumberstrue

...

  •   "id": "bce7d22e-dde6-4427-b391-ebbdfda44de6", // REQUIRED. Уникальный идентификатор сообщения
        "

...

  • authorType": "

...

  • BOT", // REQUIRED. ENUM: 'BOT' | 'OPERATOR'. Тип автора сообщения
        "body": "Тестовое сообщение", // REQUIRED. Текст сообщения (может быть пустым)
        "answers": [ // REQUIRED. Массив предустановленных вариантов ответов для пользователя
            "Вариант ответа 1",
            "

...

  • Вариант ответа 2",
            "Вариант ответа 3"
        ],
        "

...

  • keyboard":

...

  •  { // OPTIONAL. Объект клавиатуры с кнопками быстрых ответов
            "

...

  • buttonsInRow"

...

  • : 2, // Количество кнопок в 

...

  • одном ряду
            "

...

  • buttons": [ // Массив кнопок для отображения
                {
                    "

...

  • type": "

...

  • text", // Тип кнопки. Всегда text. 
                    

...

  • "text": "Кнопка 1" // Текст на кнопке
                },
                {
                    "type": "

...

  • text",
                    "

...

  • text": "

...

  • Кнопка 2"
                }
            ]
        },
        "createdAt": "2026-01-28T12:00:00+00:00", // REQUIRED. Дата и время создания сообщения в формате ISO 8601
        "sessionId": "bce7d22e-dde6-4427-b391-ebbdfda44de6", // REQUIRED. Идентификатор сессии чата 
        "attachments": [ // REQUIRED. Массив прикрепленных файлов (может быть пустым)
            {
                "id": "bce7d22e-dde6-4427-b391-ebbdfda44de6", // REQUIRED. Идентификатор вложения
                "contentType": "

...

  • image/png", // REQUIRED. MIME-тип файла (например: 'image/png', 'application/pdf')
                "

...

  • size": 1024000, // REQUIRED. Размер 

...

  • файла в байтах
                "downloadLink": "https://example.com/file.png", // REQUIRED. Ссылка для скачивания файла
                "name": "

...

  • test-file.png", // REQUIRED. Имя файла
                "

...

  • url": "

...

  • https://example.com/file.png" // OPTIONAL. Альтернативная ссылка на файл
            }
        ],
        "actions": [ // REQUIRED. Массив действий/кнопок для интерактивности (может быть пустым)
            {
                "

...

  • type": "

...

  • button", // REQUIRED. Тип действия
                "

...

  • event": "

...

  • click_action", // OPTIONAL. Событие, которое триггерится при клике
                "

...

  • label": "

...

  • Нажми меня", // OPTIONAL. Текст на кнопке действия
                "data": "

...

  • {\"key\": \"value\"}" // OPTIONAL. Дополнительные данные в формате строки
            }
        ],
        "avatar": "https://example.com/avatar.png", // OPTIONAL. URL аватара автора
        "

...

  • authorId": "

...

  • bce7d22e-dde6-4427-b391-ebbdfda44de6", // OPTIONAL. Идентификатор автора
        "authorName": "Тестовый Автор", // OPTIONAL. Имя автора сообщения
        "

...

  • type": "

...

  • REGULAR", // OPTIONAL. ENUM: 'REGULAR' | 'TERMINAL'. Тип сообщения
        "replyId": "bce7d22e-dde6-4427-b391-ebbdfda44de6", // OPTIONAL. Идентификатор сообщения, на которое это сообщение является ответом
        "replyToMessage": 

...

  • { // OPTIONAL. Объект с информацией о сообщении, на которое отвечают
        

...

 

Описание полей ответа

...

Поле

...

Тип

...

Обязательно

...

Описание

  •     "id": "bce7d22e-dde6-4427-b391-ebbdfda44de6", // REQUIRED. Идентификатор исходного сообщения
            "authorType": "CLIENT", // REQUIRED. ENUM: 'BOT' | 'OPERATOR' | 'CLIENT'. Тип автора исходного сообщения
            "body": "Исходное сообщение", // OPTIONAL. Текст исходного сообщения
            "authorName": "Имя клиента" // OPTIONAL. Имя автора исходного сообщения
        }
    }
  • operatorChanged – событие переключение диалога с бота или оператора на другого оператора или бота
    Блок кода
    languagejson
    titlePayload события
    linenumberstrue
    {
        "operatorId": "bce7d22e-dde6-4427-b391-ebbdfda44de6", // REQUIRED. Идентификатор нового оператора 
        "operatorName": "Тестовый Оператор", // REQUIRED. Имя нового оператора
        "avatar": "https://example.com/avatar.png", // REQUIRED. URL аватара нового оператора
        "previousOperatorId":

...

id

...

clientId

...

startedAt

...

ttl

...

messages

...

| body

...

| answers

...

| actions

...

| attachments

...

| | id

...

| | isPrivate

...

| | createdAt

...

| | name

...

| | baseName

...

| | extension

...

| | sugestedExtension

...

| | path

...

| | size

...

| | url

...

| | downloadLink

Создать сообщение клиента в чате

Метод: POST

Authorization: No Auth 

URL: https://chats-api.twin24.ai/api/v1/sessions/{session_id}/messages

Описание параметров пути:

...

Поле

...

Тип

...

Обязательно

...

Описание

...

sessionId

...

string

...

Да

...

Идентификатор чат-сессии.

Тело запроса

...

languagepy
themeDJango
firstline1
titleТело запроса в формате Json:
linenumberstrue

...

  •  "bce7d22e-dde6-4427-b391-ebbdfda44de6", // REQUIRED. Идентификатор предыдущего оператора
       

...

  •  "previousOperatorName": "Предыдущий Оператор", // REQUIRED. Имя предыдущего оператора
        "

...

  • previousOperatorAvatar":

...

Поле

...

Тип

...

Обязательно

...

Описание

  •  null // REQUIRED. URL аватара предыдущего оператора
    }
  • chatMessageRead – уведомление о прочтении сообщения оператором
    Блок кода
    languagejson
    titlePayload события
    linenumberstrue
    {
        "messageId": "bce7d22e-dde6-4427-b391-ebbdfda44de6" // REQUIRED. Идентификатор сообщения
    }
  • sessionClosed – уведомление о закрытии сессии оператором
    Блок кода
    languagejson
    titlePayload события
    linenumberstrue
    {
        "sessionId

...

body

...

string

...

attachments

...

array of strings

...

replyToMessageId

...

string

...

Ответы

Код 201

Description: Successful message creation

...

languagepy
themeDJango
firstline1
titleОтвет в формате JSON
linenumberstrue
collapsetrue

...

  • ": "bce7d22e-dde6-4427-b391-ebbdfda44de6", // REQUIRED. Идентификатор закрываемой сессии 
        "

...

  • chatId": "

...

Описание полей ответа

...

Поле

...

Тип

...

Обязательно

...

Описание

...

id

...

createdAt

...

Подключение к сокетам

...

titleО библиотеки socket.io

...

  • bce7d22e-dde6-4427-b391-ebbdfda44de6", // REQUIRED. Идентификатор чата
        "sessionRatingRequired": true // REQUIRED. Флаг, требуется ли оценка сессии от пользователя 
    }

Интеграция через HTTP REST API

Подробный рецепт данной интеграции описан в отдельной статье: Рецепт интеграции с ботом по API