FreeSWITCH 简单图形化界面58 - 拨号应用userspy模块监听呼叫使用
- [00、 一个fs的web配置界面预览](#00、 一个fs的web配置界面预览)
- [01、 Web 配置界面预览](#01、 Web 配置界面预览)
- [02、 Web界面安装参考](#02、 Web界面安装参考)
- [1. 模块介绍](#1. 模块介绍)
- [2. 模块安装](#2. 模块安装)
- [3. 拨号计划应用](#3. 拨号计划应用)
-
- [3.1 userspy应用介绍](#3.1 userspy应用介绍)
- [3.2 userspy使用示例](#3.2 userspy使用示例)
- [4. 模块命令](#4. 模块命令)
-
- [4.1 userspy_show命令](#4.1 userspy_show命令)
- [4.2 userspy_show使用示例](#4.2 userspy_show使用示例)
- [5. 复杂场景(UUID保存+持续监听脚本,Lua实现)](#5. 复杂场景(UUID保存+持续监听脚本,Lua实现))
00、 一个fs的web配置界面预览
如果您想通过图形化界面管理 FreeSWITCH 的场景,可直接访问以下 Web 配置界面。
01、 Web 配置界面预览
| 界面地址 | 备用地址 | 登录信息 |
|---|---|---|
| http://www.fspbx.cn/ | http://myfs.f3322.net:8020/ | 用户名:admin密码:admin |
02、 Web界面安装参考
若需自行部署 FreeSWITCH 图形化界面,包含 Docker、脚本、ISO 镜像三种安装方式,适配不同系统环境:
- 安装指南地址:https://blog.csdn.net/jia198810/article/details/137820796
- 核心安装方式概览:
- Docker 安装:快速部署;
- 脚本安装:适配 Almalinux、RockyLinux、Debian、Ubuntu 、欧拉等系统,提供一键安装命令,安装后需重启初始化;
- ISO 镜像安装:基于 Almalinux制作的镜像,刻录到 U 盘或光盘后可自动安装,适合全新服务器部署。
1. 模块介绍
mod_spy模块核心实现了userspy应用程序,该应用借助mod_dptools: eavesdrop(监听模块),可对与特定用户桥接的所有信道进行监听。
通俗说明:当需要对某个用户(如分机1000)的所有通话进行持续监听时,通过mod_spy模块的userspy应用,可实现全程监听------无论该用户接入多少个通话信道,监听信道都会持续跟进,无需重复操作。
2. 模块安装
mod_spy模块需手动编译安装并加载,具体步骤如下:
-
编辑FreeSWITCH源码目录下的modules.conf文件(路径:/usr/src/freeswitch/trunk/modules.conf),找到并取消以下行的注释(删除开头的#):
#applications/mod_spy -
重新编译并安装模块,执行以下命令:
make ; make install -
加载模块:编辑modules.conf.xml文件,取消以下行的注释,实现模块开机自动加载:
<load module="mod_spy"/> -
重启FreeSWITCH生效,或通过以下命令手动加载模块(无需重启):
load mod_spy
3. 拨号计划应用
3.1 userspy应用介绍
userspy是mod_spy模块的核心应用,用于实现对特定用户的持续监听,支持两个参数配置:
-
第一个参数(必填):指定需要监听的用户,格式为「user@domain」(如1000@192.168.1.1);
-
第二个参数(可选):指定该用户已存在的信道UUID,作用与eavesdrop模块一致,用于精准监听某一个已建立的通话信道;
-
补充说明:若该用户当前无活跃通话信道,监听信道会播放音乐(moh),直至该用户有新的通话桥接,或监听方主动挂断。
3.2 userspy使用示例
结合hash命令查询监听目标的UUID,实现精准持续监听,示例如下:
xml
<action application="userspy" data="1000@192.168.1.1 ${hash(select/${domain_name}-spymap/1000)}"/>
说明:1000@192.168.1.1是监听目标用户(user@domain),KaTeX parse error: Expected '}', got 'EOF' at end of input: {hash(select/{domain_name}-spymap/1000)}用于查询该用户对应的通话UUID,实现精准监听。
4. 模块命令
4.1 userspy_show命令
该命令用于查看当前所有正在进行监听的监听者(spyers)信息,包括监听目标(user@domain)和监听者的信道UUID。
4.2 userspy_show使用示例
在FreeSWITCH控制台输入以下命令,即可查看当前监听状态:
plain
userspy_show
命令执行后,输出示例如下:
plain
1000@192.168.1.1 : 54995932-2a7c-11de-af08-93e49196b898
1 total spy
输出说明:
-
1000@192.168.1.1:userspy应用中指定的监听目标(user@domain);
-
54995932-2a7c-11de-af08-93e49196b898:监听者(执行监听操作的用户)的信道UUID;
-
1 total spy:当前共有1个活跃的监听任务。
5. 复杂场景(UUID保存+持续监听脚本,Lua实现)
结合UUID保存逻辑,使用handle-userspy-one.lua脚本实现"持续监听某一个通话"功能,支持密码验证、DTMF操作(插话、三方通话等),可直接部署使用,完整示例如下。
步骤1:呼叫时保存UUID(用于功能号码监听)
呼叫建立时,通过hash命令保存UUID,支持全组监听和指定组监听,为后续持续监听提供支持:
lua
-- 保存UUID,用于功能号码监听
-- 没有指定组为所有组,都能通过设置的功能代码监听该UUID
session:execute("hash", string.format("insert/${domain}-feacode/%s/${uuid}",destination_number))
session:execute("hash", string.format("insert/${domain}-feacode-group-%s/%s/${uuid}",callee_callgroup,destination_number))
session:execute("hash", string.format("insert/${domain}-feacode-group-%s/lastcall/${uuid}",callee_callgroup))
步骤2:持续监听脚本(handle-userspy-one.lua)
该脚本实现"持续监听指定通话"功能,包含密码验证、日志打印、DTMF操作配置、userspy执行等逻辑,适配mod_spy模块的userspy应用:
lua
#!/usr/bin/lua
-- 功能号码
-- 持续监听某一个通话(基于mod_spy模块userspy应用)
------------------打印日志-------------------
-- CONSOLE : console loglevel 0
-- ALERT : console loglevel 1
-- CRIT : console loglevel 2
-- ERR : console loglevel 3
-- WARNING : console loglevel 4
-- NOTICE : console loglevel 5
-- INFO : console loglevel 6
-- DEBUG : console loglevel 7
local flag = true
local level = "NOTICE"
local log = function(session, str)
if (flag == true and session:ready()) then
session:consoleLog(level, str)
end
end
if (session:ready()) then
local caller_id_number = session:getVariable("caller_id_number")
local userspy_number = argv[1]
local userspy_one_password = argv[2] and argv[2] or ''
local userspy_one_operator = "true"
session:consoleLog("info", "#======= start handle-userspy-one.lua ======\r\n")
session:consoleLog("info", string.format("# 主叫:%s,持续监听:%s\r\n", caller_id_number, userspy_number))
session:sleep(500)
-- 密码验证:输入正确密码方可启动监听,提升安全性
local digits = session:read(1, 20, "default/eavesdrop-one-input-start.gsm", 10000, "#")
if (digits == userspy_one_password) then
-- 启动在监听中执行其他操作(如插话、三方通话)
if (userspy_one_operator == "true") then
session:execute("set", "eavesdrop_enable_dtmf=true")
-- DTMF操作说明(适配userspy监听)
-- 按2:与所监听的UUID(主叫方)讲话
-- 按1:与所监听的UUID(被叫方)讲话
-- 按3:发起三方通话
-- 按0:恢复纯监听状态
-- 按*:监听下一个通话(多个通话时有效)
session:execute("set", "eavesdrop_bridge_aleg=true")
session:execute("set", "eavesdrop_bridge_bleg=true")
session:execute("set", "eavesdrop_whisper_aleg=true")
session:execute("set", "eavesdrop_whisper_bleg=true")
session:execute("queue_dtmf", "0") -- 默认恢复纯监听状态
else
session:execute("set", "eavesdrop_enable_dtmf=false") -- 关闭监听中的操作权限
end
-- 执行持续监听(调用mod_spy模块的userspy应用)
session:execute("userspy", string.format("%s@${domain_name}", userspy_number))
else
-- 密码输入错误,播放提示音后挂断
session:sleep(500)
session:execute("playback", "default/eavesdrop-one-input-error-bye.gsm")
session:sleep(500)
session:hangup()
end
session:consoleLog("info", "#======= end handle-userspy-one.lua ======\r\n")
return
end
脚本说明
-
日志功能:按INFO级别打印脚本执行日志,清晰记录主叫号码、监听目标号码等关键信息,方便排查问题;
-
密码验证:监听前需输入正确密码(通过session:read读取输入),验证通过方可启动监听,提升监听操作的安全性;
-
DTMF操作配置:启用eavesdrop_enable_dtmf=true后,监听过程中可通过按键执行多样化操作,适配不同监听场景需求;
-
监听执行:通过userspy命令(mod_spy模块核心应用)执行持续监听,指定监听目标号码及域名,确保监听精准;
-
异常处理:密码输入错误时,播放错误提示音后自动挂断,流程规范,避免误操作。
💗 2026年
🐂 祝君成功,好运连连,牛气冲天