CRM качает запись разговора без авторизации — и молча кладёт битый файл
Запись прикрепилась к звонку, но не воспроизводится или весит пару килобайт.
restoauth
Интеграция телефонии с CRM. Звонок завершается, отдаём в CRM ссылку на запись — и она честно её принимает. В карточке звонка появляется вложение.
Открываешь — тишина. Или файл на два килобайта, внутри HTML со страницей логина.
Причина
CRM не пересылает вам файл. Она сама идёт по ссылке своим HTTP-клиентом — с сервера, без ваших заголовков и без токена провайдера.
У любого нормального провайдера телефонии ссылка на запись защищена: без
Authorization отдаётся либо 401, либо редирект на страницу входа. Именно эту
страницу CRM и сохраняет как «запись разговора», не проверяя, что скачала.
Отсюда и симптом: ошибки нет нигде — ни в логах интеграции, ни в интерфейсе. Формально всё отработало.
Решение
Файл нужно забрать самому и отдать CRM то, что она может скачать без секретов.
Порядок такой:
- Скачать запись со стороны провайдера — со своим токеном.
- Положить её туда, откуда CRM возьмёт файл без авторизации: временная ссылка с подписью и коротким сроком жизни, либо прямая загрузка файла в CRM, если её API это умеет.
- Отдать в CRM уже этот адрес, а не исходный.
Второй вариант — загрузка файлом — надёжнее: не остаётся публичной ссылки, которая живёт дольше, чем нужно.
Как поймать раньше, чем заметит заказчик
Проверять не факт прикрепления, а сам файл:
curl -sI "<ссылка, которую отдаём в CRM>" | head -3
# ожидаем 200 и Content-Type аудио, а не text/html
И контролировать размер: запись разговора не может весить два килобайта. Порог в сотню килобайт отсекает и страницы логина, и пустые файлы.
Соседняя ловушка
Записи короче тридцати секунд провайдер может вообще не хранить. Интеграция будет исправно ходить за ними и получать 404, забивая логи и очередь ретраев. Такие звонки нужно помечать как «без записи» и не повторять запрос — файла не появится никогда.