python startswitch_使用python esl 实现FreeSWITCH自动外呼
使用python esl 实现FreeSWITCH自动外呼
tags:FreeSWITCH python 自动外呼 创建时间:2016-03-19 09:37:39
以下项目开源于:
https://github.com/nwaycn/nway_ac
代码:
```python
# coding=utf-8
__author__ = 'lihao,18621575908'
''
版权所有:上海宁卫信息技术有限公司
功能说明:本程序只适用于落地与落地间消化话费,而不适用于其它骚扰类型的应用
授权模式:GPL
bug report:lihao@nway.com.cn
''
import time
import thread
import os,sys
import psycopg2
from ESL import *
import string
import datetime
import random
mylock = thread.allocate_lock()
#global var
fs_ip = '127.0.0.1'
fs_esl_port = '8021'
fs_esl_auth = 'ClueCon'
rings = []
global ring_count
ring_count = 0
max_call = 30
base_path = '/usr/local/src/nway_ac/nway_ac/'
gateway_url = 'sofia/gateway/tojp/'
#//global var
def GetDbConn():
conn = psycopg2.connect(database="nway_ac", user="postgres", password="nway_2398488485And", host="127.0.0.1", port="5432")
return conn
def GetCurrentPath():
return os.getcwd()
def SetAllIdle():
conn = GetDbConn()
querysql = 'UPDATE callout_numbers SET callout_state=0, last_call_time=current_timestamp ;'
cur = conn.cursor()
cur.execute(querysql)
conn.commit()
print 'SetNumberIdle:ALL'
cur.close()
conn.close()
def GetBaseConfig():
conn = GetDbConn()
querysql = 'SELECT config_name, config_param FROM base_config;'
cur = conn.cursor()
cur.execute(querysql)
rows = cur.fetchall()
conn.commit()
for row in rows:
config_name = row[0]
if (cmp(config_name , 'max_call') == 0):
max_call = row[1]
if (cmp(config_name , 'base_path')==0):
base_path = row[1]
if (cmp(config_name , 'gateway_url')==0):
gateway_url = row[1]
print 'max_call:' + max_call
print 'base_path:' +base_path
print 'gateway_url:'+ gateway_url
cur.close()
conn.close()
def SetNumberBusy(dest_number):
conn = GetDbConn()
querysql = 'UPDATE callout_numbers SET callout_state=1 WHERE call_numbers =\' + dest_number +'\'
cur = conn.cursor()
cur.execute(querysql)
conn.commit()
print 'SetNumberBusy:' +dest_number
cur.close()
conn.close()
def CheckCallTime():
conn = GetDbConn()
querysql = 'SELECT a.id, a.start_time, a.stop_time,b.id \
FROM time_plan a, nway_call_tasks b where (now()::time > a.start_time ) and ' \
'(now()::time < a.stop_time) and (now() b.begin_time);'
cur = conn.cursor()
cur.execute(querysql)
rows = cur.fetchall()
ret_value = False
if cur.rowcount > 0:
ret_value = True
conn.commit()
cur.close()
conn.close()
return ret_value
def CallOut(dial_string,call_number):
con = ESLconnection(fs_ip, fs_esl_port, fs_esl_auth)
if con.connected():
e = con.api(dial_string)
SetNumberBusy(call_number)
print e.getBody()
else:
print 'not Connected'
con.disconnect();
def GetRingPath():
#print 'ring count:' .join(str(rings.count()))
global ring_count
index = random.randint(0,ring_count -1)
print 'ring count:' + str(ring_count) + ',this index:'+ str(index)
return rings[index]
def GetRandomTimeout():
timeout =500
timeout = random.randint(200,1000)
return timeout
def AutoCall(a,b):
print 'Start Auto Calls'
while True:
try:
conn = GetDbConn()
if CheckCallTime()==True:
querysql = 'SELECT a.id, a.call_numbers,a. call_timeout, a.call_ring_id, a.callout_state, \
a.is_enable, a.last_call_time\
FROM callout_numbers a where a.is_enable=True and' \
' a.callout_state =0 \
OR (ceil(abs(extract(epoch from current_timestamp -a.last_call_time))) > a.call_timeout)'
#print querysql
cur = conn.cursor()
cur.execute(querysql)
rows = cur.fetchall()
for row in rows:
print cur.rowcount
call_number = row[1]
call_timeout = row[2]
call_ring_id = row[3]
ring_path = base_path + GetRingPath()
dial_string = 'originate {execute_on_answer=\'sched_hangup +' + str(GetRandomTimeout()) + '\'}'+gateway_url + \
call_number + ' &endless_playback(\' + ring_path + '\')'
CallOut(dial_string, call_number)
print dial_string
time.sleep(0.060)
SetNumberBusy(call_number)
conn.close()
except:
print 'access database failed\n'
time.sleep(0.10)
#print 'CheckCallTime'
#conn.close()
thread.exit_thread()
def GetAllRings():
conn = GetDbConn()
querysql = 'SELECT ring_path from call_rings;'
cur = conn.cursor()
cur.execute(querysql)
rows = cur.fetchall()
#ring_count = rows.rowcount
#count=0
global ring_count
for row in rows:
rings.append(row[0])
ring_count += 1
# print row[0]
for i in rings:
print i
# ring_count = count
print 'ring_count:' + str(ring_count)
conn.commit()
cur.close()
conn.close()
def SetNumberIdle(dest_number):
conn = GetDbConn()
querysql = 'UPDATE callout_numbers SET callout_state=0, last_call_time=current_timestamp WHERE call_numbers =\' + dest_number +'\'
cur = conn.cursor()
cur.execute(querysql)
conn.commit()
print 'SetNumberIdle:' + dest_number
cur.close()
conn.close()
if __name__ == '__main__':
GetBaseConfig()
#str='python- String function'
#print '%s startwith t=%s' % (str,str.startswith('t'))
#print '%s' % (str.replace('-','))
SetAllIdle()
GetAllRings()
con = ESLconnection(fs_ip, fs_esl_port, fs_esl_auth)
if con.connected():
thread.start_new_thread(AutoCall,(1,1))
e = con.events('plain','CHANNEL_HANGUP_COMPLETE')
while True:
ee = con.recvEvent()
#print ee
if ee:
my_number = ee.getHeader('Caller-Caller-ID-Number')
dest_number = ee.getHeader('Caller-Destination-Number')
if dest_number is None:
continue
SetNumberIdle(dest_number)
#在此处处理挂机事件
con.disconnect();
```
上海老李,QQ:1354608370,FreeSWITCH QQ群:
python startswitch_使用python esl 实现FreeSWITCH自动外呼相关推荐
- 基于FreeSwitch自动外呼的探索
一. 研究导读 随着近两年IP融合通信.视频通信.统一通信.云计算等新技术的迅猛发展,信息科技的快速增长以及电话外呼需求量的不断提升.由于传统的呼叫中心语音处理能力受限于硬件板卡,存在依赖硬件. ...
- 基于freeswitch 自动外呼系统实现(一)
原文网址:http://www.luojie1987.com/index.php/post/179.html 15年基于freewitch做的自动群呼系统,主要由监听模块,任务外呼模块,及FIFO实现 ...
- 呼叫中心中间件(mod_cti基于FreeSWITCH)-自动外呼接口
队列呼叫任务 cti_queue_dialer_task@template [哈希表] key任务名字 value 任务配置JSON格式 {"params": {"ena ...
- freeswitch通过lua脚本实现多方会话功能,包括会议录音自动外呼等
freeswitch 会议模块 freeswitch 自带有多方会议功能,在安装目录下的conf/autoload_configs/modules.conf.xml中,开启会议功能,通常默认是启用的, ...
- 高效筛选自动外呼系统构建
现在世界疫情严重,大家都居家自我隔离,社区.公司.政府部门等需要收集大家疫情相关信息,如是否异地返回.是否经过高风险地区.身体是否发烧等等. 交警行业.客服行业.外卖行业.快递行业等,均出现了风口. ...
- 高效拨打电话 - 自动外呼系统构建
现在世界疫情严重,大家都居家自我隔离,社区.公司.政府部门等需要收集大家疫情相关信息,如是否异地返回.是否经过高风险地区.身体是否发烧等等. 交警行业.客服行业.外卖行业.快递行业等,均出现了风口. ...
- 批量自动外呼带来的效益
批量自动外呼,顾名思义,导入号码就能立即往外呼出.为什么企业要选择使用批量自动外呼这个功能或者系统呢?首先要了解批量自动外呼的工作原理. 电话批量自动外呼能够解决以下问题:把海量号码数据导入系统,由程 ...
- 分享一个自动外呼系统案例
名元御酱--自动外呼型案例分析 客户背景: 名苑御酱为电销外呼型企业.主营为白酒行业,在该行业内已有十多年的经营历史,以电话销售为主要营销手段.需要大量电话呼出,以最高的效率,最低的成本实现电话销售. ...
- 河南企服网:语音自动外呼机器人效果好吗?
本文给各位分享语音自动外呼机器人效果好吗的相关知识,其中主要是介绍语音自动外呼机器人的优势.如果能碰巧解决你现在面临的电话营销外呼相关问题,别忘了关注本站. 随着科技的发展,智能产品已经进入了各个行业 ...
最新文章
- ELK教程2:Kibana的安装
- 目标检测--吴恩达深度学习记录
- 【面经】字节跳动后端开发视频架构方向一面二面
- Smart Link
- 寻找字符串中第一个仅仅出现一次打字符
- 心算技巧 —— 大数的三次方根
- -创建日期和时间数组--提取年月日-显示格式
- golang-Tag
- php win 输入密码,win10开机密码输入框不见了怎么办
- 怎么在电脑上进行屏幕录像?电脑录屏的方法
- Android 动画系列二之补间动画
- SpringMVC学习日记总结
- 使用ESP32连接腾讯云实现远程控制方法
- 【程设作业】魔兽世界三:开战
- python微信公众号翻译功能_自学Python笔记:给微信公众号搭建“成绩查询”功能...
- BGA焊接工艺及可靠性分析
- 子元素scroll父元素容器不跟随滚动JS实现
- MES系统质量管理怎么做?
- 吃饭困难选择症python_吃饭选择困难症
- 超详细!附源码!SpringBoot+shiro+mybatis+Thymeleaf实现权限登录系统
热门文章
- 使用中断后不停止_乔丹体育公司构成侵权,为何又不判令彻底停止使用“乔丹”注册商标?法院解释来了...
- java dos 菜单栏_学习java之电脑的常用快捷键和DOS窗口下的常用命令
- ajax onerror code,Ajax请求'onError'处理程序
- 学习vim的linux游戏,PacVim:一个学习 vim 命令的命令行游戏 | Linux 中国
- 天文学专业在什么时候学计算机,南京大学在985排名第几?南京大学最牛的专业是天文系吗?...
- java 异步阻塞_大白话搞懂什么是同步/异步/阻塞/非阻塞
- 自制简单的小型Linux,自制小型Linux系统
- Sprint Boot————@Qualifier、@Primary
- python selenium截图_python+selenium截图操作样例
- php汽车之家数据api,基于聚合数据的全国违章直连查询接口示例-PHP版