前言
在工作中需要接入一个外呼平台,之前接过一个小公司的外呼,无论是文档还是鉴权都存在着不少的问题,通话记录的获取则需要使用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'+/'))))</pre>
解码之后即可发现,access_token
其实是由一组access_key_id
、access_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的工程师们抽空还是更新一下文档吧