Как с помощью сниппета сделать API-запрос для обработки номера телефона и иных данных из сообщений?

Лия позволяет подготовить сниппет — фрагмент кода, который можно использовать как шаг в Сценарии. Ранее мы уже рассказывали, как настроить бота для определения номера телефона и передачи его в контекст. А в этой статье мы покажем, как с помощью сниппета отправить API-запрос к вашему серверу и работать с полученным ответом прямо во время общения Лии с клиентом, без вмешательства оператора.

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

Зачем это нужно?

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

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

Примерный алгоритм и сниппет

Вот простой алгоритм действий, который описывает работу сниппета:

  1. Получаем номер телефона: — Если номер передан в параметрах, используем его. — Если номера нет в параметрах, ищем его в контексте (например, из сообщений в чате).

  2. Проверяем номер телефона: — Убираем все лишние символы (например, пробелы или дефисы). — Убираем код страны (например, 7 или 8 для России), если он есть.

  3. Отправляем запрос к API: — Формируем запрос к внешнему сервису (например, API оператора), передаем очищенный номер телефона.

  4. Получаем ответ от API: — Смотрим, какой статус вернул API. Если все в порядке, продолжаем работу. Если ошибка — выводим сообщение об ошибке.

  5. Сохраняем данные: — Сохраняем информацию о операторе, регионе и других параметрах в контекст, чтобы использовать их дальше в процессе общения с клиентом.

  6. Выводим информацию: — Логируем или выводим в чат информацию о найденном операторе и других данных (например, название оператора).

  7. Обработка ошибок: — Если возникла ошибка при запросе или обработке, выводим сообщение об ошибке и предлагаем возможные действия.

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

async function snippet (core = new Core(), context = new Context()) {
    // Измените на ваш URL API
    const apiUrl = 'https://api.example.com/v2/operator?number='; 
    // Переменные для хранения номера телефона
    let phone = null; 
    let inputPhone = null; 

    // Проверяем, был ли передан номер телефона
    if (inputPhone) {
        phone = inputPhone; // Если номер передан в параметре, используем его
    } else if (context && context.current && context.current.meta && 
               context.current.meta.entities && context.current.meta.entities.phone) {
        // Если номер телефона есть в контексте, извлекаем его
        phone = context.current.meta.entities.phone.raw;
    }
    
    // Проверяем, что номер телефона действительно найден (для отладки)
    if (!phone) {
        core.sendText('Номер телефона не указан в контексте');
        return null;
    }

    // Логируем номер телефона для тестирования (для отладки)
    core.sendText('Номер телефона в контексте: ' + phone);

    // Преобразуем номер в строку и удаляем все нецифровые символы 
    // (например, пробелы, скобки, дефисы)
    phone = String(phone); 
    phone = phone.replace(/\D/g, '');

    // Убираем код страны (например, 7 или 8 для России)
    if (phone.startsWith('7') || phone.startsWith('8')) {
        phone = phone.slice(1);
    }

    // Логируем номер для отправки запроса (для отладки)
    core.sendText(`Отправляем запрос с номером: ${phone}`);

    try {
        // Отправляем GET запрос к API с номером телефона
        // Запрос будет отличаться в зависимости от вашего API
        const response = await axios.get(apiUrl, {
            params: { number: phone }, // Передаем номер в параметре
            headers: {
                "Accept": "*/*", 
                "Accept-Language": "en,ru;q=0.9,en-GB;q=0.8,en-US;q=0.7",
                "Cache-Control": "no-cache",
                "Connection": "keep-alive",
                "Origin": "https://api.example.com/v2/operator?number=",
                "Pragma": "no-cache",
                "Referer": "https://api.example.com/v2/operator?number=",
                "Sec-Fetch-Dest": "empty",
                "Sec-Fetch-Mode": "cors",
                "Sec-Fetch-Site": "same-site",
                "User-Agent": ""
            }
        });

        // Получаем ответ от API
        const operatorInfo = response.data;

        // Проверяем код статуса ответа
        // statusCode возвращает 1001 - успех,  3003 - ошибка
        if (operatorInfo.statusCode && operatorInfo.statusCode !== 1001) {
           throw new Error(`Ошибка API: ${operatorInfo.statusCode}`);
        }

        // Сохраняем данные в контексте
        // Response
        context.set("operatorInfo", operatorInfo); 
        // Имя оператора
        context.set("operatorName", operatorInfo.operator); 
        // Регион
        context.set("region", operatorInfo.region);
        // Полное название оператора
        context.set("operatorTitle", operatorInfo.title);
         // Код оператора
        context.set("operatorCode", operatorInfo.code);

        // Логируем данные для отладки
        core.sendText("Ответ API получен и сохранен в контексте");
        
        // Название оператора
        // JSON.stringify превращает объект в строку формата JSON,
        // чтобы представить данные в текстовом виде.
        core.sendText(JSON.stringify(context.operatorInfo));
        return operatorInfo.code;

    } catch (error) {
        // Обработка ошибки
        core.sendText(`Ошибка при запросе: ${error.message}`);
        if (error.response && error.response.data) {
            core.sendText(JSON.stringify(error.response.data));
            return error.response.data;
        }
        core.sendText('Не удалось получить информацию о номере телефона');
    }
}

Last updated