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群:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/566828.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

未来教育计算机二级书怎么样,未来教育计算机二级

1册图书1张光盘&#xff0c;轻松应对2018年一级计算机基础及MS Office应用考试 n 1.历年真题精选&#xff0c;全方位把握真考动向&#xff0c;具有练习价值 n (1)新大纲、新题型、新题库&#xff0c;全方位解读无纸化考试&#xff0c;帮助考生轻松过关。 n (2)精选2017年~2016年…

python集合操作班级干部竞选演讲稿_精选竞选班干部的演讲稿集合7篇

精选竞选班干部的演讲稿集合7篇演讲稿在写作上具有一定的格式要求。在现实社会中&#xff0c;用到演讲稿的地方越来越多&#xff0c;为了让您在写演讲稿时更加简单方便&#xff0c;以下是小编整理的竞选班干部的演讲稿7篇&#xff0c;欢迎阅读与收藏。竞选班干部的演讲稿 篇1尊…

江苏计算机专业,行情火爆的计算机专业:江苏计算机专业高校最低录取分排序...

原标题&#xff1a;行情火爆的计算机专业&#xff1a;江苏计算机专业高校最低录取分排序现如今的十大热门专业里&#xff0c;计算机类专业总是稳居榜首&#xff01;几年前市场对计算机专业人才的需求非常大&#xff0c;计算机专业红得发紫&#xff0c;毕业生是"皇帝的女儿…

em算法 实例 正态分布_Petuum提出序列生成学习算法通用框架

近日&#xff0c;来自人工智能创业公司 Petuum 的研究人员发表论文&#xff0c;提出序列生成学习算法的通用框架——广义的熵正则化策略优化框架(Generalized Entropy-Regularized Policy Optimization)。该框架是对包括最大似然学习 (MLE)、增强学习 (RL) 等多种广泛使用的算法…

计算机网络体系结构最有影响的标准,浅谈计算机网络中的体系结构

夏杰【摘 要】计算机网络是由各类具有独立功能的计算机系统和终端通过通信线路连接起来的复杂系统&#xff0c;网络中各计算机必须遵从通信规定才能相互协调工作。为了设计这样复杂的系统&#xff0c;网络工作者提出了分层实现计算机网络功能的方法。【关键词】体系结构&#x…

springboot 集成redis_一文详解Spring Boot 集成 Redis

redis设置&#xff1a;修改redis服务器的配置文件vim /usr/local/redis/bin/redis.confbind 0.0.0.0 protected-mode no重新启动redissystemctl restart redis.service #重新启动服务注意&#xff1a;服务器的话需要设置安全组开放端口1.导入依赖org.springframework.boot …

计算机用手机的网络,电脑做热点让手机上网_电脑开热点给手机用

2016-11-26 12:00:20你好!很高兴为你解答&#xff0c;有两个解决办法:1.在每台机的本地连接--属性--常规--internet协议(TCP/IP)--常规里,设置成"自动获取IP地址"2.在每台机的本地连接--...2017-01-06 14:44:121.打开任务栏右下角的网络连接&#xff0c;在弹出的界面…

shell开启飞行模式_原来手机飞行模式有这么多用处!99%的深圳人都不知道...

相信大家都知道我们的手机里有个功能叫「飞行模式」(又称航空模式)它可以关掉手机收发信号的装置避免手机信号对飞机飞行造成干扰来源&#xff1a;网络那么对于不常坐飞机的人来说「飞行模式」功能是不是毫无用处呢&#xff1f;当然不是今天易小姐就带大家解锁关于「飞行模式」…

计算机学报在线阅读,面向目标检测与姿态估计的联合文法模型计算机学报.pdf...

第卷第期 计 算 机 学 报&#xff13;&#xff17; &#xff11;&#xff10;&#xff36;&#xff4f;&#xff4c;&#xff0e;&#xff13;&#xff17;&#xff2e;&#xff4f;&#xff0e;&#xff11;&#xff10;年月&#xff12;&#xff10;&#xff11;&#xff14;…

联想微型计算机启天e4300,戴尔轻薄商务本Latitude E4200/E4300开卖

戴尔随迅驰2平台的发布全面更新了自己的Latitude商用笔记本产品线&#xff0c;之前15和14寸的E6000/E5000系列已经上市销售&#xff0c;今天两款轻薄型号E4300/E4200也摆上了戴尔美国官网的货架。13.3寸的E4300目标直指联想ThinkPad X300/X301系列&#xff0c;虽然在轻薄程度上…

python读取坐标文本文件_Python 实现文件读写、坐标寻址、查找替换功能

读文件打开文件(文件需要存在)#打开文件f open("data.txt","r") #设置文件对象print(f)#文件句柄f.close() #关闭文件#为了方便&#xff0c;避免忘记close掉这个文件对象&#xff0c;可以用下面这种方式替代with open(data.txt,"r") as f: #设置…

北京大学计算机科学李丰,中文智能问答系统作业解析-北京大学计算机科学技术研究所.PDF...

中文智能问答系统作业解析-北京大学计算机科学技术研究所中文智能问答系统作业解析互联网数据挖掘北京大学计算机研究所语言计算与互联网挖掘研究室封闭测试结果排序队伍 封闭测试 开放测试1200012753 1200012756 1200012767 1200012900 19.9 20.41100016614 1100016639 120001…

python4发布_Python 3.4.1 发布

Python 3.4.1 发布了&#xff0c;改进记录&#xff1a;Core and BuiltinsIssue #21418: Fix a crash in the builtin function super() when called without argument and without current frame (ex: embedded Python).Issue #21425: Fix flushing of standard streams in the…

浙江大学计算机考研408上岸,2016年跨考上岸浙江大学计算机研究生,初试412分经验谈!...

本帖最后由 sqrt7 于 2019-5-22 18:49 编辑一、俺为什么读书 。之前好多同学都加我QQ&#xff0c;让我介绍计算机考研的经验&#xff0c;在这里&#xff0c;我就以自己这一年左右时间的经历和感受谈一谈吧。先报一下自己的分数&#xff0c;总分412。总得来说这次考研发挥还是挺…

医疗小程序源码_不懂商城小程序源码,如何快速创建小程序商城?

小程序在近来发展十分迅速&#xff0c;从微信小程序游戏出发&#xff0c;到现在渗透到各种功能类型&#xff0c;甚至已经扩展到了其他的应用程序上。那么如今很多的小程序商城应该怎么创建呢&#xff1f;不懂商城小程序源码也可以自己制作吗&#xff1f;当然可以&#xff0c;下…

python的标准类型内建函数_Python随手笔记之标准类型内建函数

Python提供了一些内建函数用于基本对象类型&#xff1a;cmp()&#xff0c;repr()&#xff0c;str()&#xff0c;type()和等同于repr()的( )操作符(1)type()type的用法如下&#xff1a;type(object)接受一个对象作为参数&#xff0c;并返回它的类型。他的返回值是一个类型对象。…

计算机快捷键任务管理器,任务管理器快捷键,小编告诉你电脑如何打开任务管理器...

电脑系统的任务管理器是Windows提供有关计算机性能的信息&#xff0c;并显示了计算机上所运行的程序和进程的详细信息&#xff0c;从这里可以查看到当前系统的进程数、CPU使用比率、更改的内存、容量等数据。那么&#xff0c;任务管理器怎么样打开呢&#xff1f;下面&#xff0…

mysql中对比月_详解Mysql中日期比较大小的方法

假如有个表product有个字段add_time,它的数据类型为datetime,有人可能会这样写sql&#xff1a;代码如下select * from product where add_time 2013-01-12对于这种语句&#xff0c;如果你存储的格式是YY-mm-dd是这样的&#xff0c;那么OK&#xff0c;如果你存储的格式是&#…

html文字如何排布成圆形,css多个扇形怎么拼凑成圆?

可以用斜切旋转扇形.pie {position: relative;margin: 1em auto;padding: 0;width: 32em;height: 32em;border-radius: 50%;list-style: none;overflow: hidden;}.slice {overflow: hidden;position: absolute;top: 0;right: 0;width: 50%;height: 50%;transform-origin: 0% 10…

python webdriver 等待网页已登录_python基础编程:python+selenium实现163邮箱自动登陆的方法...

本文介绍了让我们先来预览一下代码运行效果吧&#xff1a;首先分析163邮箱登陆页面的网页结构(按F12或单击鼠标右键选择审查元素)1、定位到登陆框(注意登录框是一个iframe&#xff0c;如果不定位到iframe的话是无法找到之后的邮箱地址框和密码输入框的)2、定位到邮箱地址框(nam…