Python——云通讯短信接口对接python3使用

前言:

    云通讯不做介绍,官网的python的sdk还是2.7版本,貌似是从13年到现在没人更新过,现在很多程序跑在python3版本上,好了问题来了,预研版本升级时候对接到第三方接口的sdk是版本2写到,3就是对接不上短信验证码就是发不出来。然后看了下官方的sdk,犹豫后还是重写了官方到sdk,回顾其中主要变动点有三个,一个是2和3到字符集编码格式变化,二是2和3的md5加密上语法有些差异有点小坑,三是官方使用的urllib2请求的,3中已经合并到request中了,甚至个人觉得还不如用request直接来的亲切;

具体内容:

      不做过多废话,下面直接上已经修正python3适用的sdk,当然因为时间仓促来不及进一步优化只是能让程序先用,所以重写后还是有很多优化的地方的;(有相关问题,欢迎加QQ1277207158进行指正)

具体申请应用参考官网哈,主要的就是以下几个参数:

accountSid = 'xxxxxx;                  #账号id           首页就可以看到

accountToken = 'xxxxxx';            #账号token     首页就可以看到

appId = 'xxxxxx;                          #appid   新开户需要创建一个

serverIP = 'app.cloopen.com';      #云通讯生产环境地址,不用变

serverPort = '8883';                                #端口号

softVersion = '2013-12-26';                     #版本号

首先调用函数改写如下:

# coding=utf-8
from CCPRestSDK import REST
#import ConfigParser         #官网sdk带的,没有使用
import logging

# 账号id
accountSid = 'xxxxxx'
# 账号Token
accountToken = 'xxxxxx'
# 应用Id
appId = 'xxxxxx'            #token请自行去官网申请
# 服务地址
serverIP = 'app.cloopen.com'
# 服务端口
serverPort = '8883'
# REST版本
softVersion = '2013-12-26'

# def sendTemplateSMS(to,datas,tempId):
#
#
#     #REST SDK
#     rest = REST(serverIP,serverPort,softVersion)
#     rest.setAccount(accountSid,accountToken)
#     rest.setAppId(appId)
#
#     result = rest.sendTemplateSMS(to,datas,tempId)
#     for k,v in result.iteritems():
#
#         if k=='templateSMS' :
#                 for k,s in v.iteritems():
#                     print '%s:%s' % (k, s)
#         else:
#             print '%s:%s' % (k, v)


class CCP(object):

    def __init__(self):
        self.rest = REST(serverIP, serverPort, softVersion)
        self.rest.setAccount(accountSid, accountToken)
        self.rest.setAppId(appId)

    @staticmethod
    def instance():
        if not hasattr(CCP, "_instance"):
            CCP._instance = CCP()
        return CCP._instance

    def sendTemplateSMS(self, to, datas, tempId):
        try:
            result = self.rest.sendTemplateSMS(to, datas, tempId)
        except Exception as e:
            logging.error(e)
            raise e
        # print result
        # for k, v in result.iteritems():
        #     if k == 'templateSMS':
        #         for k, s in v.iteritems():
        #             print '%s:%s' % (k, s)
        #     else:
        #         print '%s:%s' % (k, v)
        success = "000000"
        if success in result:
            return True
        else:
            return False
ccp = CCP.instance()
if __name__ == "__main__":
    ccp = CCP.instance()
    res = ccp.sendTemplateSMS("185xxxxxxxx", ["1234", 5], 1)
    print(res)

鉴于提示说需要20分钟阅读完,时间宝贵,只拿发送短信部分单独上边说一下,下边是代码可以复制直接使用:

关键就用发送短信方法了:

 # 发送模板短信
    # @param to  必选参数     短信接收彿手机号码集合,用英文逗号分开
    # @param datas 可选参数    内容数据
    # @param tempId 必选参数    模板Id
    def sendTemplateSMS(self, to, datas, tempId):

        self.accAuth()
        nowdate = datetime.datetime.now()
        self.Batch = nowdate.strftime("%Y%m%d%H%M%S")
        # 生成sig
        signature = self.AccountSid + self.AccountToken + self.Batch
        sig = md5(signature.encode()).hexdigest().upper()
        # 拼接URL
        url = "https://" + self.ServerIP + ":" + self.ServerPort + "/" + self.SoftVersion + "/Accounts/" + self.AccountSid + "/SMS/TemplateSMS?sig=" + sig
        # 生成auth
        src = self.AccountSid + ":" + self.Batch
        auth = base64.encodestring(src.encode()).strip().decode()
        req = urllib.request.Request(url)
        self.setHttpHeader(req)
        req.add_header("Authorization", auth)
        #print(req.headers)      #组装请求头
        # 创建包体
        b = ''
        for a in datas:
            b += '%s' % (a)

        body = '' + b + '%s%s%s\
            \
            ' % (to, tempId, self.AppId)
        if self.BodyType == 'json':
            # if this model is Json ..then do next code
            b = '['
            for a in datas:
                b += '"%s",' % (a)
            b += ']'
            body = '''{"to": "%s", "datas": %s, "templateId": "%s", "appId": "%s"}''' % (to, b, tempId, self.AppId)
        req.data = body
        #print(req.data)    #组装请求体
        #确认请求体和请求头
        req_headers = req.headers
        req_data = req.data
        # print(req_headers,req_data)
        # print("_______"*20)
        data = ''
        try:
            # res = urllib.request.urlopen(req)
            res = requests.post(url, headers=req_headers, data=req_data)
            # print(res.status_code,res.content,res.text,)
            data = res.text
            # data = res.read()
            # res.close()
            # if self.BodyType == 'json':
            #     # json格式
            #     locations = json.loads(data)
            # else:
            #     # xml格式
            #     xtj = xmltojson()
            #     locations = xtj.main(data)
            if self.Iflog:
                self.log(url, body, data)
            return data
        except Exception as error:
            if self.Iflog:
                self.log(url, body, data)
            return {'172001': '网络错误'}

不难看出方法重复内容非常多,更别说什么工厂模式了,所以其实可改进地方非常多,时间有限,凑合先用,后期会在github上上传一个优化版本;

调用官网接口的SDK的全部代码:

# -*- coding: UTF-8 -*-
#  Copyright (c) 2014 The CCP project authors. All Rights Reserved.
#
#  Use of this source code is governed by a Beijing Speedtong Information Technology Co.,Ltd license
#  that can be found in the LICENSE file in the root of the web site.
#
#   http://www.yuntongxun.com
#
#  An additional intellectual property rights grant can be found
#  in the file PATENTS.  All contributing project authors may
#  be found in the AUTHORS file in the root of the source tree.

from hashlib import md5
import base64
import datetime
import urllib.request
import requests
import json
from xmltojson import xmltojson
from xml.dom import minidom


class REST:
    AccountSid = ''
    AccountToken = ''
    AppId = ''
    SubAccountSid = ''
    SubAccountToken = ''
    ServerIP = ''
    ServerPort = ''
    SoftVersion = ''
    Iflog = True  # 是否打印日志
    Batch = ''  # 时间戳
    BodyType = 'xml'  # 包体格式,可填值:json 、xml

    # 初始化
    # @param serverIP       必选参数    服务器地址
    # @param serverPort     必选参数    服务器端口
    # @param softVersion    必选参数    REST版本号
    def __init__(self, ServerIP, ServerPort, SoftVersion):

        self.ServerIP = ServerIP
        self.ServerPort = ServerPort
        self.SoftVersion = SoftVersion

    # 设置主帐号
    # @param AccountSid  必选参数    主帐号
    # @param AccountToken  必选参数    主帐号Token

    def setAccount(self, AccountSid, AccountToken):
        self.AccountSid = AccountSid
        self.AccountToken = AccountToken

        # 设置子帐号

    #
    # @param SubAccountSid  必选参数    子帐号
    # @param SubAccountToken  必选参数    子帐号Token

    def setSubAccount(self, SubAccountSid, SubAccountToken):
        self.SubAccountSid = SubAccountSid
        self.SubAccountToken = SubAccountToken

        # 设置应用ID

    #
    # @param AppId  必选参数    应用ID

    def setAppId(self, AppId):
        self.AppId = AppId

    def log(self, url, body, data):
        print('这是请求的URL:')
        print(url)
        print('这是请求包体:')
        print(body)
        print('这是响应包体:')
        print(data)
        print('********************************')

    # 创建子账号
    # @param friendlyName   必选参数      子帐号名称
    def CreateSubAccount(self, friendlyName):

        self.accAuth()
        nowdate = datetime.datetime.now()
        self.Batch = nowdate.strftime("%Y%m%d%H%M%S")
        # 生成sig
        signature = self.AccountSid + self.AccountToken + self.Batch
        sig = md5(signature.encode()).hexdigest().upper()
        # 拼接URL
        url = "https://" + self.ServerIP + ":" + self.ServerPort + "/" + self.SoftVersion + "/Accounts/" + self.AccountSid + "/SubAccounts?sig=" + sig
        # 生成auth
        src = self.AccountSid + ":" + self.Batch
        auth = base64.encodestring(src.encode()).strip().decode()
        req = urllib.request.Request(url)
        self.setHttpHeader(req)
        req.add_header("Authorization", auth)
        # xml格式
        body = '''%s\
            %s\
            \
            ''' % (self.AppId, friendlyName)

        if self.BodyType == 'json':
            # json格式
            body = '''{"friendlyName": "%s", "appId": "%s"}''' % (friendlyName, self.AppId)
        data = ''
        req.data = body
        try:
            # res = urllib.request.urlopen(req)
            # data = res.read()
            # res.close()
            res = requests.post(url, headers=req.headers, data=req.data)
            #print(res.status_code, res.content, res.text, )
            data = res.text 
            # if self.BodyType == 'json':
            #     # json格式
            #     locations = json.loads(data)
            # else:
            #     # xml格式
            #     xtj = xmltojson()
            #     locations = xtj.main(data)
            if self.Iflog:
                self.log(url, body, data)
            return data
        except Exception as error:
            if self.Iflog:
                self.log(url, body, data)
            return {'172001': '网络错误'}

    #  获取子帐号
    # @param startNo  可选参数    开始的序号,默认从0开始
    # @param offset 可选参数     一次查询的最大条数,最小是1条,最大是100条
    def getSubAccounts(self, startNo, offset):

        self.accAuth()
        nowdate = datetime.datetime.now()
        self.Batch = nowdate.strftime("%Y%m%d%H%M%S")
        # 生成sig
        signature = self.AccountSid + self.AccountToken + self.Batch
        sig = md5(signature.encode()).hexdigest().upper()
        # 拼接URL
        url = "https://" + self.ServerIP + ":" + self.ServerPort + "/" + self.SoftVersion + "/Accounts/" + self.AccountSid + "/GetSubAccounts?sig=" + sig
        # 生成auth
        src = self.AccountSid + ":" + self.Batch
        auth = base64.encodestring(src.encode()).strip().decode()
        req = urllib.request.Request(url)
        self.setHttpHeader(req)
        req.add_header("Authorization", auth)
        # xml格式
        body = '''%s\
            %s%s\
            \
            ''' % (self.AppId, startNo, offset)

        if self.BodyType == 'json':
            # json格式
            body = '''{"appId": "%s", "startNo": "%s", "offset": "%s"}''' % (self.AppId, startNo, offset)
        data = ''
        req.data = body
        try:
            res = requests.get(url, headers=req.headers)
            #print(res.status_code, res.content, res.text, )
            data = res.text

            # if self.BodyType == 'json':
            #     # json格式
            #     locations = json.loads(data)
            # else:
            #     # xml格式
            #     xtj = xmltojson()
            #     locations = xtj.main(data)
            if self.Iflog:
                self.log(url, body, data)
            return data
        except Exception as error:
            if self.Iflog:
                self.log(url, body, data)
            return {'172001': '网络错误'}

    # 子帐号信息查询
    # @param friendlyName 必选参数   子帐号名称

    def querySubAccount(self, friendlyName):

        self.accAuth()
        nowdate = datetime.datetime.now()
        self.Batch = nowdate.strftime("%Y%m%d%H%M%S")
        # 生成sig
        signature = self.AccountSid + self.AccountToken + self.Batch
        sig = md5(signature.encode()).hexdigest().upper()
        # 拼接URL
        url = "https://" + self.ServerIP + ":" + self.ServerPort + "/" + self.SoftVersion + "/Accounts/" + self.AccountSid + "/QuerySubAccountByName?sig=" + sig
        # 生成auth
        src = self.AccountSid + ":" + self.Batch
        auth = base64.encodestring(src.encode()).strip().decode()
        req = urllib.request.Request(url)
        self.setHttpHeader(req)

        req.add_header("Authorization", auth)

        # 创建包体
        body = '''%s\
            %s\
            \
            ''' % (self.AppId, friendlyName)
        if self.BodyType == 'json':
            body = '''{"friendlyName": "%s", "appId": "%s"}''' % (friendlyName, self.AppId)
        data = ''
        req.data = body
        try:
            # res = urllib.request.urlopen(req)
            # data = res.read()
            # res.close()
            res = requests.get(url, headers=req.headers, data=req.data)
            #print(res.status_code, res.content, res.text, )
            data = res.text

            # if self.BodyType == 'json':
            #     # json格式
            #     locations = json.loads(data)
            # else:
            #     # xml格式
            #     xtj = xmltojson()
            #     locations = xtj.main(data)
            if self.Iflog:
                self.log(url, body, data)
            return data
        except Exception as error:
            if self.Iflog:
                self.log(url, body, data)
            return {'172001': '网络错误'}

    # 发送模板短信
    # @param to  必选参数     短信接收彿手机号码集合,用英文逗号分开
    # @param datas 可选参数    内容数据
    # @param tempId 必选参数    模板Id
    def sendTemplateSMS(self, to, datas, tempId):

        self.accAuth()
        nowdate = datetime.datetime.now()
        self.Batch = nowdate.strftime("%Y%m%d%H%M%S")
        # 生成sig
        signature = self.AccountSid + self.AccountToken + self.Batch
        sig = md5(signature.encode()).hexdigest().upper()
        # 拼接URL
        url = "https://" + self.ServerIP + ":" + self.ServerPort + "/" + self.SoftVersion + "/Accounts/" + self.AccountSid + "/SMS/TemplateSMS?sig=" + sig
        # 生成auth
        src = self.AccountSid + ":" + self.Batch
        auth = base64.encodestring(src.encode()).strip().decode()
        req = urllib.request.Request(url)
        self.setHttpHeader(req)
        req.add_header("Authorization", auth)
        #print(req.headers)      #组装请求头
        # 创建包体
        b = ''
        for a in datas:
            b += '%s' % (a)

        body = '' + b + '%s%s%s\
            \
            ' % (to, tempId, self.AppId)
        if self.BodyType == 'json':
            # if this model is Json ..then do next code
            b = '['
            for a in datas:
                b += '"%s",' % (a)
            b += ']'
            body = '''{"to": "%s", "datas": %s, "templateId": "%s", "appId": "%s"}''' % (to, b, tempId, self.AppId)
        req.data = body
        #print(req.data)    #组装请求体
        #确认请求体和请求头
        req_headers = req.headers
        req_data = req.data
        # print(req_headers,req_data)
        # print("_______"*20)
        data = ''
        try:
            # res = urllib.request.urlopen(req)
            res = requests.post(url, headers=req_headers, data=req_data)
            # print(res.status_code,res.content,res.text,)
            data = res.text
            # data = res.read()
            # res.close()
            # if self.BodyType == 'json':
            #     # json格式
            #     locations = json.loads(data)
            # else:
            #     # xml格式
            #     xtj = xmltojson()
            #     locations = xtj.main(data)
            if self.Iflog:
                self.log(url, body, data)
            return data
        except Exception as error:
            if self.Iflog:
                self.log(url, body, data)
            return {'172001': '网络错误'}

    # 外呼通知
    # @param to 必选参数    被叫号码
    # @param mediaName 可选参数    语音文件名称,格式 wav。与mediaTxt不能同时为空。当不为空时mediaTxt属性失效。
    # @param mediaTxt 可选参数    文本内容
    # @param displayNum 可选参数    显示的主叫号码
    # @param playTimes 可选参数    循环播放次数,1-3次,默认播放1次。
    # @param respUrl 可选参数    外呼通知状态通知回调地址,云通讯平台将向该Url地址发送呼叫结果通知。
    # @param userData 可选参数    用户私有数据
    # @param maxCallTime 可选参数    最大通话时长
    # @param speed 可选参数    发音速度
    # @param volume 可选参数    音量
    # @param pitch 可选参数    音调
    # @param bgsound 可选参数    背景音编号

    def landingCall(self, to, mediaName, mediaTxt, displayNum, playTimes, respUrl, userData, maxCallTime, speed, volume,
                    pitch, bgsound):

        self.accAuth()
        nowdate = datetime.datetime.now()
        self.Batch = nowdate.strftime("%Y%m%d%H%M%S")
        # 生成sig
        signature = self.AccountSid + self.AccountToken + self.Batch
        sig = md5(signature.encode()).hexdigest().upper()
        # 拼接URL
        url = "https://" + self.ServerIP + ":" + self.ServerPort + "/" + self.SoftVersion + "/Accounts/" + self.AccountSid + "/Calls/LandingCalls?sig=" + sig
        # 生成auth
        src = self.AccountSid + ":" + self.Batch
        auth = base64.encodestring(src.encode()).strip().decode()
        req = urllib.request.Request(url)
        self.setHttpHeader(req)
        req.add_header("Authorization", auth)

        # 创建包体
        body = '''\
            %s%s%s%s%s\
            %s%s%s%s%s
            %s%s%s\
            ''' % (
        to, mediaName, mediaTxt, self.AppId, displayNum, playTimes, respUrl, userData, maxCallTime, speed, volume,
        pitch, bgsound)
        if self.BodyType == 'json':
            body = '''{"to": "%s", "mediaName": "%s","mediaTxt": "%s","appId": "%s","displayNum": "%s","playTimes": "%s","respUrl": "%s","userData": "%s","maxCallTime": "%s","speed": "%s","volume": "%s","pitch": "%s","bgsound": "%s"}''' % (
            to, mediaName, mediaTxt, self.AppId, displayNum, playTimes, respUrl, userData, maxCallTime, speed, volume,
            pitch, bgsound)
        req.data = body
        data = ''
        try:
            # res = urllib.request.urlopen(req)
            # data = res.read()
            # res.close()
            res = requests.post(url, headers=req.headers, data=req.data)
            #print(res.status_code, res.content, res.text, )
            data = res.text

            # if self.BodyType == 'json':
            #     # json格式
            #     locations = json.loads(data)
            # else:
            #     # xml格式
            #     xtj = xmltojson()
            #     locations = xtj.main(data)
            if self.Iflog:
                self.log(url, body, data)
            return data
        except Exception as error:
            if self.Iflog:
                self.log(url, body, data)
            return {'172001': '网络错误'}

    # 语音验证码
    # @param verifyCode  必选参数   验证码内容,为数字和英文字母,不区分大小写,长度4-8位
    # @param playTimes  可选参数   播放次数,1-3次
    # @param to 必选参数    接收号码
    # @param displayNum 可选参数    显示的主叫号码
    # @param respUrl 可选参数    语音验证码状态通知回调地址,云通讯平台将向该Url地址发送呼叫结果通知
    # @param lang 可选参数    语言类型
    # @param userData 可选参数    第三方私有数据

    def voiceVerify(self, verifyCode, playTimes, to, displayNum, respUrl, lang, userData):

        self.accAuth()
        nowdate = datetime.datetime.now()
        self.Batch = nowdate.strftime("%Y%m%d%H%M%S")
        # 生成sig
        signature = self.AccountSid + self.AccountToken + self.Batch
        sig = md5(signature.encode()).hexdigest().upper()
        # 拼接URL
        url = "https://" + self.ServerIP + ":" + self.ServerPort + "/" + self.SoftVersion + "/Accounts/" + self.AccountSid + "/Calls/VoiceVerify?sig=" + sig
        # 生成auth
        src = self.AccountSid + ":" + self.Batch
        auth = base64.encodestring(src.encode()).strip().decode()
        req = urllib.request.Request(url)
        self.setHttpHeader(req)

        req.add_header("Authorization", auth)

        # 创建包体
        body = '''\
            %s%s%s%s%s\
            %s%s%s\
            ''' % (self.AppId, verifyCode, playTimes, to, respUrl, displayNum, lang, userData)
        if self.BodyType == 'json':
            # if this model is Json ..then do next code
            body = '''{"appId": "%s", "verifyCode": "%s","playTimes": "%s","to": "%s","respUrl": "%s","displayNum": "%s","lang": "%s","userData": "%s"}''' % (
            self.AppId, verifyCode, playTimes, to, respUrl, displayNum, lang, userData)
        req.data = body
        data = ''
        try:
            # res = urllib.request.urlopen(req)
            # data = res.read()
            # res.close()
            res = requests.post(url, headers=req.headers, data=req.data)
            #print(res.status_code, res.content, res.text, )
            data = res.text
            # if self.BodyType == 'json':
            #     # json格式
            #     locations = json.loads(data)
            # else:
            #     # xml格式
            #     xtj = xmltojson()
            #     locations = xtj.main(data)
            if self.Iflog:
                self.log(url, body, data)
            return data
        except Exception as error:
            if self.Iflog:
                self.log(url, body, data)
            return {'172001': '网络错误'}

    # IVR外呼
    # @param number  必选参数     待呼叫号码,为Dial节点的属性
    # @param userdata 可选参数    用户数据,在通知中返回,只允许填写数字字符,为Dial节点的属性
    # @param record   可选参数    是否录音,可填项为true和false,默认值为false不录音,为Dial节点的属性

    def ivrDial(self, number, userdata, record):

        self.accAuth()
        nowdate = datetime.datetime.now()
        self.Batch = nowdate.strftime("%Y%m%d%H%M%S")
        # 生成sig
        signature = self.AccountSid + self.AccountToken + self.Batch
        sig = md5(signature.encode()).hexdigest().upper()
        # 拼接URL
        url = "https://" + self.ServerIP + ":" + self.ServerPort + "/" + self.SoftVersion + "/Accounts/" + self.AccountSid + "/ivr/dial?sig=" + sig
        # 生成auth
        src = self.AccountSid + ":" + self.Batch
        auth = base64.encodestring(src.encode()).strip().decode()
        req = urllib.request.Request(url)
        req.add_header("Accept", "application/xml")
        req.add_header("Content-Type", "application/xml;charset=utf-8")
        req.add_header("Authorization", auth)

        # 创建包体
        body = '''
                
                    %s
                    
                
            ''' % (self.AppId, number, userdata, record)
        req.data = body
        data = ''
        try:
            # res = urllib.request.urlopen(req)
            # data = res.read()
            # res.close()
            res = requests.post(url, headers=req.headers, data=req.data)
            #print(res.status_code, res.content, res.text, )
            data = res.text
            # xtj = xmltojson()
            # locations = xtj.main(data)
            if self.Iflog:
                self.log(url, body, data)
            return data
        except Exception as error:
            if self.Iflog:
                self.log(url, body, data)
            return {'172001': '网络错误'}

    # 话单下载
    # @param date   必选参数    day 代表前一天的数据(从00:00 – 23:59),目前只支持按天查询
    # @param keywords  可选参数     客户的查询条件,由客户自行定义并提供给云通讯平台。默认不填忽略此参数
    def billRecords(self, date, keywords):

        self.accAuth()
        nowdate = datetime.datetime.now()
        self.Batch = nowdate.strftime("%Y%m%d%H%M%S")
        # 生成sig
        signature = self.AccountSid + self.AccountToken + self.Batch
        sig = md5(signature.encode()).hexdigest().upper()
        # 拼接URL
        url = "https://" + self.ServerIP + ":" + self.ServerPort + "/" + self.SoftVersion + "/Accounts/" + self.AccountSid + "/BillRecords?sig=" + sig
        # 生成auth
        src = self.AccountSid + ":" + self.Batch
        auth = base64.encodestring(src.encode()).strip().decode()
        req = urllib.request.Request(url)
        self.setHttpHeader(req)
        req.add_header("Authorization", auth)

        # 创建包体
        body = '''\
            %s%s%s\
            \
            ''' % (self.AppId, date, keywords)
        if self.BodyType == 'json':
            # if this model is Json ..then do next code
            body = '''{"appId": "%s", "date": "%s","keywords": "%s"}''' % (self.AppId, date, keywords)
        req.data = body
        data = ''
        try:
            # res = urllib.request.urlopen(req)
            # data = res.read()
            # res.close()
            res = requests.post(url, headers=req.headers, data=req.data)
            #print(res.status_code, res.content, res.text, )
            data = res.text

            # if self.BodyType == 'json':
            #     # json格式
            #     locations = json.loads(data)
            # else:
            #     # xml格式
            #     xtj = xmltojson()
            #     locations = xtj.main(data)
            if self.Iflog:
                self.log(url, body, data)
            return data
        except Exception as error:
            if self.Iflog:
                self.log(url, body, data)
            return {'172001': '网络错误'}

    # 主帐号信息查询

    def queryAccountInfo(self):

        self.accAuth()
        nowdate = datetime.datetime.now()
        self.Batch = nowdate.strftime("%Y%m%d%H%M%S")
        # 生成sig
        signature = self.AccountSid + self.AccountToken + self.Batch
        sig = md5(signature.encode()).hexdigest().upper()
        # 拼接URL
        url = "https://" + self.ServerIP + ":" + self.ServerPort + "/" + self.SoftVersion + "/Accounts/" + self.AccountSid + "/AccountInfo?sig=" + sig
        # 生成auth
        src = self.AccountSid + ":" + self.Batch
        auth = base64.encodestring(src.encode()).strip().decode()
        req = urllib.request.Request(url)
        self.setHttpHeader(req)
        body = ''
        req.add_header("Authorization", auth)
        data = ''
        try:
            # res = urllib.request.urlopen(req)
            # data = res.read()
            # res.close()
            res = requests.post(url, headers=req.headers, data=req.data)
            #print(res.status_code, res.content, res.text, )
            data = res.text
            # if self.BodyType == 'json':
            #     # json格式
            #     locations = json.loads(data)
            # else:
            #     # xml格式
            #     xtj = xmltojson()
            #     locations = xtj.main(data)
            if self.Iflog:
                self.log(url, body, data)
            return data
        except Exception as error:
            if self.Iflog:
                self.log(url, body, data)
            return {'172001': '网络错误'}

    # 短信模板查询
    # @param templateId  必选参数   模板Id,不带此参数查询全部可用模板

    def QuerySMSTemplate(self, templateId):

        self.accAuth()
        nowdate = datetime.datetime.now()
        self.Batch = nowdate.strftime("%Y%m%d%H%M%S")
        # 生成sig
        signature = self.AccountSid + self.AccountToken + self.Batch
        sig = md5(signature.encode()).hexdigest().upper()
        # 拼接URL
        url = "https://" + self.ServerIP + ":" + self.ServerPort + "/" + self.SoftVersion + "/Accounts/" + self.AccountSid + "/SMS/QuerySMSTemplate?sig=" + sig
        # 生成auth
        src = self.AccountSid + ":" + self.Batch
        auth = base64.encodestring(src.encode()).strip().decode()
        req = urllib.request.Request(url)
        self.setHttpHeader(req)

        req.add_header("Authorization", auth)

        # 创建包体
        body = '''\
            %s%s
            ''' % (self.AppId, templateId)
        if self.BodyType == 'json':
            # if this model is Json ..then do next code
            body = '''{"appId": "%s", "templateId": "%s"}''' % (self.AppId, templateId)
        req.data = body
        data = ''
        try:
            # res = urllib.request.urlopen(req)
            # data = res.read()
            # res.close()
            res = requests.post(url, headers=req.headers, data=req.data)
            #print(res.status_code, res.content, res.text, )
            data = res.text
            # if self.BodyType == 'json':
            #     # json格式
            #     locations = json.loads(data)
            # else:
            #     # xml格式
            #     xtj = xmltojson()
            #     locations = xtj.main2(data)
            if self.Iflog:
                self.log(url, body, data)
            return data
        except Exception as error:
            if self.Iflog:
                self.log(url, body, data)
            return {'172001': '网络错误'}

    # 呼叫结果查询
    # @param callsid   必选参数    呼叫ID

    def CallResult(self, callSid):

        self.accAuth()
        nowdate = datetime.datetime.now()
        self.Batch = nowdate.strftime("%Y%m%d%H%M%S")
        # 生成sig
        signature = self.AccountSid + self.AccountToken + self.Batch
        sig = md5(signature.encode()).hexdigest().upper()
        # 拼接URL
        url = "https://" + self.ServerIP + ":" + self.ServerPort + "/" + self.SoftVersion + "/Accounts/" + self.AccountSid + "/CallResult?sig=" + sig + "&callsid=" + callSid
        # 生成auth
        src = self.AccountSid + ":" + self.Batch
        auth = base64.encodestring(src.encode()).strip().decode()
        req = urllib.request.Request(url)
        self.setHttpHeader(req)
        body = ''
        req.add_header("Authorization", auth)
        data = ''
        try:
            # res = urllib.request.urlopen(req)
            # data = res.read()
            # res.close()
            res = requests.post(url, headers=req_headers, data=req_data)
            #print(res.status_code, res.content, res.text, )
            data = res.text

            # if self.BodyType == 'json':
            #     # json格式
            #     locations = json.loads(data)
            # else:
            #     # xml格式
            #     xtj = xmltojson()
            #     locations = xtj.main(data)
            if self.Iflog:
                self.log(url, body, data)
            return data
        except Exception as error:
            if self.Iflog:
                self.log(url, body, data)
            return {'172001': '网络错误'}

    # 呼叫状态查询
    # @param callid   必选参数    一个由32个字符组成的电话唯一标识符
    # @param action      可选参数     查询结果通知的回调url地址
    def QueryCallState(self, callid, action):

        self.accAuth()
        nowdate = datetime.datetime.now()
        self.Batch = nowdate.strftime("%Y%m%d%H%M%S")
        # 生成sig
        signature = self.AccountSid + self.AccountToken + self.Batch
        sig = md5(signature.encode()).hexdigest().upper()
        # 拼接URL
        url = "https://" + self.ServerIP + ":" + self.ServerPort + "/" + self.SoftVersion + "/Accounts/" + self.AccountSid + "/ivr/call?sig=" + sig + "&callid=" + callid
        # 生成auth
        src = self.AccountSid + ":" + self.Batch
        auth = base64.encodestring(src.encode()).strip().decode()
        req = urllib.request.Request(url)
        self.setHttpHeader(req)
        req.add_header("Authorization", auth)

        # 创建包体
        body = '''\
            %s\
            \
            ''' % (self.AppId, callid, action)
        if self.BodyType == 'json':
            # if this model is Json ..then do next code
            body = '''{"Appid":"%s","QueryCallState":{"callid":"%s","action":"%s"}}''' % (self.AppId, callid, action)
        req.data = body
        data = ''
        try:
            # res = urllib.request.urlopen(req)
            # data = res.read()
            # res.close()
            res = requests.post(url, headers=req.headers, data=req.data)
            #print(res.status_code, res.content, res.text, )
            data = res.text

            # if self.BodyType == 'json':
            #     # json格式
            #     locations = json.loads(data)
            # else:
            #     # xml格式
            #     xtj = xmltojson()
            #     locations = xtj.main(data)
            if self.Iflog:
                self.log(url, body, data)
            return data
        except Exception as error:
            if self.Iflog:
                self.log(url, body, data)
            return {'172001': '网络错误'}

    # 语音文件上传
    # @param filename   必选参数    文件名
    # @param body      必选参数     二进制串
    def MediaFileUpload(self, filename, body):

        self.accAuth()
        nowdate = datetime.datetime.now()
        self.Batch = nowdate.strftime("%Y%m%d%H%M%S")
        # 生成sig
        signature = self.AccountSid + self.AccountToken + self.Batch
        sig = md5(signature.encode()).hexdigest().upper()
        # 拼接URL
        url = "https://" + self.ServerIP + ":" + self.ServerPort + "/" + self.SoftVersion + "/Accounts/" + self.AccountSid + "/Calls/MediaFileUpload?sig=" + sig + "&appid=" + self.AppId + "&filename=" + filename
        # 生成auth
        src = self.AccountSid + ":" + self.Batch
        auth = base64.encodestring(src.encode()).strip().decode()
        req = urllib.request.Request(url)
        req.add_header("Authorization", auth)
        if self.BodyType == 'json':
            req.add_header("Accept", "application/json")
            req.add_header("Content-Type", "application/octet-stream")

        else:
            req.add_header("Accept", "application/xml")
            req.add_header("Content-Type", "application/octet-stream")

        # 创建包体
        req.data = body

        try:
            # res = urllib.request.urlopen(req)
            # data = res.read()
            # res.close()
            res = requests.post(url, headers=req.headers, data=req.data)
            #print(res.status_code, res.content, res.text, )
            data = res.text
            # if self.BodyType == 'json':
            #     # json格式
            #     locations = json.loads(data)
            # else:
            #     # xml格式
            #     xtj = xmltojson()
            #     locations = xtj.main(data)
            if self.Iflog:
                self.log(url, body, data)
            return data
        except Exception as error:
            if self.Iflog:
                self.log(url, body, data)
            return {'172001': '网络错误'}

    # 子帐号鉴权
    def subAuth(self):
        if (self.ServerIP == ""):
            print('172004')
            print('IP为空')

        if (self.ServerPort <= 0):
            print('172005')
            print('端口错误(小于等于0)')

        if (self.SoftVersion == ""):
            print('172013')
            print('版本号为空')

        if (self.SubAccountSid == ""):
            print('172008')
            print('子帐号为空')

        if (self.SubAccountToken == ""):
            print('172009')
            print('子帐号令牌为空')

        if (self.AppId == ""):
            print('172012')
            print('应用ID为空')

    # 主帐号鉴权
    def accAuth(self):
        if (self.ServerIP == ""):
            print('172004')
            print('IP为空')

        if (int(self.ServerPort) <= 0):
            print('172005')
            print('端口错误(小于等于0)')

        if (self.SoftVersion == ""):
            print('172013')
            print('版本号为空')

        if (self.AccountSid == ""):
            print('172006')
            print('主帐号为空')

        if (self.AccountToken == ""):
            print('172007')
            print('主帐号令牌为空')

        if (self.AppId == ""):
            print('172012')
            print('应用ID为空')

    # 设置包头
    def setHttpHeader(self, req):
        if self.BodyType == 'json':
            req.add_header("Accept", "application/json")
            req.add_header("Content-Type", "application/json;charset=utf-8")

        else:
            req.add_header("Accept", "application/xml")
            req.add_header("Content-Type", "application/xml;charset=utf-8")

 

你可能感兴趣的:(python)