← Назад к заметкам

Заметки

Как отлаживать imconnector и imopenlines

Как отлаживать интеграции открытых линий и коннекторов: логи, события, REST-вызовы и статусы сообщений.

Отладка открытых линий должна показывать всю цепочку: внешний канал, входящий обработчик, REST-вызов в Битрикс24, сессию, исходящее событие и ответ внешнего сервиса. Один лог только на стороне бота обычно не даёт полной картины.

Задача

Когда сообщение не дошло до оператора или ответ не ушёл клиенту, важно понять, на каком участке цепочки произошёл сбой.

У коннектора обычно есть минимум две стороны: входящие сообщения из внешней системы и исходящие сообщения операторов из Битрикс24. Логи нужны на обеих сторонах.

Какие логи писать

Логируйте не только ошибку, но и направление сообщения, внешний ID, ID линии, ID чата и результат REST-вызова.

function writeConnectorLog(string $message, array $context = []): void
{
    file_put_contents(
        __DIR__ . '/connector.log',
        json_encode([
            'date' => date('c'),
            'message' => $message,
            'context' => $context,
        ], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) . PHP_EOL,
        FILE_APPEND | LOCK_EX
    );
}

writeConnectorLog('incoming message', [
    'line_id' => $line_id,
    'external_chat_id' => $external_chat_id,
    'external_message_id' => $external_message_id,
]);

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

События и статусы

Если входящие сообщения есть, а исходящие не уходят, проверьте подписку на события коннектора и обработку статусов.

Для исходящих сообщений важно, получает ли приложение событие, успешно ли отвечает обработчик и что возвращает API внешнего канала. Если событие не приходит, проблема может быть в установке приложения или scope.

REST-вызовы отдельно от бизнес-логики

Отладку удобно разделять: отдельно проверить REST-метод Битрикс24, отдельно внешний API и только потом весь сценарий.

BX24.callMethod(
    'imopenlines.dialog.get',
    { SESSION_ID: 456 },
    function (result) {
        console.log(result.error() || result.data());
    }
);

Если REST-вызов с теми же параметрами не работает в изоляции, не нужно искать проблему в очереди или обработчике.