Чтение вывода Asterisk AMI

Никак не могу разобраться как считать вывод ответа на Action из AMI. Например при отправке Action: QueueStatus введите сюда описание изображения

Получить ту информацию что выводится в терминале не получается. Пробовал перед отправкой Action вешать Event Listner, но на вывод ничего не приходит, пример:

client = await self.__ami_service.get_client_by_city(city)

try:
    def on_event(event, **kwargs):
        test = event.response
        client.logoff()
        client.disconnect()

    client.add_event_listener(on_event=on_event, white_list=['QueueParams', 'QueueMember'])
except:
    client.disconnect()

queue_actuon = SimpleAction(
    'QueueStatus'
)

result = client.send_action(queue_actuon)

Так же пробовал слушать события и отправлять Action из разных сервисов, но результата так же не получил. Использовался Python 3.8 и библиотека asterisk-ami.


Ответы (1 шт):

Автор решения: Dovgan Taras

Дело оказалось в библиотеке, которая читать и выводить так данные не может. На GitHub в 2018 году подобный вопрос был задан создателям библиотеки и предложены правки, что бы вывод был корректный, но пул реквест завис https://github.com/ettoreleandrotognoli/python-ami/pull/27. Выхода два:

  1. Скопировать библиотеку, внести туда необходимы правки и пользоваться;
  2. Использовать пример ниже.

Код в вопросе похож на правду, но в конце необходимо добавить sleep. В итоге пример выглядит так:

def func(queue):
    events = []
    client = await self.__ami_service.get_client_by_city(city)

    try:
        def event_listener(event, **kwargs):
            events.append(event)

        listener = client.add_event_listener(event_listener, white_list=['QueueParams', 'QueueMember', 'QueueEntry'])
        client.send_action(SimpleAction('QueueStatus', Queue=queue))
        time.sleep(1)
        client.remove_event_listener(listener)
    except Exception as e:
        logger.exception(e)
    finally:
        client.logoff()
        client.disconnect()
        del client  

    return events

Без remove_event_listener, logoff, disconnect и удаление объекта подключения при отправки нескольких комманд подряд начинают сыпаться ошибки. Дальше решил не разбираться.

→ Ссылка