• 沒有找到結果。

4.1 语音回呼代码样例

4.1.3 Python

环境要求 Python 3.0及以上版本。

引用库 requests 2.18.1

1. 请自行下载安装Python 3.x,并完成环境配置。

2. 打开命令行窗口,执行pip install requests命令。

3. 执行pip list查看安装结果。

须知

● 本文档所述Demo在提供服务的过程中,可能会涉及个人数据的使用,建议您遵从 国家的相关法律采取足够的措施,以确保用户的个人数据受到充分的保护。

● 本文档所述Demo仅用于功能演示,不允许客户直接进行商业使用。

● 本文档信息仅供参考,不构成任何要约或承诺。

“语音回呼场景 API”代码样例

# coding: utf-8 -*-import base64 import hashlib

import requests #需要先使用pip install requests命令安装依赖 import time

import uuid

#必填,请参考"开发准备-申请资源"获取如下数据,替换为实际值

base_url = 'https://{domain}:{port}'#APP接入地址,购买服务时下发,请替换为实际值 appKey = '***appKey***'#语音回呼应用的appKey,购买服务时下发,请替换为实际值 appSecret = '***appSecret***'#语音回呼应用的appSecret,购买服务时下发,请替换为实际值 def buildWSSEHeader(appKey, appSecret):

now = time.strftime('%Y-%m-%dT%H:%M:%SZ') #Created nonce = str(uuid.uuid4()).replace('-', '') #Nonce

digest = hashlib.sha256((nonce + now + appSecret).encode()).hexdigest() digestBase64 = base64.b64encode(digest.encode()).decode() #PasswordDigest

return 'UsernameToken Username="{}",PasswordDigest="{}",Nonce="{}",Created="{}"'.format(appKey, digestBase64, nonce, now);

def voiceCallAPI(displayNbr, callerNbr, displayCalleeNbr, calleeNbr):

if len(displayNbr) < 1 or len(callerNbr) < 1 or len(displayCalleeNbr) < 1 or len(calleeNbr) < 1:

return

apiUri = '/rest/httpsessions/click2Call/v2.0'

requestUrl = base_url + apiUri header = {

'Content-Type': 'application/json;charset=UTF-8',

'Authorization': 'WSSE realm="SDP",profile="UsernameToken",type="Appkey"', 'X-WSSE': buildWSSEHeader(appKey, appSecret)

}

jsonData = { # 必填参数

'displayNbr': displayNbr,#主叫用户手机终端的来电显示号码。

'callerNbr': callerNbr,#发起呼叫时所使用的主叫号码。

'displayCalleeNbr': displayCalleeNbr,#被叫用户终端的来电显示号码。

'calleeNbr': calleeNbr#发起呼叫时所拨打的被叫号码。

# 'preVoice': 'pre_voice1.wav', #设置主叫(callerNbr)应答语音回呼后,呼叫被叫(calleeNbr)前向主叫播 放的提示音

# 'partyTypeRequiredInDisconnect': 'false', #disconnect状态是否需要携带通话主动挂机的用户类型

# 'returnIdlePort': 'false', #指示是否需要返回平台空闲呼叫端口数量

# 'userData': 'customerId123' #设置用户的附属信息 }

try:

r = requests.post(requestUrl, json=jsonData, headers=header, verify=False) print(r.text) #打印响应结果

except requests.exceptions.HTTPError as e:

print(e.code)

print(e.read().decode('utf-8')) #打印错误信息 pass

if __name__ == '__main__':

voiceCallAPI('+86531*******4', '+86135*******1', '+86531*******4', '+86135*******2')

“获取录音文件下载地址 API”代码样例

# coding: utf-8 -*-import base64 import hashlib

import requests #需要先使用pip install requests命令安装依赖 import time

now = time.strftime('%Y-%m-%dT%H:%M:%SZ') #Created nonce = str(uuid.uuid4()).replace('-', '') #Nonce

digest = hashlib.sha256((nonce + now + appSecret).encode()).hexdigest() digestBase64 = base64.b64encode(digest.encode()).decode() #PasswordDigest

return 'UsernameToken Username="{}",PasswordDigest="{}",Nonce="{}",Created="{}"'.format(appKey, digestBase64, nonce, now);

def getRecordLinkAPI(fileName, recordDomain, xwsse):

if len(fileName) < 1 or len(recordDomain) < 1 or len(xwsse) < 1:

return

location = ''

apiUri = '/rest/provision/voice/record/v1.0'

queryParams = urllib.parse.urlencode({'fileName':fileName, 'recordDomain':recordDomain}) requestUrl = base_url + apiUri + '?' + queryParams

header = {

'Content-Type': 'application/json;charset=UTF-8',

'Authorization': 'WSSE realm="SDP",profile="UsernameToken",type="Appkey"', 'X-WSSE': xwsse

} try:

r = requests.get(requestUrl, headers=header, allow_redirects=False, verify=False) #发送请求 if(301 == r.status_code):

print(r.status_code) #打印响应结果 location = r.headers['Location']

else:

print(r.status_code) print(r.text)#打印响应结果

except requests.exceptions.HTTPError as e:

print(e.code)

print(e.read().decode('utf-8')) #打印错误信息 return location

if __name__ == '__main__':

wsse = buildWSSEHeader('***appKey***', '***appSecret***') #语音回呼应用的appKey和appSecret location = getRecordLinkAPI('1200_366_0_20161228102743.wav', 'ostor.huawei.com', wsse) print('The record file download link is: ' + location)

“呼叫状态通知 API”代码样例

# coding: utf-8 -*-'''

呼叫事件通知

客户平台收到语音通话平台的呼叫事件通知的接口通知 '''import json

#呼叫事件通知样例 jsonBody = json.dumps({

'eventType': 'callout', 'statusInfo': {

'sessionId': '[email protected]', 'timestamp': '2019-01-24 03:04:24',

'caller': '+86138*******2', 'called': '+86138*******1', 'userData': 'customerId123' }

}).encode('ascii') print(jsonBody) '''

呼叫事件通知

@see: 详细内容以接口文档为准

@param param: jsonBody

@return:

'''def onCallEvent(jsonBody):

jsonObj = json.loads(jsonBody) #将通知消息解析为jsonObj eventType = jsonObj['eventType'] #通知事件类型

if ('fee' == eventType):

print('EventType error: ' + eventType) return

if ('statusInfo' not in jsonObj):

print('param error: no statusInfo.') return

statusInfo = jsonObj['statusInfo'] #呼叫状态事件信息 print('eventType: ' + eventType) #打印通知事件类型

'called': 被叫号码

onCallEvent(jsonBody) #呼叫事件处理

“话单通知 API”代码样例

'sessionId': '[email protected]', #通话链路的 唯一标识 'callerNum': '+86138*******2', #主叫号码

'''

话单通知@see: 详细内容以接口文档为准

@param param: jsonBody

@return:

'''def onFeeEvent(jsonBody):

jsonObj = json.loads(jsonBody) #将通知消息解析为jsonObj eventType = jsonObj['eventType'] #通知事件类型

if ('fee' != eventType):

print('EventType error: ' + eventType) return

if ('feeLst' not in jsonObj):

print('param error: no feeLst.');

return

feeLst = jsonObj['feeLst']

#Example: 此处以解析sessionId为例,请按需解析所需参数并自行实现相关处理

#短时间内有多个通话结束时语音通话平台会将话单合并推送,每条消息最多携带50个话单 if (len(feeLst) > 1):

for loop in feeLst:

if ('sessionId' in loop):

print('sessionId: ' + loop['sessionId']) elif(len(feeLst) == 1):

if ('sessionId' in feeLst[0]):

print('sessionId: ' + feeLst[0]['sessionId']) else:

print('feeLst error: no element.');

if __name__ == '__main__':

onFeeEvent(jsonBody) #话单处理

相關文件