Как можно экспортировать информацию о звонках в систему Asterisk/FreePBX в файл?

FreePBX 17 и Asterisk 21 <br/> Здравствуйте! Поделитесь, пожалуйста, существует ли надежный метод для получения информации о звонках во внешнюю среду, например, в файл? Мне нужны такие данные, как время звонка, продолжительность разговора, направление, номер телефона и запись разговора. <br/> Я пробовал настраивать диалплан, но в логах слишком много ненужной информации, и один и тот же звонок может записываться несколько раз. <br/> Я также использовал custom-from-trunk с hangup_handler_push и вносил изменения в extensions_override_freepbx.conf макрос dialout-trunk, но это также не дало нужного результата. <br/> Буду благодарен за любые советы, если кто-то использует подобный метод.
  • 12 марта 2025 г. 14:25
Ответы на вопрос 2
Экспорт информации о звонках в Asterisk/FreePBX можно реализовать различными способами. Рассмотрим один из наиболее распространенных и надежных методов с использованием AMI (Asterisk Manager Interface) и AGI (Asterisk Gateway Interface) для получения нужной информации и записи её в файл.

### 1. Использование AMI

Asterisk Manager Interface позволяет отслеживать события звонков и получать нужную информацию в реальном времени.

#### Шаги:
1. **Настройка AMI:**
   - Откройте файл `manager.conf`, который обычно находится в `/etc/asterisk/`.
   - Добавьте пользователя с соответствующими правами. Например:

     ```ini
     [myuser]
     secret=mysecret
     read = all
     write = all
     ```

2. **Создание скрипта для обработки событий:**
   - Используйте язык программирования, поддерживающий TCP соединения (например, Python или PHP).
   - В скрипте устанавливайте TCP-соединение с Asterisk и прослушивайте события, такие как `Newchannel`, `Hangup`, и др.
   - Когда получите событие `Hangup`, соберите нужные данные (время, продолжительность, направление, номер, запись) и запишите их в файл.

   Пример на Python:

   ```python
   import socket

   def connect_to_ami():
       ami_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
       ami_socket.connect(("localhost", 5038))
       ami_socket.sendall(b"Action: Login\r\nUsername: myuser\r\nSecret: mysecret\r\n\r\n")
       return ami_socket

   def log_call_data(data):
       with open("call_log.txt", "a") as f:
           f.write(data)

   def main():
       ami_socket = connect_to_ami()
       while True:
           response = ami_socket.recv(4096).decode()
           if "Hangup" in response:  # Обработка события Hangup
               # Извлечение нужной информации из response
               # Например, можно использовать регулярные выражения
               log_call_data(response)

   if __name__ == '__main__':
       main()
   ```

### 2. Использование AGI

Если вам нужно больше контроля и возможность обработать звонки в процессе выполнения, можете использовать AGI. Это позволит вам вызывать ваш скрипт на любой стадии звонка.

#### Шаги:
1. **Создание AGI-скрипта:**
   - Напишите AGI-скрипт на любом поддерживаемом языке (например, Perl, Python).
   - Используйте скрипт для записи в файл нужной информации при вызове.

   Например, простой AGI на Python:

   ```python
   #!/usr/bin/env python
   import sys

   def log_call_details():
       # Получение параметров из Asterisk
       caller_id = sys.stdin.readline().strip()  # Получить caller ID
       duration = sys.stdin.readline().strip()    # Получить продолжительность, если передано

       with open("call_data.txt", "a") as f:
           f.write(f"{caller_id},{duration}\n")

   if __name__ == "__main__":
       log_call_details()
   ```

2. **Изменение диалплана для вызова AGI:**
   - В `extensions_additional.conf` или в вашем пользовательском диалплане добавьте вызов AGI, как показано ниже:

   ```plaintext
   exten => _X.,n,AGI(myagi_script.py)
   ```

### 3. Использование существующих модулей

Существуют различные модули для FreePBX, такие как "Call Reporting", которые могут предоставить вам нужно (с возможностью экспорта).

### Заключение

Вы можете выбрать метод, который лучше всего соответствует вашим потребностям. Использование AMI позволит вам получить информацию в реальном времени, в то время как AGI может быть более удобным для обработки звонков во время их выполнения.
Через mysql смотреть в CDR 
Через API
Через AMI - Ловим событие начала звонка - ловим событие завершения звонка.
Похожие вопросы