设为首页 收藏本站
开启辅助访问 切换到宽版
注册会员 找回密码

VoIP88

cnasterisk 发表于 2013-5-18 16:14 | 显示全部楼层 |阅读模式
转载的啊.

一个在FreeSWITCH中外呼的脚本

前几天,一个朋友问我能否实现在FS中外呼,然后放一段录音,我说当然能,写个简单的脚本就行。但后来他说还要知道呼叫是否成功,我说,那就需要复杂一点了。

当然,这个应用很简单,就没必要使用event_socket那些复杂的东东。写了一个Lua脚本,基本能满足要求了。

思路是将待呼号码放到一个文件(number_file_name)中,每个一行,然后用Lua依次读每一行,呼通后播放file_to_play,结果写到log_file_name中。为保证对方应该后才开始播放,需要ignore_early_media参数,否则,对方传回铃音或彩铃时播放就会开始,而那不是我们想要的。

prefix = "{ignore_early_media=true}sofia/gateway/cnc/" number_file_name = "/usr/local/freeswitch/scripts/number.txt" file_to_play = "/usr/local/freeswitch/sounds/custom/8000/sound.wav" log_file_name = "/usr/local/freeswitch/log/dialer_log.txt"

简单起见,包装一个函数:

function debug(s)

freeswitch.consoleLog("notice", s .. "\n")

end

定义呼叫函数。freeswitch.Session会呼叫一个号码,并一直等待对方应答。然后,streamFile播放一段声音,挂机。最后,函数返回挂机原因 hangup_cause。 function call_number(number)

dial_string = prefix .. tostring(number);debug("calling " .. dial_string);session = freeswitch.Session(dial_string);if session:ready() then    session:sleep(1000)    session:streamFile(file_to_play)    session:hangup()end-- waiting for hangup               while session:ready() do    debug("waiting for hangup " .. number)    session:sleep(1000)endreturn session:hangupCause()
end

实际的代码是从这里开始执行的。首先打开存放电话号码的文件(准备读),和呼叫日志(准备写,追加)。

然后是无限循环(while),每次读取一行,当读到空行或文件尾时,退出。

while 循环中,读到的每一行实际上是一个号码,调用上面定义的call_number进行呼叫,并将呼叫结果写到log_file中。

number_file = io.open(number_file_name, "r") log_file = io.open(log_file_name, "a+")

while true do
line = number_file:read("*line")if line == "" or line == nil then break endhangup_cause = call_number(line)log_file:write(os.date("%H:%M:%S ") .. line .. " " .. hangup_cause .. "\n")
end

很简单,很强大,是吧?

将脚本存到scripts目录中(通常是/usr/local/freeswitch/scripts/),起名叫dialer.lua,在FreeSWITCH控制台或fs_cli中执行:



luarun dialer.lua
完整的脚本:
另外还有一个 batch_dialer:


您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

手机版|VoIP88 ( 粤ICP备11095982号   填写您的邮件地址,订阅我们的精彩内容:

GMT+8, 2019-8-24 07:24 , Processed in 0.120624 second(s), 23 queries .

Powered by VoIP88

© 2001-2017 VoIP88

快速回复 返回顶部 返回列表