来电时调用 php 文件(星号)
call php file on incoming call (asterisk)
我是 asterisk 的新手,我搜索了大约 10 小时,例如如何在来电时触发 php 文件以获取来电显示并显示给正在呼叫的用户
我找到了一些结果并进行了测试
下面的代码有效(从某人示例复制粘贴)但问题是它的工作(触发 php 文件)仅当我从 voip 呼叫某人时而不是当外面的人呼叫我时,这就是我需要
所以亲爱的程序员们能帮我看看我的错误是什么,并给我一个工作示例吗?我知道 extensions_custom.conf 中的代码需要更改,但我不太擅长 voip 编程,我不知道如何修复它
extensions_custom.conf 代码:
[macro-dialout-trunk-predial-hook]
exten => s,1,Verbose(Incoming call from Sip line CallerID=${CALLERID(all)})
exten => s,2,AGI(testest.php,${CALLERID(all)})
和我的测试 php 文件
#!/usr/bin/php -q
<?php
$query = $argv[1];
file_get_contents('http://192.168.1.6/crm/test.php?s=test');
$fh = fopen('test.txt','w+');
fwrite($fh,$query);
fclose($fh);
?>
检查 macro-dial-one(需要在 extensions_ovveride_freepbx.conf 中更改它)或在传入时创建自定义上下文 (extensions_custom.conf) 并将所有中继更改为该上下文。
我找到了答案,我把它放在这里所以每个人都可以使用,因为任何地方都没有这个简单代码的例子
<?php
$socket = fsockopen("192.168.1.100","5038", $errno, $errstr,10);
if (!$socket){
echo "$errstr ($errno)\n";
}else{
//include('config.php');
//$db = db();
fputs($socket, "Action: Login\r\n");
fputs($socket, "UserName: admin\r\n");
fputs($socket, "Secret: *********\r\n\r\n");
//fputs($socket, "Action: WaitEvent\r\n");
//fputs($socket, "Action: Logoff\r\n\r\n");
$event = "";
while($ret = fgets($socket)){
if(substr($ret,0,6) == "Event:"){
$e = explode(':', $ret);
$event = trim($e[1]);
}
if($event == "DeviceStateChange"){
$data = explode(':', $ret);
if($data[0] == "Timestamp"){
$ts = floor(trim($data[1]));
}
if($data[0] == "Device" && substr(trim($data[1]),0,3) == 'SIP'){
$d = explode('/', trim($data[1]));
$dev = trim($d[1]);
$device = "";
if(is_numeric($dev)){
$device = $dev;
}
}
if($data[0] == "State" && $device != ""){
$state = trim($data[1]);
if($state == "NOT_INUSE"){
//Clear CID fields and update presence state
echo 'NOT_inuse: state:'.$state.'-device: '.$device;//YOUR CODE
// $sql = "update asterisk.web_presence set state='$state',cidnum = NULL, cidname = NULL, inorout = NULL, callstart = NULL where ext='$device'";
// mysql_query($sql);
}else{
//Update presence state
echo 'else NOT_inuse: state:'.$state.'-device: '.$device;//YOUR CODE
$sql = "update asterisk.web_presence set state='$state' where ext='$device'";
// mysql_query($sql);
}
$event = "";
$device = "";
}
}
if($event == "DialBegin"){
$data = explode(':', $ret);
if($data[0] == "Timestamp"){
$ts = floor(trim($data[1]));
}
if($data[0] == "Channel"){
$c = explode('/',trim($data[1]));
$c2 = explode('-', trim($c[1]));
$channel = trim($c2[0]);
}
if($data[0] == "CallerIDNum"){
$cidnum = trim($data[1]);
}
if($data[0] == "CallerIDName"){
$cidname = trim($data[1]);
}
if($data[0] == "DialString"){
if(substr(trim($data[1]),0,3) == 'SIP' || is_numeric(trim($data[1]))){
if(is_numeric(trim($data[1]))){
$exten = trim($data[1]);
}else{
$e = explode('/', trim($data[1]));
$exten = trim($e[1]);
}
$time = time();
//query("insert into callq(mobile,exten,time_stamp) values('$cidnum','$exten',$time)",$db);//YOUR CODE
echo 'dialstring-cidnum:'.$cidnum.'-cidname:'.$cidname.'-ts:'.$ts.'-ext:'.$exten;
//Update inbound presence call
/// $sql = "update asterisk.web_presence set cidnum = '$cidnum', cidname = '$cidname', inorout='I', callstart='$ts' where ext='$exten' and cidnum is null";//YOUR CODE
// mysql_query($sql);
// $sql = "update asterisk.web_presence set cidnum = '$exten', inorout='O', callstart='$ts' where ext='$channel' and cidnum is null";//YOUR CODE
// mysql_query($sql);
}else{
$e = explode('@', trim($data[1]));
$dialed = trim($e[0]);
if($channel != 'gateway'){
//Update outbound presence call
// $sql = "update asterisk.web_presence set cidnum = '$dialed', inorout='O', callstart='$ts' where ext='$channel'";
// mysql_query($sql);
}
}
$event = "";
$exten = "";
}
}
if($event == "UnParkedCall"){
$data = explode(':', $ret);
if($data[0] == "Timestamp"){
$ts = floor(trim($data[1]));
}
if($data[0] == "RetrieverChannel"){
$c = explode('/',trim($data[1]));
$c2 = explode('-', trim($c[1]));
$channel = trim($c2[0]);
}
if($data[0] == "ParkeeCallerIDNum"){
$cidnum = trim($data[1]);
}
if($data[0] == "ParkeeCallerIDName"){
$cidname = trim($data[1]);
}
if($data[0] == "ParkingSpace"){
$dialed = trim($data[1]);
$pickup = "$cidnum ($dialed)";
echo 'parked';
//Update outbound presence call
// $sql = "update asterisk.web_presence set cidnum = '$pickup', cidname='$cidname', inorout='O', state='INUSE', callstart='$ts' where ext='$channel'";
//mysql_query($sql);
$event = "";
$channel = "";
}
}
}
}
sleep(5);
exit;
fclose($socket); ?>
我是 asterisk 的新手,我搜索了大约 10 小时,例如如何在来电时触发 php 文件以获取来电显示并显示给正在呼叫的用户
我找到了一些结果并进行了测试
下面的代码有效(从某人示例复制粘贴)但问题是它的工作(触发 php 文件)仅当我从 voip 呼叫某人时而不是当外面的人呼叫我时,这就是我需要
所以亲爱的程序员们能帮我看看我的错误是什么,并给我一个工作示例吗?我知道 extensions_custom.conf 中的代码需要更改,但我不太擅长 voip 编程,我不知道如何修复它
extensions_custom.conf 代码:
[macro-dialout-trunk-predial-hook]
exten => s,1,Verbose(Incoming call from Sip line CallerID=${CALLERID(all)})
exten => s,2,AGI(testest.php,${CALLERID(all)})
和我的测试 php 文件
#!/usr/bin/php -q
<?php
$query = $argv[1];
file_get_contents('http://192.168.1.6/crm/test.php?s=test');
$fh = fopen('test.txt','w+');
fwrite($fh,$query);
fclose($fh);
?>
检查 macro-dial-one(需要在 extensions_ovveride_freepbx.conf 中更改它)或在传入时创建自定义上下文 (extensions_custom.conf) 并将所有中继更改为该上下文。
我找到了答案,我把它放在这里所以每个人都可以使用,因为任何地方都没有这个简单代码的例子
<?php
$socket = fsockopen("192.168.1.100","5038", $errno, $errstr,10);
if (!$socket){
echo "$errstr ($errno)\n";
}else{
//include('config.php');
//$db = db();
fputs($socket, "Action: Login\r\n");
fputs($socket, "UserName: admin\r\n");
fputs($socket, "Secret: *********\r\n\r\n");
//fputs($socket, "Action: WaitEvent\r\n");
//fputs($socket, "Action: Logoff\r\n\r\n");
$event = "";
while($ret = fgets($socket)){
if(substr($ret,0,6) == "Event:"){
$e = explode(':', $ret);
$event = trim($e[1]);
}
if($event == "DeviceStateChange"){
$data = explode(':', $ret);
if($data[0] == "Timestamp"){
$ts = floor(trim($data[1]));
}
if($data[0] == "Device" && substr(trim($data[1]),0,3) == 'SIP'){
$d = explode('/', trim($data[1]));
$dev = trim($d[1]);
$device = "";
if(is_numeric($dev)){
$device = $dev;
}
}
if($data[0] == "State" && $device != ""){
$state = trim($data[1]);
if($state == "NOT_INUSE"){
//Clear CID fields and update presence state
echo 'NOT_inuse: state:'.$state.'-device: '.$device;//YOUR CODE
// $sql = "update asterisk.web_presence set state='$state',cidnum = NULL, cidname = NULL, inorout = NULL, callstart = NULL where ext='$device'";
// mysql_query($sql);
}else{
//Update presence state
echo 'else NOT_inuse: state:'.$state.'-device: '.$device;//YOUR CODE
$sql = "update asterisk.web_presence set state='$state' where ext='$device'";
// mysql_query($sql);
}
$event = "";
$device = "";
}
}
if($event == "DialBegin"){
$data = explode(':', $ret);
if($data[0] == "Timestamp"){
$ts = floor(trim($data[1]));
}
if($data[0] == "Channel"){
$c = explode('/',trim($data[1]));
$c2 = explode('-', trim($c[1]));
$channel = trim($c2[0]);
}
if($data[0] == "CallerIDNum"){
$cidnum = trim($data[1]);
}
if($data[0] == "CallerIDName"){
$cidname = trim($data[1]);
}
if($data[0] == "DialString"){
if(substr(trim($data[1]),0,3) == 'SIP' || is_numeric(trim($data[1]))){
if(is_numeric(trim($data[1]))){
$exten = trim($data[1]);
}else{
$e = explode('/', trim($data[1]));
$exten = trim($e[1]);
}
$time = time();
//query("insert into callq(mobile,exten,time_stamp) values('$cidnum','$exten',$time)",$db);//YOUR CODE
echo 'dialstring-cidnum:'.$cidnum.'-cidname:'.$cidname.'-ts:'.$ts.'-ext:'.$exten;
//Update inbound presence call
/// $sql = "update asterisk.web_presence set cidnum = '$cidnum', cidname = '$cidname', inorout='I', callstart='$ts' where ext='$exten' and cidnum is null";//YOUR CODE
// mysql_query($sql);
// $sql = "update asterisk.web_presence set cidnum = '$exten', inorout='O', callstart='$ts' where ext='$channel' and cidnum is null";//YOUR CODE
// mysql_query($sql);
}else{
$e = explode('@', trim($data[1]));
$dialed = trim($e[0]);
if($channel != 'gateway'){
//Update outbound presence call
// $sql = "update asterisk.web_presence set cidnum = '$dialed', inorout='O', callstart='$ts' where ext='$channel'";
// mysql_query($sql);
}
}
$event = "";
$exten = "";
}
}
if($event == "UnParkedCall"){
$data = explode(':', $ret);
if($data[0] == "Timestamp"){
$ts = floor(trim($data[1]));
}
if($data[0] == "RetrieverChannel"){
$c = explode('/',trim($data[1]));
$c2 = explode('-', trim($c[1]));
$channel = trim($c2[0]);
}
if($data[0] == "ParkeeCallerIDNum"){
$cidnum = trim($data[1]);
}
if($data[0] == "ParkeeCallerIDName"){
$cidname = trim($data[1]);
}
if($data[0] == "ParkingSpace"){
$dialed = trim($data[1]);
$pickup = "$cidnum ($dialed)";
echo 'parked';
//Update outbound presence call
// $sql = "update asterisk.web_presence set cidnum = '$pickup', cidname='$cidname', inorout='O', state='INUSE', callstart='$ts' where ext='$channel'";
//mysql_query($sql);
$event = "";
$channel = "";
}
}
}
}
sleep(5);
exit;
fclose($socket); ?>