從零開始微信機(jī)器人(二):使用圖靈機(jī)器人和api.ai相關(guān)接口

圖靈機(jī)器人相關(guān)接口

圖靈機(jī)器人是一個(gè)中文語境下的對話機(jī)器人,免費(fèi)的機(jī)器人每天有5000次調(diào)用的私恬,如果放在群聊中是完全夠用的(如果只有@的消息才使用機(jī)器人回復(fù)的)。圖靈機(jī)器人也包括一些簡單的能力谒麦,比如講笑話峻仇、故事大全公黑、成語接龍、新聞資訊等摄咆,我們將介紹如何簡單調(diào)用圖靈機(jī)器人接口凡蚜。

前期準(zhǔn)備

  1. 前往注冊圖靈機(jī)器人,增加一個(gè)機(jī)器人吭从,并記錄機(jī)器人的APIKey朝蜘。具體注冊方法可以前往圖靈API查看。(如果你覺得很麻煩涩金, 也可以暫時(shí)使用itchat提供的幾個(gè)key

  2. 安裝Requests: HTTP for Humans

    # 從 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)備

  1. 前往api.ai注冊兰伤,創(chuàng)建機(jī)器人,并獲得APIkey钧排。雖然被谷歌收購敦腔,但是這個(gè)網(wǎng)站是不需要翻墻的哦!

  2. 安裝api.ai官方提供的Python SDK

    pip install apiai
    
  3. 在文件頭部加入(處理返回的消息時(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 ̄)づ╭?~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末亡笑,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子横朋,更是在濱河造成了極大的恐慌仑乌,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異绝骚,居然都是意外死亡耐版,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進(jìn)店門压汪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來粪牲,“玉大人,你說我怎么就攤上這事止剖∠傺簦” “怎么了?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵穿香,是天一觀的道長亭引。 經(jīng)常有香客問我,道長皮获,這世上最難降的妖魔是什么焙蚓? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮洒宝,結(jié)果婚禮上购公,老公的妹妹穿的比我還像新娘。我一直安慰自己雁歌,他們只是感情好宏浩,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著靠瞎,像睡著了一般比庄。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上乏盐,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天佳窑,我揣著相機(jī)與錄音,去河邊找鬼丑勤。 笑死华嘹,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的法竞。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼强挫,長吁一口氣:“原來是場噩夢啊……” “哼岔霸!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起俯渤,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤呆细,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后八匠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體絮爷,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡趴酣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了坑夯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片岖寞。...
    茶點(diǎn)故事閱讀 38,163評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖柜蜈,靈堂內(nèi)的尸體忽然破棺而出仗谆,到底是詐尸還是另有隱情,我是刑警寧澤淑履,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布隶垮,位于F島的核電站,受9級特大地震影響秘噪,放射性物質(zhì)發(fā)生泄漏狸吞。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一指煎、第九天 我趴在偏房一處隱蔽的房頂上張望蹋偏。 院中可真熱鬧,春花似錦贯要、人聲如沸暖侨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽字逗。三九已至,卻和暖如春宅广,著一層夾襖步出監(jiān)牢的瞬間葫掉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工跟狱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留俭厚,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓驶臊,卻偏偏與公主長得像挪挤,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子关翎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理扛门,服務(wù)發(fā)現(xiàn),斷路器纵寝,智...
    卡卡羅2017閱讀 134,601評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,527評論 25 707
  • 點(diǎn)擊查看原文 Web SDK 開發(fā)手冊 SDK 概述 網(wǎng)易云信 SDK 為 Web 應(yīng)用提供一個(gè)完善的 IM 系統(tǒng)...
    layjoy閱讀 13,677評論 0 15
  • 半年了论寨,每晚夢境都是對現(xiàn)實(shí)的諷刺,莫詩書看了看手表,八點(diǎn)半葬凳,她還有個(gè)非常重要的面試要準(zhǔn)備绰垂,嘆了嘆氣,生活要繼續(xù)火焰,生...
    唐遇嘉閱讀 164評論 0 0
  • 1 四月中旬的黃昏劲装,剛剛下過雨,空氣中彌漫著樹葉和泥土的紛香荐健。草叢里的蝸牛緩緩地邁著輕快的步伐酱畅,這清新的空氣在這座...
    衫衫一夢閱讀 592評論 10 6