圖靈機(jī)器人相關(guān)接口
圖靈機(jī)器人是一個(gè)中文語境下的對話機(jī)器人,免費(fèi)的機(jī)器人每天有5000次調(diào)用的私恬,如果放在群聊中是完全夠用的(如果只有@的消息才使用機(jī)器人回復(fù)的)。圖靈機(jī)器人也包括一些簡單的能力谒麦,比如講笑話峻仇、故事大全公黑、成語接龍、新聞資訊等摄咆,我們將介紹如何簡單調(diào)用圖靈機(jī)器人接口凡蚜。
前期準(zhǔn)備
前往注冊圖靈機(jī)器人,增加一個(gè)機(jī)器人吭从,并記錄機(jī)器人的APIKey朝蜘。具體注冊方法可以前往圖靈API查看。(如果你覺得很麻煩涩金, 也可以暫時(shí)使用itchat提供的幾個(gè)key)
-
# 從 pip 安裝 () pip install requests
并在機(jī)器人中導(dǎo)入Requests包(寫在程序最初):
import requests
調(diào)用接口
wxpy提供了圖靈的接口谱醇,使用方法:
tuling = Tuling(api_key='Your API Key') # 剛才申請的key
@bot.register(my_friend) # 注冊消息
def reply_my_friend(msg):
tuling.do_reply(msg)
為了讓大家了解HTTP協(xié)議在python中的使用方式暇仲,我接下來會介紹如何使用請求獲取信息。
本節(jié)中內(nèi)容如果沒有特殊提示副渴,都應(yīng)寫在你希望處理的某種注冊了的消息方法中以保證它的正常運(yùn)作熔吗。
首先,將圖靈API寫入程序中:
TULING_TOKEN = 'Your API Key'
然后佳晶,定義接口鏈接和需要傳輸?shù)臄?shù)據(jù):
url_api = 'http://www.tuling123.com/openapi/api'
data = {
'key' : TULING_TOKEN,
'info' : msg.text, # 收到消息的文字內(nèi)容
}
根據(jù)文檔桅狠,通過HTTP請求,我們將會得到一個(gè)json格式的文件轿秧。使用Requests包中跌,我們可以簡單的獲得調(diào)用接口所返回的信息:
s = requests.post(url_api, data=data).json()
print s # 打印所獲得的json查看如何使用
# {u'text': u'回復(fù)的內(nèi)容', u'code': 100000}
我們發(fā)現(xiàn)經(jīng)過請求,我們一般會得到一個(gè)字典內(nèi)容菇篡,其中包括text和code兩項(xiàng):text是圖靈機(jī)器人回復(fù)的文本漩符,而code是返回的編號。詳細(xì)的返回?cái)?shù)據(jù)格式也可以在圖靈API中看到驱还,除了文字類還有新聞?lì)愂缺D片類、鏈接類等返回類型议蟆。在這里我們以文字類為例闷沥,介紹如何處理:
if s['code'] == 100000:
print s['text'] # 查看回復(fù)消息的內(nèi)容,可省略
msg.reply(s['text']) # 回復(fù)消息
如果需要回復(fù)其他類型的消息咐容,也完全可以通過判斷code確定消息類型舆逃,再決定如何回復(fù)。這里給出我的回復(fù)方法供大家參考(也可以選擇不處理這一類內(nèi)容):
if s['code'] == 200000: # 鏈接類:回復(fù)文字和鏈接
msg.reply(s['text'] + s['url'])
至此戳粒,我們已經(jīng)成功調(diào)用了圖靈機(jī)器人的API接口進(jìn)行回復(fù)路狮,完整程序如下:
# -*- coding: utf-8 -*-
from wxpy import *
import requests
TULING_TOKEN = 'Your API Key'
bot = Bot()
@bot.register(Group, TEXT) # 這里注冊了群聊中的文字消息,測試時(shí)可以設(shè)置為自己(上篇中提到過)
def group_msg(msg):
if msg.is_at:
url_api = 'http://www.tuling123.com/openapi/api'
data = {
'key' : TULING_TOKEN,
'info' : msg.text, # 收到消息的文字內(nèi)容
}
s = requests.post(url_api, data=data).json()
print s # 打印所獲得的json查看如何使用
if s['code'] == 100000:
print s['text'] # 查看回復(fù)消息的內(nèi)容蔚约,可省略
msg.reply(s['text']) # 回復(fù)消息
embed()
以下內(nèi)容更加進(jìn)階奄妨,而文末有一些簡單問題的解答。如果遇到其他問題苹祟,我也會在之后更新砸抛。
番外:使用上下文
wxpy給每個(gè)用戶定義了一個(gè)相對穩(wěn)定的對象/用戶id,為puid苔咪,可以始終被獲取到并有唯一的穩(wěn)定性(根據(jù)文檔)锰悼,我們可以使用這個(gè)id來作為userid傳給圖靈機(jī)器人,以方便識別機(jī)器人或航班/列成信息的上下文团赏。
bot.enable_puid() # puid 需要手動(dòng)開啟箕般,請將這句話寫在登陸登錄之后
這樣傳送給接口的數(shù)據(jù)也要同時(shí)修改為:
data = {
'key' : TULING_TOKEN,
'info' : msg.text, # 收到消息的文字內(nèi)容
'userid' : msg.member.puid, # 使用群聊中發(fā)送者的 puid 作為 userid 傳送給圖靈接口, 如果是私聊可以使用 msg.sender.puid
}
這樣做的好處是舔清,圖靈機(jī)器人可以根據(jù)得userid來獲取上下文信息丝里。例如你詢問『天氣』曲初,它會回復(fù)『親愛的,悄悄地告訴我你在哪個(gè)城市杯聚?』臼婆。在這種情況下,如果你不使用userid參數(shù)幌绍,你再次回復(fù)城市颁褂,圖靈機(jī)器人也無法正確找到天氣;如果你使用了這一參數(shù)傀广,且兩次回復(fù)使用的userid相同颁独,圖靈機(jī)器人會為你回復(fù)你回復(fù)的城市的天氣情況,完成這一對話伪冰。
使用api.ai
api.ai是一家被谷歌收購的人機(jī)交互系統(tǒng)誓酒,主要著重于對話機(jī)器人的開發(fā)。圖靈機(jī)器人雖然包括一個(gè)知識庫贮聂,但其語義識別的能力較差靠柑。我所需要的機(jī)器人主要用于新生群,很多問題人與人之間會有相當(dāng)多不同的表達(dá)吓懈,圖靈機(jī)器人無法滿足我對于群聊機(jī)器人的要求歼冰。因此,我嘗試使用api.ai進(jìn)行回復(fù)有針對性的一些問題骄瓣。
如果你的英語相對糟糕停巷,我不建議使用api.ai。api.ai的配置大多需要使用英語榕栏,雖然接口簡單,但是后臺設(shè)置相對復(fù)雜蕾各,如果沒有英文背景不推薦使用扒磁。
這一部分內(nèi)容相對進(jìn)階,如果沒有特殊需要式曲,完全可以跳過不看妨托。這里只作一個(gè)對api.ai使用方式上大體的介紹,希望能幫助大家了解這一網(wǎng)站吝羞。
前期準(zhǔn)備
前往api.ai注冊兰伤,創(chuàng)建機(jī)器人,并獲得APIkey钧排。雖然被谷歌收購敦腔,但是這個(gè)網(wǎng)站是不需要翻墻的哦!
-
安裝api.ai官方提供的Python SDK
pip install apiai
-
在文件頭部加入(處理返回的消息時(shí)使用)
import json
調(diào)用接口
首先恨溜,我們需要設(shè)置api.ai的Token符衔,
APIAI_TOKEN = 'Your API Key'
而后我們發(fā)起一個(gè)最簡單的請求找前,一下內(nèi)容都可以通過例子找到:
ai = apiai.ApiAI(APIAI_TOKEN)
request = ai.text_request()
request.lang = 'zh-CN' # 使用中文
request.session_id = msg.member.puid # api.ai 中用 session id 來區(qū)分對話對象,必須
request.query = msg.text # 消息文字內(nèi)容
然后通過接口得到傳回的json:
response = request.getresponse()
s = json.loads(response.read(), encoding='UTF-8') # 講傳回的json轉(zhuǎn)換為python字典
print s
# {u'lang': u'zh-cn', u'status': {u'errorType': u'success', u'code': 200}, u'timestamp': u'20}
我們發(fā)現(xiàn)判族,api.ai傳回的json相對于圖靈機(jī)器人更加復(fù)雜躺盛。參考api.ai的query文檔,我對對這部分回復(fù)進(jìn)行了如下處理:
if s['result']['action'] == 'input.unknown': #
raise Exception('api.ai cannot reply this message') # 拋出異常:使用 try 語句捕捉后使用圖靈機(jī)器人回復(fù)
if s['status']['code'] == 200:
msg.reply(s['result']['fulfillment']['speech']) # 回復(fù) api.ai 返回的內(nèi)容
api.ai的設(shè)置和調(diào)試
在進(jìn)入api.ai的機(jī)器人后形帮,你將會看到左邊的多個(gè)菜單槽惫。
如果你只是簡單的需要特定語句回復(fù)的功能,只需要?jiǎng)?chuàng)建并設(shè)置Intents就可以實(shí)現(xiàn)辩撑。在User Says一欄中填寫消息可能是什么躯枢,在下方Response處填寫可能回復(fù)的內(nèi)容,然后保存即可槐臀。
api.ai自帶機(jī)器學(xué)習(xí)功能锄蹂,它的參數(shù)可以在機(jī)器人設(shè)置中的ML settings里找到∷可以通過調(diào)整參數(shù)和方式讓你的機(jī)器人回復(fù)更加準(zhǔn)確得糜。
在進(jìn)入機(jī)器人后,api.ai的右側(cè)會出現(xiàn)一個(gè)對話框晰洒。你可以使用它進(jìn)行一些基礎(chǔ)調(diào)試朝抖。在上方輸入你的消息后,下方會給出機(jī)器人的回復(fù)谍珊,你可以通過這個(gè)對話框來了解是否正確設(shè)置了機(jī)器人治宣。(需要翻墻)
你可能會遇到的一些問題
報(bào)錯(cuò):No handlers could be found for logger "wxpy.api.bot"
有報(bào)錯(cuò)但是無法顯示,可以選擇在代碼頭部加入:
import logging
logging.basicConfig()
消息處理:刪除@內(nèi)容
如果不刪除消息中@部分的內(nèi)容砌滞,圖靈機(jī)器人的回復(fù)可能會受到昵稱內(nèi)容的影響侮邀,導(dǎo)致回復(fù)不準(zhǔn)確,或是識別不出一些應(yīng)當(dāng)識別出的內(nèi)容贝润。我們可以用一段簡單的代碼刪除@到空格之間的內(nèi)容并去除首尾多余的空格绊茧。
content = re.sub('@[^\s]*', '', unicodedata.normalize('NFKC', msg.text)).strip().encode('utf-8')
這里使用了正則表達(dá)式,匹配@以及它之后所有不為空的字符打掘。如果你的微信昵稱中沒有空白字符华畏,這條代碼是可行的。(需要在代碼開頭添加import re
)
機(jī)器人代碼
我的微信機(jī)器人的代碼在GitHub托管尊蚁,歡迎查看(づ ̄3 ̄)づ╭?~