前言
在工作中需要接入一個(gè)外呼平臺(tái)术裸,之前接過一個(gè)小公司的外呼,無論是文檔還是鑒權(quán)都存在著不少的問題亭枷,通話記錄的獲取則需要使用RabbitMQ實(shí)現(xiàn)延遲隊(duì)列來獲取袭艺,存在著不穩(wěn)定的問題。在使用了一周之后客戶想要打哪顯哪的功能叨粘,就指名使用阿里云云呼叫中心猾编。
起初,看見阿里云上完善的文檔升敲,以及openAPI的在線測試答倡,覺得這個(gè)應(yīng)該是一件很輕松的事情。滿心歡喜的就接上了這活驴党,在開發(fā)過程以及不斷閱讀文檔的過程中瘪撇,發(fā)現(xiàn)阿里云上的SDK對(duì)Python很是不友好,尤其是aliyun-open-sdk-ccc這個(gè)用于云呼叫中心的SDK港庄,作用極其有限倔既。
由于開發(fā)過程中發(fā)現(xiàn)網(wǎng)上幾乎沒有Python調(diào)用阿里云呼叫中心的博客,而且太多博客都是重復(fù)或者語焉不詳鹏氧。所以斗膽自己寫一篇渤涌。
AK or BEARERTOKEN
AK
AK代表可以使用云呼叫中心的SDK使用AK請(qǐng)求“鸦梗看上去還是挺方便实蓬,只需要提供阿里云子賬戶的AK和AK secret茸俭,這些請(qǐng)求代碼幾乎可以直接copy阿里云上OpenAPI的在線調(diào)試工具上的代碼就能實(shí)現(xiàn)了。
但是實(shí)際使用過程中安皱,發(fā)現(xiàn)這里面的坑著實(shí)不小调鬓。
首先如前言中的圖所示,接口的調(diào)用僅部分能通過AK+aliyun-open-sdk-ccc調(diào)用练俐,對(duì)于不支持這種方式認(rèn)證的接口袖迎,會(huì)直接報(bào)出403的錯(cuò)誤。其次腺晾,有很多文檔中提及到的接口,如ListOutboundPhoneNumberOfUser
等不少接口辜贵,在SDK中已經(jīng)找不到了悯蝉,如果按照OpenAPI的調(diào)用代碼,導(dǎo)入時(shí)會(huì)報(bào)錯(cuò)托慨。
BEARERTOKEN
初看文檔時(shí)鼻由,被使用BEARERTOKEN的步驟給嚇到了,所以選擇跳入了SDK的坑厚棵。
首先文檔中會(huì)說到要使用OAuth2單點(diǎn)登錄蕉世,第一眼看到時(shí)就覺得很復(fù)雜。
demo還只有Java的婆硬,可見阿里云對(duì)Java的使用度遠(yuǎn)遠(yuǎn)大于Python狠轻。文檔地址
第一步 獲取授權(quán)碼
在這一步中沒什么坑,只需要照著文檔彬犯,向目標(biāo)URL發(fā)起請(qǐng)求即可向楼。需注意的是redirect_uri
需要提前配置在創(chuàng)建的云呼叫中心應(yīng)用中。然后使用創(chuàng)建的應(yīng)用的ID請(qǐng)求即可返回到redirect_uri
并在路徑中添加了code
授權(quán)碼谐区。
第二步 獲取Token
照著文檔即可湖蜕。(阿里云的這些文檔還是挺好的)
此處的Token返回有兩種,一種是access_token
用于登錄宋列,一種是refresh_token
昭抒。
這個(gè)時(shí)候就會(huì)有一個(gè)關(guān)于access_token
的問題,后文會(huì)提及到炼杖。
access_token
是用來調(diào)用API時(shí)驗(yàn)證身份的灭返,時(shí)限有限一般在1-3個(gè)小時(shí)。refresh_token
的時(shí)限較長嘹叫,一般1-2年婆殿,當(dāng)access_token
過期后,用該token再去請(qǐng)求回新的access_token
罩扇。
以上兩步為關(guān)鍵的獲取BEARERTOKEN的步驟婆芦。不知道該說阿里的鑒權(quán)優(yōu)秀還是說太過麻煩了怕磨。
使用AK
使用AK太多問題了。不僅是創(chuàng)建時(shí)必須記錄好Access_Key_Secret消约,調(diào)用接口的范圍很小肠鲫,太多接口無法使用。已放棄或粮,如果有大佬發(fā)現(xiàn)了Python使用該SDK能帶著Token去請(qǐng)求的話导饲,希望能分享一下。
使用BEAERTOKEN
在經(jīng)歷了一周對(duì)SDK的閱讀之后氯材,放棄了使用云呼叫中心的SDK渣锦,而是使用Python的基礎(chǔ)SDK中的CommonRequest
自己向阿里云的接口發(fā)起請(qǐng)求。
如何使用BEARERTOKEN
最開始氢哮,我以為只需要將獲取到的access_token
代入進(jìn)請(qǐng)求中即可袋毙,后來發(fā)現(xiàn)是我自己對(duì)文檔的閱讀不夠仔細(xì)。
access_token
是一組進(jìn)行過URLBase64
加密的字符串冗尤,使用時(shí)需要將其解碼听盖。
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>
解碼之后即可發(fā)現(xiàn),access_token
其實(shí)是由一組access_key_id
裂七、access_key_secret
以及security_token
組成的皆看。
構(gòu)建請(qǐng)求
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='創(chuàng)建呼叫中心實(shí)例時(shí)選擇的')
request.set_action_name('需要發(fā)起的請(qǐng)求,對(duì)應(yīng)文檔中的請(qǐng)求名')
request.add_query_param('SecurityToken', security_token)
request.add_query_param('請(qǐng)求所需要的字段', '對(duì)應(yīng)字段的值') # 可能會(huì)有很多個(gè)
response = client.do_action_with_exception(request)
以上就完成了一個(gè)基本的請(qǐng)求的構(gòu)建背零。
最后
雖然使用了BEARERTOKEN,但有些請(qǐng)求確實(shí)已經(jīng)從阿里云上移除了腰吟,調(diào)用的時(shí)候會(huì)報(bào)出404的錯(cuò)誤。希望阿里996的工程師們抽空還是更新一下文檔吧