Python调用阿里云呼叫中心

前言

在工作中需要接入一个外呼平台,之前接过一个小公司的外呼,无论是文档还是鉴权都存在着不少的问题,通话记录的获取则需要使用RabbitMQ实现延迟队列来获取,存在着不稳定的问题。在使用了一周之后客户想要打哪显哪的功能,就指名使用阿里云云呼叫中心。

起初,看见阿里云上完善的文档,以及openAPI的在线测试,觉得这个应该是一件很轻松的事情。满心欢喜的就接上了这活,在开发过程以及不断阅读文档的过程中,发现阿里云上的SDK对Python很是不友好,尤其是aliyun-open-sdk-ccc这个用于云呼叫中心的SDK,作用极其有限。

由于开发过程中发现网上几乎没有Python调用阿里云呼叫中心的博客,而且太多博客都是重复或者语焉不详。所以斗胆自己写一篇。

AK or BEARERTOKEN

AK

AK代表可以使用云呼叫中心的SDK使用AK请求。看上去还是挺方便,只需要提供阿里云子账户的AK和AK secret,这些请求代码几乎可以直接copy阿里云上OpenAPI的在线调试工具上的代码就能实现了。

但是实际使用过程中,发现这里面的坑着实不小。

首先如前言中的图所示,接口的调用仅部分能通过AK+aliyun-open-sdk-ccc调用,对于不支持这种方式认证的接口,会直接报出403的错误。其次,有很多文档中提及到的接口,如ListOutboundPhoneNumberOfUser等不少接口,在SDK中已经找不到了,如果按照OpenAPI的调用代码,导入时会报错。

BEARERTOKEN

初看文档时,被使用BEARERTOKEN的步骤给吓到了,所以选择跳入了SDK的坑。

首先文档中会说到要使用OAuth2单点登录,第一眼看到时就觉得很复杂。

demo还只有Java的,可见阿里云对Java的使用度远远大于Python。文档地址

第一步 获取授权码

在这一步中没什么坑,只需要照着文档,向目标URL发起请求即可。需注意的是redirect_uri需要提前配置在创建的云呼叫中心应用中。然后使用创建的应用的ID请求即可返回到redirect_uri并在路径中添加了code授权码。

第二步 获取Token

照着文档即可。(阿里云的这些文档还是挺好的)

此处的Token返回有两种,一种是access_token用于登录,一种是refresh_token

这个时候就会有一个关于access_token的问题,后文会提及到。

access_token是用来调用API时验证身份的,时限有限一般在1-3个小时。refresh_token的时限较长,一般1-2年,当access_token过期后,用该token再去请求回新的access_token

以上两步为关键的获取BEARERTOKEN的步骤。不知道该说阿里的鉴权优秀还是说太过麻烦了。

使用AK

使用AK太多问题了。不仅是创建时必须记录好Access_Key_Secret,调用接口的范围很小,太多接口无法使用。已放弃,如果有大佬发现了Python使用该SDK能带着Token去请求的话,希望能分享一下。

使用BEAERTOKEN

在经历了一周对SDK的阅读之后,放弃了使用云呼叫中心的SDK,而是使用Python的基础SDK中的CommonRequest自己向阿里云的接口发起请求。

如何使用BEARERTOKEN

最开始,我以为只需要将获取到的access_token代入进请求中即可,后来发现是我自己对文档的阅读不够仔细。

access_token是一组进行过URLBase64加密的字符串,使用时需要将其解码。


def base64_url_decode(inp):
    padding_factor = (4 - len(inp) % 4) % 4
    inp += "=" * padding_factor
    return base64.b64decode(unicode(inp).translate(dict(zip(map(ord, u'-_'), u'+/'))))

解码之后即可发现,access_token其实是由一组access_key_idaccess_key_secret以及security_token组成的。

构建请求

from aliyunsdkcore.request import CommonRequest
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.acs_exception.exceptions import ClientException
request = CommonRequest()
request.set_domain("ccc.cn-shanghai.aliyuncs.com")
request.set_version('2017-07-05')
request.set_accept_format('json')

access_key_id = '解码access_token获得'
access_key_secret = '解码access_token获得'
security_token = '解码access_token获得'

client = AcsClient(ak=access_key_id, secret=access_key_secret, region_id='创建呼叫中心实例时选择的')

request.set_action_name('需要发起的请求,对应文档中的请求名')
request.add_query_param('SecurityToken', security_token)
request.add_query_param('请求所需要的字段', '对应字段的值') # 可能会有很多个

response = client.do_action_with_exception(request)

以上就完成了一个基本的请求的构建。

最后

虽然使用了BEARERTOKEN,但有些请求确实已经从阿里云上移除了,调用的时候会报出404的错误。希望阿里996的工程师们抽空还是更新一下文档吧

你可能感兴趣的:(Python调用阿里云呼叫中心)