|
@ -0,0 +1,187 @@ |
|
|
|
|
|
# Copyright (C) 2018 Voicent |
|
|
|
|
|
# Copyright (C) 2019 Open Source Integrators |
|
|
|
|
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). |
|
|
|
|
|
# |
|
|
|
|
|
# Documentation available at https://voicent.com/developer/docs/camp-api/ |
|
|
|
|
|
|
|
|
|
|
|
import ntpath |
|
|
|
|
|
import requests |
|
|
|
|
|
import ast |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Voicent(): |
|
|
|
|
|
|
|
|
|
|
|
def __init__(self, host="localhost", port="8155"): |
|
|
|
|
|
self.host_ = host |
|
|
|
|
|
self.port_ = port |
|
|
|
|
|
|
|
|
|
|
|
def postToGateway(self, urlstr, params, files=None): |
|
|
|
|
|
url = "http://" + self.host_ + ":" + self.port_ + urlstr |
|
|
|
|
|
res = requests.post(url, params, files=files) |
|
|
|
|
|
return res.text |
|
|
|
|
|
|
|
|
|
|
|
def getReqId(self, rcstr): |
|
|
|
|
|
index1 = rcstr.find("[ReqId=") |
|
|
|
|
|
if (index1 == -1): |
|
|
|
|
|
return "" |
|
|
|
|
|
index1 += 7 |
|
|
|
|
|
index2 = rcstr.find("]", index1) |
|
|
|
|
|
if (index2 == -1): |
|
|
|
|
|
return "" |
|
|
|
|
|
return rcstr[index1:index2] |
|
|
|
|
|
|
|
|
|
|
|
def callText(self, phoneno, text, selfdelete): |
|
|
|
|
|
urlstr = "/ocall/callreqHandler.jsp" |
|
|
|
|
|
params = { |
|
|
|
|
|
'info': 'simple text call', |
|
|
|
|
|
'phoneno': phoneno, |
|
|
|
|
|
'firstocc': 10, |
|
|
|
|
|
'txt': text, |
|
|
|
|
|
'selfdelete': selfdelete |
|
|
|
|
|
} |
|
|
|
|
|
res = self.postToGateway(urlstr, params) |
|
|
|
|
|
return self.getReqId(res) |
|
|
|
|
|
|
|
|
|
|
|
def callAudio(self, phoneno, filename, selfdelete): |
|
|
|
|
|
urlstr = "/ocall/callreqHandler.jsp" |
|
|
|
|
|
params = { |
|
|
|
|
|
'info': 'simple audio call', |
|
|
|
|
|
'phoneno': phoneno, |
|
|
|
|
|
'firstocc': 10, |
|
|
|
|
|
'audiofile': filename, |
|
|
|
|
|
'selfdelete': selfdelete |
|
|
|
|
|
} |
|
|
|
|
|
res = self.postToGateway(urlstr, params) |
|
|
|
|
|
return self.getReqId(res) |
|
|
|
|
|
|
|
|
|
|
|
def callIvr(self, phoneno, appname, selfdelete): |
|
|
|
|
|
urlstr = "/ocall/callreqHandler.jsp" |
|
|
|
|
|
params = { |
|
|
|
|
|
'info': 'simple text call', |
|
|
|
|
|
'phoneno': phoneno, |
|
|
|
|
|
'firstocc': 10, |
|
|
|
|
|
'startapp': appname, |
|
|
|
|
|
'selfdelete': selfdelete |
|
|
|
|
|
} |
|
|
|
|
|
res = self.postToGateway(urlstr, params) |
|
|
|
|
|
return self.getReqId(res) |
|
|
|
|
|
|
|
|
|
|
|
def callStatus(self, reqid): |
|
|
|
|
|
urlstr = "/ocall/callstatusHandler.jsp" |
|
|
|
|
|
params = {'reqid': reqid} |
|
|
|
|
|
res = self.postToGateway(urlstr, params) |
|
|
|
|
|
return self.getReqId(res) |
|
|
|
|
|
|
|
|
|
|
|
def callRemove(self, reqId): |
|
|
|
|
|
urlstr = "/ocall/callremoveHandler.jsp" |
|
|
|
|
|
params = {'reqid': reqId} |
|
|
|
|
|
res = self.postToGateway(urlstr, params) |
|
|
|
|
|
return self.getReqId(res) |
|
|
|
|
|
|
|
|
|
|
|
def callTillConfirm(self, vcastexe, vocfile, wavfile, ccode): |
|
|
|
|
|
urlstr = "/ocall/callreqHandler.jsp" |
|
|
|
|
|
cmdline = "\"" |
|
|
|
|
|
cmdline += vocfile |
|
|
|
|
|
cmdline += "\"" |
|
|
|
|
|
cmdline += " -startnow" |
|
|
|
|
|
cmdline += " -confirmcode " |
|
|
|
|
|
cmdline += ccode |
|
|
|
|
|
cmdline += " -wavfile " |
|
|
|
|
|
cmdline += "\"" |
|
|
|
|
|
cmdline += wavfile |
|
|
|
|
|
cmdline += "\"" |
|
|
|
|
|
|
|
|
|
|
|
params = { |
|
|
|
|
|
'info': 'Simple Call till Confirm', |
|
|
|
|
|
'phoneno': '1111111', |
|
|
|
|
|
'firstocc': 10, |
|
|
|
|
|
'selfdelete': 0, |
|
|
|
|
|
'startexec': vcastexe, |
|
|
|
|
|
'cmdline': cmdline |
|
|
|
|
|
} |
|
|
|
|
|
res = self.postToGateway(urlstr, params) |
|
|
|
|
|
return self.getReqId(res) |
|
|
|
|
|
|
|
|
|
|
|
################ |
|
|
|
|
|
# CAMPAIGN API # |
|
|
|
|
|
################ |
|
|
|
|
|
|
|
|
|
|
|
def importCampaign(self, listname, filepath): |
|
|
|
|
|
urlstr = "/ocall/campapi" |
|
|
|
|
|
params = { |
|
|
|
|
|
'action': 'import', |
|
|
|
|
|
'importfile': ntpath.basename(filepath), |
|
|
|
|
|
'importfilepath': filepath, |
|
|
|
|
|
'profile': 'Test', |
|
|
|
|
|
'mod': 'cus', |
|
|
|
|
|
'fieldsep': ',', |
|
|
|
|
|
'row1': 1, |
|
|
|
|
|
'mergeopt': 'empty', |
|
|
|
|
|
'leadsrcname': listname |
|
|
|
|
|
} |
|
|
|
|
|
files = { |
|
|
|
|
|
'file': (ntpath.basename(filepath), open(filepath, 'rb')) |
|
|
|
|
|
} |
|
|
|
|
|
res = self.postToGateway(urlstr, params, files) |
|
|
|
|
|
return ast.literal_eval(res) |
|
|
|
|
|
|
|
|
|
|
|
def runCampaign(self, listname): |
|
|
|
|
|
urlstr = "/ocall/campapi" |
|
|
|
|
|
params = { |
|
|
|
|
|
'action': 'bbp', |
|
|
|
|
|
'CAMP_NAME': 'Test', |
|
|
|
|
|
'listname': listname, |
|
|
|
|
|
'phonecols': 'Phone', |
|
|
|
|
|
'lines': '4', |
|
|
|
|
|
'calldisps': '', |
|
|
|
|
|
'callerid': '+18884728568', |
|
|
|
|
|
} |
|
|
|
|
|
res = self.postToGateway(urlstr, params) |
|
|
|
|
|
return ast.literal_eval(res) |
|
|
|
|
|
|
|
|
|
|
|
def importAndRunCampaign(self, filepath, msgtype, msginfo): |
|
|
|
|
|
urlstr = "/ocall/campapi" |
|
|
|
|
|
params = { |
|
|
|
|
|
'action': 'bbp', |
|
|
|
|
|
# Parameters for importing the campaign |
|
|
|
|
|
'importfile': ntpath.basename(filepath), |
|
|
|
|
|
'importfilepath': filepath, |
|
|
|
|
|
# 'profile': 'Test', |
|
|
|
|
|
'mod': 'cus', |
|
|
|
|
|
'row1': 1, |
|
|
|
|
|
'leadsrcname': 'Test', |
|
|
|
|
|
# Parameters for running the campaign |
|
|
|
|
|
'CAMP_NAME': 'Test', |
|
|
|
|
|
'phonecols': 'Phone', |
|
|
|
|
|
'lines': '4', |
|
|
|
|
|
'calldisps': '', |
|
|
|
|
|
'callerid': '+18884728568', |
|
|
|
|
|
# Parameters for Autodialer |
|
|
|
|
|
'msgtype': msgtype, |
|
|
|
|
|
'msginfo': msginfo, |
|
|
|
|
|
} |
|
|
|
|
|
files = { |
|
|
|
|
|
'file': (ntpath.basename(filepath), open(filepath, 'rb')) |
|
|
|
|
|
} |
|
|
|
|
|
res = self.postToGateway(urlstr, params, files) |
|
|
|
|
|
return ast.literal_eval(res) |
|
|
|
|
|
|
|
|
|
|
|
def checkStatus(self, leadsrc_id): |
|
|
|
|
|
urlstr = "/ocall/campapi" |
|
|
|
|
|
params = { |
|
|
|
|
|
'action': 'campstats', |
|
|
|
|
|
'leadsrc_id': leadsrc_id |
|
|
|
|
|
} |
|
|
|
|
|
res = self.postToGateway(urlstr, params) |
|
|
|
|
|
return ast.literal_eval(res) |
|
|
|
|
|
|
|
|
|
|
|
def exportResult(self, camp_id, filename, extracols): |
|
|
|
|
|
urlstr = "/ocall/campapi" |
|
|
|
|
|
params = { |
|
|
|
|
|
'action': 'exportcamp', |
|
|
|
|
|
'camp_id_id': camp_id, |
|
|
|
|
|
'f': filename, |
|
|
|
|
|
'extracols': extracols |
|
|
|
|
|
} |
|
|
|
|
|
res = self.postToGateway(urlstr, params) |
|
|
|
|
|
return ast.literal_eval(res) |