FreeSWITCH 脚本与自动化
FreeSWITCH 提供了多种脚本语言支持,如 Lua、JavaScript、Python、Perl 等,允许开发者自动化拨号、通话控制、事件处理等操作。本文将介绍 FreeSWITCH 支持的脚本语言 、如何使用 Lua 进行自动化 ,并提供一个完整的 自动外呼示例。
1. FreeSWITCH 脚本支持
FreeSWITCH 允许使用以下脚本语言编写自动化逻辑:
语言 | 模块 | 适用场景 |
---|---|---|
Lua | mod_lua | 轻量级应用、拨号计划控制 |
JavaScript | mod_v8 | 复杂业务逻辑、事件监听 |
Python | mod_python | 数据处理、AI 集成 |
Perl | mod_perl | 兼容 Perl 生态 |
Java | mod_java | 企业应用、Web 集成 |
其中,Lua(mod_lua) 是最常用的 FreeSWITCH 脚本语言,因其轻量级、高效、易于嵌入的特性,适用于各种自动化需求。
2. Lua 脚本基础
2.1 启用 mod_lua
FreeSWITCH 默认支持 Lua,确保已加载 mod_lua
:
sh
fs_cli -x "load mod_lua"
如果未加载,可以在 /etc/freeswitch/autoload_configs/modules.conf.xml
中添加:
xml
<load module="mod_lua"/>
然后重启 FreeSWITCH:
sh
systemctl restart freeswitch
2.2 在拨号计划中调用 Lua
FreeSWITCH 拨号计划 (dialplan
) 可以直接调用 Lua 脚本:
xml
<extension name="TestLua">
<condition field="destination_number" expression="^9001$">
<action application="lua" data="hello.lua"/>
</condition>
</extension>
当用户拨打 9001
时,FreeSWITCH 将执行 hello.lua
。
2.3 编写 Hello World 脚本
在 /usr/local/freeswitch/scripts/
目录下创建 hello.lua
:
lua
session:answer()
session:sleep(1000)
session:execute("playback", "ivr/ivr-welcome.wav")
session:hangup()
此脚本:
- 接听来电
- 播放欢迎语音
- 挂断通话
3. FreeSWITCH 事件监听
FreeSWITCH 提供 事件系统 (Event Socket Layer, ESL),可以用 Lua 监听并处理事件,例如来电、挂机等。
3.1 监听 FreeSWITCH 事件
创建 event_listener.lua
:
lua
freeswitch.consoleLog("NOTICE", "Lua Event Listener Started\n")
local event = freeswitch.EventConsumer("CHANNEL_CREATE")
while true do
local e = event:pop()
if e then
freeswitch.consoleLog("INFO", "New Call: " .. e:getHeader("Caller-Caller-ID-Number") .. "\n")
end
end
运行:
sh
fs_cli -x "luarun event_listener.lua"
这段代码会监听 CHANNEL_CREATE
事件,每当有新通话进入,就打印出主叫号码。
4. 事件驱动的自动外呼 (Auto Dialer)
4.1 自动外呼 Lua 脚本
创建 auto_dial.lua
:
lua
-- 定义外呼目标
local destination = "1001"
local gateway = "sofia/gateway/mygateway/"
-- 构造拨号字符串
local dial_string = gateway .. destination
-- 启动会话
session = freeswitch.Session(dial_string)
-- 检查是否接通
if session:ready() then
session:execute("playback", "ivr/ivr-welcome.wav")
session:sleep(2000)
session:hangup()
end
运行:
sh
fs_cli -x "luarun auto_dial.lua"
此脚本会:
- 自动拨打
1001
- 播放欢迎语音
- 挂断电话
4.2 定时批量外呼
可以结合 cron
定时执行:
sh
crontab -e
添加:
0 9 * * * /usr/bin/fs_cli -x "luarun auto_dial.lua"
此任务每天早上 9 点自动外呼。
5. Python 集成 FreeSWITCH
FreeSWITCH 也支持 mod_python
,可以用 Python 进行事件监听和自动化任务。
5.1 确保 mod_python 已加载
sh
fs_cli -x "load mod_python"
5.2 编写 Python 监听脚本
创建 event_listener.py
:
python
import ESL
def event_handler():
con = ESL.ESLconnection("localhost", "8021", "ClueCon")
if con.connected():
con.events("plain", "CHANNEL_CREATE")
while True:
e = con.recvEvent()
if e:
print("New Call from:", e.getHeader("Caller-Caller-ID-Number"))
event_handler()
运行:
sh
python3 event_listener.py
该脚本监听 CHANNEL_CREATE
事件,并打印主叫号码。
6. 结合 Fail2Ban 进行安全自动化
FreeSWITCH 可以结合 fail2ban
进行安全自动化,检测异常登录并封禁 IP。
6.1 配置 Fail2Ban
编辑 /etc/fail2ban/jail.local
:
ini
[freeswitch]
enabled = true
port = 5060,5061
filter = freeswitch
logpath = /var/log/freeswitch/freeswitch.log
maxretry = 3
bantime = 3600
6.2 编写 Fail2Ban 过滤器
创建 /etc/fail2ban/filter.d/freeswitch.conf
:
ini
[Definition]
failregex = .*sofia_reg_parse_auth.*invalid password.*from ip <HOST>
ignoreregex =
重启 fail2ban
:
sh
systemctl restart fail2ban
这将自动封禁连续 3 次密码错误的 IP 地址。
7. 总结
- FreeSWITCH 支持 Lua、Python、JavaScript 等脚本语言,可以进行通话控制、事件监听和自动化任务。
- Lua 是最常用的脚本语言 ,可直接在拨号计划 (
dialplan
) 中执行。 - 事件监听 允许 FreeSWITCH 监控通话状态,结合 Python 可实现 实时监控。
- 自动外呼 让 FreeSWITCH 能够主动发起通话,结合
cron
可定时拨号。 - 结合 Fail2Ban 提高系统安全性,自动封禁异常 IP。
掌握 FreeSWITCH 脚本能力,你可以轻松实现 IVR 交互、自动外呼、通话录制、智能路由等功能 🚀