Лия позволяет подготовить — фрагмент кода, который можно использовать как шаг в . Ранее мы уже рассказывали, . А в этой статье мы покажем, как с помощью сниппета отправить API-запрос к вашему серверу и работать с полученным ответом прямо во время общения Лии с клиентом, без вмешательства оператора.
Как и в прошлый раз, мы возьмем пример с номером телефона, но важно отметить, что этот подход можно использовать не только для телефонных данных — аналогичным способом вы можете обрабатывать любые данные, которые поступают на вход в сообщении.
Зачем это нужно?
Многим нашим клиентам — операторам связи, банкам, сервисам доставки и другим компаниям — необходимо автоматически определять и обрабатывать данные клиентов. Это помогает решать задачи, такие как направлять обращения в нужный отдел, предлагать персонализированные предложения или выявлять подозрительные действия для антифрод-анализа, что значительно упрощает процессы и улучшает взаимодействие с клиентами.
Например, номер телефона помогает определить оператора, регион, коды и другие параметры, что может быть полезно для вашего бизнес-логики.
Примерный алгоритм и сниппет
Вот простой алгоритм действий, который описывает работу сниппета:
Получаем номер телефона: — Если номер передан в параметрах, используем его. — Если номера нет в параметрах, ищем его в контексте (например, из сообщений в чате).
Проверяем номер телефона: — Убираем все лишние символы (например, пробелы или дефисы). — Убираем код страны (например, 7 или 8 для России), если он есть.
Отправляем запрос к API: — Формируем запрос к внешнему сервису (например, API оператора), передаем очищенный номер телефона.
Получаем ответ от API: — Смотрим, какой статус вернул API. Если все в порядке, продолжаем работу. Если ошибка — выводим сообщение об ошибке.
Сохраняем данные: — Сохраняем информацию о операторе, регионе и других параметрах в контекст, чтобы использовать их дальше в процессе общения с клиентом.
Выводим информацию: — Логируем или выводим в чат информацию о найденном операторе и других данных (например, название оператора).
Обработка ошибок: — Если возникла ошибка при запросе или обработке, выводим сообщение об ошибке и предлагаем возможные действия.
Важно! Все логи 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('Не удалось получить информацию о номере телефона');
}
}