Если в вашей очереди FreePBX клиенты не всегда дожидаются ответа операторов, удобно получать уведомления о таких пропущенных звонках прямо в Telegram. В этой инструкции описаны все шаги — от создания бота до настройки PHP-скрипта, который будет автоматически отправлять уведомления в выбранную группу.


1. Создание Telegram-бота

  1. В Telegram найдите пользователя @BotFather.
  2. Отправьте команду /newbot.
  3. Задайте имя и уникальный логин вашего бота (например, freepbx_alert_bot).
  4. Скопируйте выданный токен вида:
    1234567890:AAEExampleTokenGeneratedByBotFather
  5. Сохраните токен — он нужен для подключения из скрипта.

2. Создание Telegram-группы для уведомлений

  1. Создайте новую группу, например «Пропущенные звонки FreePBX».
  2. Добавьте в неё созданного бота.
  3. Сделайте бота администратором группы.
  4. Отправьте в группу любое сообщение (например, тест).
  5. Чтобы узнать chat_id группы, откройте в браузере ссылку:
    https://api.telegram.org/botВАШ_ТОКЕН/getUpdates
    В ответе найдите блок с параметром "chat":{"id":-100XXXXXXXXXXXX} — это и есть идентификатор группы.

3. Проверка подключения бота

Для проверки отправьте сообщение напрямую через браузер (заменив значения на свои):

https://api.telegram.org/botВАШ_ТОКЕН/sendMessage?chat_id=-100XXXXXXXXXXXX&text=Тестовое+сообщение+от+FreePBX

Если сообщение появилось в Telegram, бот работает корректно.


4. Подключение к базе данных FreePBX

Для получения номера звонящего используется таблица cdr.
Параметры подключения можно узнать командой:

grep -E 'AMPDBHOST|AMPDBUSER|AMPDBPASS|AMPDBNAME' /etc/freepbx.conf

Пример вывода:

$amp_conf['AMPDBUSER'] = 'freepbxuser';
$amp_conf['AMPDBPASS'] = 'MySecurePass';
$amp_conf['AMPDBHOST'] = 'localhost';
$amp_conf['AMPDBNAME'] = 'asteriskcdrdb';

Эти данные понадобятся при настройке PHP-скрипта.
Не размещайте реальные логины и пароли в открытых источниках.


5. Подготовка PHP-окружения

Проверьте, что на сервере установлены PHP и расширение PDO MySQL:

php -v
php -m | grep pdo_mysql

Если отсутствуют, установите их:

yum install -y php-cli php-mysqlnd

6. Создание PHP-скрипта уведомлений

Откройте файл /usr/local/bin/queue_abandon_alert.php:

nano /usr/local/bin/queue_abandon_alert.php

Вставьте следующий код, указав свои значения токена, chat_id и данных БД:

<?php
// ---------- НАСТРОЙКИ ----------
$queue    = '1100'; // номер очереди
$botToken = '1234567890:AAEExampleTokenGeneratedByBotFather';
$chatId   = '-1001234567890'; // ID Telegram-группы
$logFile  = '/var/log/asterisk/queue_log';
$stateFile = '/var/lib/asterisk/queue_alert.pos';
$lockFile  = '/var/run/queue_alert.lock';

// Подключение к базе
$dbHost = 'localhost';
$dbName = 'asteriskcdrdb';
$dbUser = 'freepbxuser';
$dbPass = 'MySecurePass';

// Подключение к БД
try {
    $pdo = new PDO("mysql:host={$dbHost};dbname={$dbName};charset=utf8mb4", $dbUser, $dbPass);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (Exception $e) {
    error_log("DB connect error: " . $e->getMessage());
    $pdo = null;
}

// Блокировка от повторного запуска
$lock = fopen($lockFile, 'c');
if (!$lock || !flock($lock, LOCK_EX | LOCK_NB)) exit(0);

// Проверка состояния
if (!file_exists(dirname($stateFile))) @mkdir(dirname($stateFile), 0750, true);
$lastPos = file_exists($stateFile) ? (int)file_get_contents($stateFile) : 0;

// Открываем лог очереди
$fh = fopen($logFile, 'r');
if (!$fh) exit(1);
$logSize = filesize($logFile);
if ($logSize < $lastPos) $lastPos = 0; // ротация лога

fseek($fh, $lastPos);
$newPos = $lastPos;
$processed = 0;

// Читаем новые строки
while (($line = fgets($fh)) !== false) {
    $newPos = ftell($fh);
    $parts = explode('|', trim($line));
    if (count($parts) < 6) continue;

    list($timestamp, $callid, $queueName, $agent, $event) = $parts;
    if ($event !== 'ABANDON' || $queueName !== $queue) continue;

    $position = $parts[5] ?? '';
    $origPos  = $parts[6] ?? '';
    $waitTime = $parts[7] ?? '';

    // Получаем номер звонящего
    $src = 'неизвестно';
    if ($pdo) {
        $q = $pdo->prepare("SELECT src FROM cdr WHERE uniqueid=:uid OR linkedid=:uid ORDER BY calldate DESC LIMIT 1");
        $q->execute(['uid' => $callid]);
        $src = $q->fetchColumn() ?: 'неизвестно';
    }

    // Формируем сообщение
    $time = date('Y-m-d H:i:s', (int)$timestamp);
    $text = "📞 *Клиент не дождался ответа в очереди {$queueName}*\n".
            "🕒 Время: `{$time}`\n".
            "☎️ Номер: `{$src}`\n".
            "📊 Позиция при уходе: {$position} (вошёл {$origPos}-м)\n".
            "⏱️ Ожидал: {$waitTime} сек.";

    // Отправляем сообщение в Telegram
    file_get_contents("https://api.telegram.org/bot{$botToken}/sendMessage?".
        http_build_query(['chat_id' => $chatId, 'text' => $text, 'parse_mode' => 'Markdown']));

    $processed++;
}

fclose($fh);
file_put_contents($stateFile, $newPos);
@chmod($stateFile, 0600);

if ($processed > 0) syslog(LOG_INFO, "queue_abandon_alert: processed {$processed} ABANDON event(s)");
flock($lock, LOCK_UN);
fclose($lock);
?>

Сохраните файл (Ctrl + OEnterCtrl + X) и сделайте его исполняемым:

chmod +x /usr/local/bin/queue_abandon_alert.php

7. Проверка работы

Для ручного запуска:

php /usr/local/bin/queue_abandon_alert.php

Если в /var/log/asterisk/queue_log есть новые записи с событием ABANDON,
в Telegram появятся уведомления о пропущенных звонках с указанием времени, номера клиента и позиции в очереди.


8. Добавление задачи в cron

Чтобы скрипт выполнялся автоматически каждые 10 минут:

crontab -e

Добавьте строку:

*/10 * * * * /usr/bin/php /usr/local/bin/queue_abandon_alert.php >/dev/null 2>&1

Проверьте наличие задания:

crontab -l

После этого уведомления будут приходить в Telegram без участия администратора.


9. Преимущества подхода

  • Мониторинг в реальном времени без лишней нагрузки на FreePBX.
  • Нет повторных уведомлений — используется контрольная позиция чтения лога.
  • Автоматическая защита от дублирующего запуска.
  • Уведомления приходят в единый Telegram-чат, доступный всем операторам.

10. Пример уведомления в Telegram

📞 Клиент не дождался ответа в очереди 1100
🕒 Время: 2025-11-04 18:27:44
☎️ Номер: +375298237291
📊 Позиция при уходе: 1 (вошёл 1-м)
⏱️ Ожидал: 8 сек.

Такое уведомление приходит автоматически, как только клиент покидает очередь, не дождавшись ответа оператора.


11. Заключение

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

Как настроить уведомления о пропущенных звонках в FreePBX через Telegram

18 мыслей о “Как настроить уведомления о пропущенных звонках в FreePBX через Telegram

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *