使用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自动外呼相关推荐

  1. 基于FreeSwitch自动外呼的探索

    一.    研究导读 随着近两年IP融合通信.视频通信.统一通信.云计算等新技术的迅猛发展,信息科技的快速增长以及电话外呼需求量的不断提升.由于传统的呼叫中心语音处理能力受限于硬件板卡,存在依赖硬件. ...

  2. 基于freeswitch 自动外呼系统实现(一)

    原文网址:http://www.luojie1987.com/index.php/post/179.html 15年基于freewitch做的自动群呼系统,主要由监听模块,任务外呼模块,及FIFO实现 ...

  3. 呼叫中心中间件(mod_cti基于FreeSWITCH)-自动外呼接口

    队列呼叫任务 cti_queue_dialer_task@template [哈希表] key任务名字 value 任务配置JSON格式 {"params": {"ena ...

  4. freeswitch通过lua脚本实现多方会话功能,包括会议录音自动外呼等

    freeswitch 会议模块 freeswitch 自带有多方会议功能,在安装目录下的conf/autoload_configs/modules.conf.xml中,开启会议功能,通常默认是启用的, ...

  5. 高效筛选自动外呼系统构建

    现在世界疫情严重,大家都居家自我隔离,社区.公司.政府部门等需要收集大家疫情相关信息,如是否异地返回.是否经过高风险地区.身体是否发烧等等. 交警行业.客服行业.外卖行业.快递行业等,均出现了风口. ...

  6. 高效拨打电话 - 自动外呼系统构建

    现在世界疫情严重,大家都居家自我隔离,社区.公司.政府部门等需要收集大家疫情相关信息,如是否异地返回.是否经过高风险地区.身体是否发烧等等. 交警行业.客服行业.外卖行业.快递行业等,均出现了风口. ...

  7. 批量自动外呼带来的效益

    批量自动外呼,顾名思义,导入号码就能立即往外呼出.为什么企业要选择使用批量自动外呼这个功能或者系统呢?首先要了解批量自动外呼的工作原理. 电话批量自动外呼能够解决以下问题:把海量号码数据导入系统,由程 ...

  8. 分享一个自动外呼系统案例

    名元御酱--自动外呼型案例分析 客户背景: 名苑御酱为电销外呼型企业.主营为白酒行业,在该行业内已有十多年的经营历史,以电话销售为主要营销手段.需要大量电话呼出,以最高的效率,最低的成本实现电话销售. ...

  9. 河南企服网:语音自动外呼机器人效果好吗?

    本文给各位分享语音自动外呼机器人效果好吗的相关知识,其中主要是介绍语音自动外呼机器人的优势.如果能碰巧解决你现在面临的电话营销外呼相关问题,别忘了关注本站. 随着科技的发展,智能产品已经进入了各个行业 ...

最新文章

  1. ELK教程2:Kibana的安装
  2. 目标检测--吴恩达深度学习记录
  3. 【面经】字节跳动后端开发视频架构方向一面二面
  4. Smart Link
  5. 寻找字符串中第一个仅仅出现一次打字符
  6. 心算技巧 —— 大数的三次方根
  7. -创建日期和时间数组--提取年月日-显示格式
  8. golang-Tag
  9. php win 输入密码,win10开机密码输入框不见了怎么办
  10. 怎么在电脑上进行屏幕录像?电脑录屏的方法
  11. Android 动画系列二之补间动画
  12. SpringMVC学习日记总结
  13. 使用ESP32连接腾讯云实现远程控制方法
  14. 【程设作业】魔兽世界三:开战
  15. python微信公众号翻译功能_自学Python笔记:给微信公众号搭建“成绩查询”功能...
  16. BGA焊接工艺及可靠性分析
  17. 子元素scroll父元素容器不跟随滚动JS实现
  18. MES系统质量管理怎么做?
  19. 吃饭困难选择症python_吃饭选择困难症
  20. 超详细!附源码!SpringBoot+shiro+mybatis+Thymeleaf实现权限登录系统

热门文章

  1. 使用中断后不停止_乔丹体育公司构成侵权,为何又不判令彻底停止使用“乔丹”注册商标?法院解释来了...
  2. java dos 菜单栏_学习java之电脑的常用快捷键和DOS窗口下的常用命令
  3. ajax onerror code,Ajax请求'onError'处理程序
  4. 学习vim的linux游戏,PacVim:一个学习 vim 命令的命令行游戏 | Linux 中国
  5. 天文学专业在什么时候学计算机,南京大学在985排名第几?南京大学最牛的专业是天文系吗?...
  6. java 异步阻塞_大白话搞懂什么是同步/异步/阻塞/非阻塞
  7. 自制简单的小型Linux,自制小型Linux系统
  8. Sprint Boot————@Qualifier、@Primary
  9. python selenium截图_python+selenium截图操作样例
  10. php汽车之家数据api,基于聚合数据的全国违章直连查询接口示例-PHP版