ВидеоКонф(ВКС)  ::   FAQ  ::   Поиск  ::   Регистрация  ::   Вход

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

Новичком считается только что прочитавший «Астериск - будущее телефонии»
http://asterisk.ru/knowledgebase/books
и пытающийся сделать большее

Модераторы: april22, Zavr2008

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

Сообщение Al8 » 27 апр 2016, 11:57

Есть 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.
Надеюсь правильное направление взял.
Al8
 
Сообщений: 85
Зарегистрирован: 07 фев 2016, 18:31

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

Сообщение ded » 27 апр 2016, 12:35

*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])
ded
 
Сообщений: 15828
Зарегистрирован: 26 авг 2010, 19:00

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

Сообщение Al8 » 27 апр 2016, 13:32

ded, спасибо
Последний раз редактировалось Al8 27 апр 2016, 13:36, всего редактировалось 1 раз.
Al8
 
Сообщений: 85
Зарегистрирован: 07 фев 2016, 18:31

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

Сообщение Wapo » 27 апр 2016, 13:36

В момент ответа оператора выполните макро и там в приложении DumpChan увидите ВСЕ переменные
Аватар пользователя
Wapo
 
Сообщений: 795
Зарегистрирован: 02 мар 2011, 18:53

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

Сообщение Al8 » 29 апр 2016, 15:37

У нас операторы сидят в очередях:
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.
Al8
 
Сообщений: 85
Зарегистрирован: 07 фев 2016, 18:31

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

Сообщение Wapo » 29 апр 2016, 15:51

При кривых руках AGI может раком поставить. Но еще веселее - как его ставит CURL когда внешний сервер запросов подвисает.
Сколько AGI не использовал - ни разу ничего не случалось даже при ОЧЕНЬ большой нагрузке.
Аватар пользователя
Wapo
 
Сообщений: 795
Зарегистрирован: 02 мар 2011, 18:53

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

Сообщение ded » 29 апр 2016, 16:48

Надо а) кэшировать ответы, чтобы брать в первую очередь кэшиованный ответ, и если нет в кэше - делать запросЮ при этом
б) использовать таймаут - (полсекунды хватит?) после которого игнорировать есть ответ или нет.
ded
 
Сообщений: 15828
Зарегистрирован: 26 авг 2010, 19:00

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

Сообщение Vlad1983 » 29 апр 2016, 18:14

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

удобней навешивать демона, слушающего AMI и отправляющего что надо куда надо
тогда и переписывать диалплан не придется и нет шансов уронить
ЛС: @rostel
Vlad1983
 
Сообщений: 4251
Зарегистрирован: 09 авг 2011, 11:51

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

Сообщение virus_net » 30 апр 2016, 09:52

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()
мой SIP URI sip:virus_net@asterisk.ru
bitname.ru - Домены .bit (namecoin) .emc .coin .lib .bazar (emercoin)

ENUMER - звони бесплатно и напрямую.
virus_net
 
Сообщений: 2337
Зарегистрирован: 05 июн 2013, 08:12
Откуда: Москва

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

Сообщение Al8 » 05 май 2016, 15:38

Пока все еще тестю. Вроде что-то уже есть.
По аналогии с 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()
Al8
 
Сообщений: 85
Зарегистрирован: 07 фев 2016, 18:31

След.

Вернуться в Вопросы новичков

Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 52

© 2008 — 2024 Asterisk.ru
Digium, Asterisk and AsteriskNOW are registered trademarks of Digium, Inc.
Design and development by PostMet-Netzwerk GmbH