Страница 1 из 2

Отправка CallerID звонившего на внут. EXT с помощью GET

Добавлено: 27 апр 2016, 10:57
Al8
Есть Asterisk.

В нем очереди с внутренними абонентами
member => SIP/200
member => SIP/220

Потребовалось отправлять данные о звонке на сайт:
1. Внешний номер звонившего, например 450-510-500
2. Внутренний номер куда звонивший попал, например 200.
3. Формат отправки например - calls.site.ru/!callid=450-510-500&intext=200

Сейчас разбираюсь c GET запросом и MEMBERINTERFACE.
Надеюсь правильное направление взял.

Re: Отправка CallerID звонившего на внут. EXT с помощью GET

Добавлено: 27 апр 2016, 11:35
ded
*CLI> core show function CURL

-= Info about function 'CURL' =-

[Synopsis]
Retrieves the contents of a URL

[Description]
url - URL to retrieve
post-data - Optional data to send as a POST (GET is default action)


[Syntax]
CURL(url[,post-data])

Re: Отправка CallerID звонившего на внут. EXT с помощью GET

Добавлено: 27 апр 2016, 12:32
Al8
ded, спасибо

Re: Отправка CallerID звонившего на внут. EXT с помощью GET

Добавлено: 27 апр 2016, 12:36
Wapo
В момент ответа оператора выполните макро и там в приложении DumpChan увидите ВСЕ переменные

Re: Отправка CallerID звонившего на внут. EXT с помощью GET

Добавлено: 29 апр 2016, 14:37
Al8
У нас операторы сидят в очередях:
exten => _X.,n, Queue(company-day,tw,,,,,check)
Получается при внешнем вызове, когда поднимает оператор, вызывается макрос check, сам макрос:
[macro-check]
exten => s,1,Set(CALLNUM=${CONNECTEDLINE(num))
exten => s,n, NoOp(CALL MAN NUMBER - ${CALLNUM})
exten => s,n,Set(AGENT=${CUT(MEMBERINTERFACE,/,2)})
exten => s,n, NoOp(AGENT NUMBER - ${AGENT})
В переменную CALLNUM падает внешний номер, в AGENT - внутренний оператора.

Сейчас разбираюсь с FastAGI, чтобы потом Пайтон скриптом отправлять данные на внешний сайт.
С AGI простой скрипт работает, но пишут/говорят, что AGI может раком поставить Asterisk.

Re: Отправка CallerID звонившего на внут. EXT с помощью GET

Добавлено: 29 апр 2016, 14:51
Wapo
При кривых руках AGI может раком поставить. Но еще веселее - как его ставит CURL когда внешний сервер запросов подвисает.
Сколько AGI не использовал - ни разу ничего не случалось даже при ОЧЕНЬ большой нагрузке.

Re: Отправка CallerID звонившего на внут. EXT с помощью GET

Добавлено: 29 апр 2016, 15:48
ded
Надо а) кэшировать ответы, чтобы брать в первую очередь кэшиованный ответ, и если нет в кэше - делать запросЮ при этом
б) использовать таймаут - (полсекунды хватит?) после которого игнорировать есть ответ или нет.

Re: Отправка CallerID звонившего на внут. EXT с помощью GET

Добавлено: 29 апр 2016, 17:14
Vlad1983
на подобные запросы астериску ждать ответов вовсе не нужно
просто пулять как в черную дыру через AGI не получится, т.к. AGI - синхронный интерфейс

удобней навешивать демона, слушающего AMI и отправляющего что надо куда надо
тогда и переписывать диалплан не придется и нет шансов уронить

Re: Отправка CallerID звонившего на внут. EXT с помощью GET

Добавлено: 30 апр 2016, 08:52
virus_net
Vlad1983 писал(а):просто пулять как в черную дыру через AGI не получится, т.к. AGI - синхронный интерфейс
Вы абсолютно правы, но все же возможность, сделать "черную дыру", есть.
Если вызывать скрипт, НО в нем не исполняемый по задаче код, а только вызов другого скрипта (в котором и будет выполняться все что надо) с обязательным отвязыванием stdin, stdout и оправкой скрипта в background.
Пример на PHP:
<?php
$cmd=sprintf("/usr/local/bin/php mylogic.php '%s' > /dev/null 2>/dev/null &",$myParams);
@exec( $cmd , $execOut, $execRes );
?>
Таким образом вызов такого скрипта из диалплана запустит нужный скрипт с логикой, а dialplan сразу отпустит и он пойдет далее, т.е. получается "плюнул и забыл".
Вызывать такой скрипт можно и через System()

Re: Отправка CallerID звонившего на внут. EXT с помощью GET

Добавлено: 05 май 2016, 14:38
Al8
Пока все еще тестю. Вроде что-то уже есть.
По аналогии с PHP, сделал тоже самое на Питоне. Тестовый сайт для получения данных от Астера сделал на PHP, но он пока принимает данные в интерактивном режиме, это надо мне переделать, чтобы данные ложились в файл (или БД).

Создал простой скрипт который вызывается в диалплане:

/usr/lib/asterisk/agi-bin/test.py

Код: Выделить всё

#!/usr/bin/env python
"""Say number due to language specific rules"""
import re
import os
import sys

#from itertools import imap

def main():
    """Main function"""

    FNULL = open(os.devnull,'w')
    retcode = subprocess.call(['/var/lib/asterisk/agi-bin/sub.py ', ${CALLNUM}, ${AGENT}], stdout=FNULL, stderr=subprocess.STDOUT)
    return
if __name__ == "__main__":
    main()
Вызов этого скрипта вставил в макрос check

Код: Выделить всё

exten => s,n, System(/var/lib/asterisk/agi-bin/test.py ${CALLNUM} ${AGENT})
Создал сам под скрипт отправки данных:
/usr/lib/asterisk/agi-bin/sub.py

Код: Выделить всё

#!/usr/bin/env python
"""Say number due to language specific rules"""
import re
import os
import sys
import subprocess

#from itertools import imap

def main():
    """Main function"""

    proc = subprocess.Popen('/usr/bin/curl --request GET 192.168.0.126/index.php --data caller=${CALLNUM}&inner=${AGENT}', shell=True, stdout=subprocess.PIPE)
    out = proc.stout.readline()

if __name__ == "__main__":
    main()