VIDEOCHAT  ::   FAQ  ::   Поиск  ::   Регистрация  ::   Вход

Выполнение AGI скрипта на PHP

Проблемы Asterisk без вэб-оболочек и их решения

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

Ответить
NotSure69
Сообщения: 1
Зарегистрирован: 17 июн 2022, 11:17

Выполнение AGI скрипта на PHP

Сообщение NotSure69 »

Добрый день!

Пытаюсь написать простенький php скрипт для обращения к API "Яндекс. Поиск по организациям"
Цель: При входящем звонке через API получать название организации по CALLERID звонящего.

Для связи с Asterisk использую phpagi.php

Проблема следующая:
Скрипт обращается к API через curl, далее получает в качестве ответа JSON, из которого вытаскивает значение поля "name"
При запуске скрипта из shell и отправки ему номера в качестве аргумента все работает корректно.

При попытке запускать скрипт из Asterisk через agi не отрабатывает curl, соответственно поле "name" остается пустым.
Пробовал в скрипте выводить результаты curl в файл - файл не создается.

Вот сам скрипт:
PRIME_BBCODE_SPOILER_SHOW PRIME_BBCODE_SPOILER:
#!/usr/bin/php -q
<?php
require('phpagi.php');.
$agi = new AGI(); //подключаем файл phpagi.php

$stdin = fopen('php://stdin', 'r');
$stdout = fopen('php://stdout', 'w');
$stdlog = fopen('my_agi.log', 'w');

$cid = $agi->request['agi_callerid']; // берем из AGI номер звонящего
$apiresponse=`/usr/bin/curl "https://search-maps.yandex.ru/v1/?apikey=<мой апи ключ>&text=$cid&lang=ru_RU&type=biz&results=1"`;
$jarr=json_decode($apiresponse, TRUE);

if ($jarr['properties']['ResponseMetaData']['SearchResponse']['found'] != 0) {
$name = $jarr['features'][0]['properties']['name'];
};
shell_exec(echo $jdecode >> /tmp/testagi);

$agi->set_variable("name", $name);
$agi->set_variable("agicid", $cid);
$agi->set_variable("agicid1", $argv[1]);


fclose ($stdin);
fclose ($stdlog);
exit(0);
?>
Вызов скрипта из диалплана
PRIME_BBCODE_SPOILER_SHOW PRIME_BBCODE_SPOILER:
same => n,AGI(testagi1.php,7${CALLERID(num)})
same => n,Noop(/-------------------\)
same => n,Noop(|Name is: ${outname}|)
same => n,Noop(|AGI Name is: ${name}|)
same => n,Noop(|AGI CID is: ${agicid}|)
same => n,Noop(|AGI arg is: ${agicid1}|)
same => n,Noop(\-------------------/)
Вывод из консоли CLI
PRIME_BBCODE_SPOILER_SHOW PRIME_BBCODE_SPOILER:
-- Executing [s@macro-incoming:6] AGI("DAHDI/i1/4957877272-31a2", "testagi1.php,74957877272") in new stack
-- Launched AGI Script /var/lib/asterisk/agi-bin/testagi1.php
<DAHDI/i1/4957877272-31a2>AGI Tx >> agi_request: testagi1.php
<DAHDI/i1/4957877272-31a2>AGI Tx >> agi_channel: DAHDI/i1/4957877272-31a2
<DAHDI/i1/4957877272-31a2>AGI Tx >> agi_language: ru
<DAHDI/i1/4957877272-31a2>AGI Tx >> agi_type: DAHDI
<DAHDI/i1/4957877272-31a2>AGI Tx >> agi_uniqueid: 1655455822.160021
<DAHDI/i1/4957877272-31a2>AGI Tx >> agi_version: 16.20.0
<DAHDI/i1/4957877272-31a2>AGI Tx >> agi_callerid: 4957877272
<DAHDI/i1/4957877272-31a2>AGI Tx >> agi_calleridname: unknown
<DAHDI/i1/4957877272-31a2>AGI Tx >> agi_callingpres: 1
<DAHDI/i1/4957877272-31a2>AGI Tx >> agi_callingani2: 0
<DAHDI/i1/4957877272-31a2>AGI Tx >> agi_callington: 33
<DAHDI/i1/4957877272-31a2>AGI Tx >> agi_callingtns: 0
<DAHDI/i1/4957877272-31a2>AGI Tx >> agi_dnid: 686
<DAHDI/i1/4957877272-31a2>AGI Tx >> agi_rdnis: unknown
<DAHDI/i1/4957877272-31a2>AGI Tx >> agi_context: macro-incoming
<DAHDI/i1/4957877272-31a2>AGI Tx >> agi_extension: s
<DAHDI/i1/4957877272-31a2>AGI Tx >> agi_priority: 6
<DAHDI/i1/4957877272-31a2>AGI Tx >> agi_enhanced: 0.0
<DAHDI/i1/4957877272-31a2>AGI Tx >> agi_accountcode:
<DAHDI/i1/4957877272-31a2>AGI Tx >> agi_threadid: 139768320100096
<DAHDI/i1/4957877272-31a2>AGI Tx >> agi_arg_1: 74957877272
<DAHDI/i1/4957877272-31a2>AGI Tx >>
<DAHDI/i1/4957877272-31a2>AGI Script testagi1.php completed, returning 0
...
-- Executing [s@macro-incoming:12] NoOp("DAHDI/i1/4957877272-31a2", "/-------------------\") in new stack
-- Executing [s@macro-incoming:14] NoOp("DAHDI/i1/4957877272-31a2", "|AGI Name is: |") in new stack
-- Executing [s@macro-incoming:15] NoOp("DAHDI/i1/4957877272-31a2", "|AGI CID is: |") in new stack
-- Executing [s@macro-incoming:16] NoOp("DAHDI/i1/4957877272-31a2", "|AGI arg is: |") in new stack
-- Executing [s@macro-incoming:19] NoOp("DAHDI/i1/4957877272-31a2", "\-------------------/") in new stack

Права на testagi1.php выставил
Наличие phpagi.php проверил
Скрипт запускается на FreePBX 15

На самом деле получать name можно было бы и сразу из диалплана через команду SHELL, но хочется освоить работу через AGI интерфейс
Буду очень признателен, если вы поможете или подскажете, что проверить\изменить для корректной работы
ded
Сообщения: 15621
Зарегистрирован: 26 авг 2010, 19:00

Re: Выполнение AGI скрипта на PHP

Сообщение ded »

1) Процедура имеет устоявшийся термин Caller ID lookup, cidlookup. Во FreePBX есть несколько моделей AGI-скриптов для подключения к различным типам источников cidlookup. Проанализируйте их, будет проще, чем писать свой.

2) из диалплана через команду SHELL - не правильно.

3) Протестируйте свой РНР-скрипт в ручном режиме из шелл, передавая в него CallerID в качестве аргумента, получите устойчивый результат!
Ответить
© 2008 — 2024 Asterisk.ru
Digium, Asterisk and AsteriskNOW are registered trademarks of Digium, Inc.
Design and development by PostMet-Netzwerk GmbH