1. 程式人生 > >乾貨 | 如何用 Python 打造一個聊天機器人?【附程式碼】

乾貨 | 如何用 Python 打造一個聊天機器人?【附程式碼】

聊天機器人(Bot) 是一種像 Slack 一樣的實用的互動聊天服務方式。如果你之前從來沒有建立過聊天機器人,那麼這篇文章提供了一個簡單的入門指南,告訴你如何用 Python 結合 Slack API 建立你第一個聊天機器人。

我們通過搭建你的開發環境, 獲得一個 Slack API 的聊天機器人令牌,並用 Pyhon 開發一個簡單聊天機器人。

我們所需的工具

我們的聊天機器人我們將它稱作為“StarterBot”,它需要 Python 和 Slack API。要執行我們的 Python 程式碼,我們需要:

Python 2 或者 Python 3

pip 和 virtualenv 來處理 Python 應用程式依賴關係

一個可以訪問 API 的免費 Slack 賬號,或者你可以註冊一個 Slack Developer Hangout team。

通過 Slack 團隊建立的官方 Python Slack 客戶端程式碼庫

Slack API 測試令牌

當你在本教程中進行構建時,Slack API 文件 是很有用的。

本教程中所有的程式碼都放在 slack-starterbot 公共庫裡,並以 MIT 許可證開源。

搭建我們的環境

我們現在已經知道我們的專案需要什麼樣的工具,因此讓我們來搭建我們所的開發環境吧。首先到終端上(或者 Windows 上的命令提示符)並且切換到你想要儲存這個專案的目錄。在那個目錄裡,建立一個新的 virtualenv 以便和其他的 Python 專案相隔離我們的應用程式依賴關係。

啟用 virtualenv:

你的提示符現在應該看起來如截圖:

已經啟用的starterbot的virtualenv的命令提示符這個官方的 slack 客戶端 API 幫助庫是由 Slack 建立的,它可以通過 Slack 通道傳送和接收訊息。通過這個pip 命令安裝 slackclient 庫:

當 pip 命令完成時,你應該看到類似這樣的輸出,並返回提示符。

在已經啟用的virtualenv用pip安裝slackclient的輸出我們也需要為我們的Slack專案獲得一個訪問令牌,以便我們的聊天機器人可以用它來連線到Slack API。

Slack 實時訊息傳遞(RTM)API

Slack 允許程式通過一個 Web API 來訪問他們的訊息傳遞通道。去這個 Slack Web API 頁面 註冊建立你自己的 Slack 專案。你也可以登入一個你擁有管理許可權的已有賬號。

使用 Web API頁面的右上角登入按鈕登入後你會到達 聊天機器人使用者頁面。

定製聊天機器人使用者頁面給你的聊天機器人起名為“starterbot”然後點選 “Add bot integration” 按鈕。

新增一個bot integration 並起名為“starterbot”這個頁面將重新載入,你將看到一個新生成的訪問令牌。你還可以將標誌改成你自己設計的。例如我給的這個“Full Stack Python”標誌。

為你的新 Slack 聊天機器人複製和貼上訪問令牌在頁面底部點選“Save Integration”按鈕。你的聊天機器人現在已經準備好連線 Slack API。

Python 開發人員的一個常見的做法是以環境變數輸出祕密令牌。輸出的Slack令牌名字為SLACK_BOT_TOKEN:

好了,我們現在得到了將這個 Slack API 用作聊天機器人的授權。

我們建立聊天機器人還需要更多資訊:我們的聊天機器人的 ID。接下來我們將會寫一個簡短的指令碼,從 Slack API 獲得該 ID。

獲得我們聊天機器人的 ID

這是最後寫一些 Python 程式碼的時候了! 我們編寫一個簡短的 Python 指令碼獲得 StarterBot 的 ID 來熱身一下。這個 ID 基於 Slack 專案而不同。

我們需要該ID,當解析從Slack RTM上發給StarterBot的訊息時,它用於對我們的應用驗明正身。我們的指令碼也會測試我們SLACK_BOT_TOKEN環境變數是否設定正確。

建立一個命名為printbotid.py的新檔案,並且填入下面的程式碼:

我們的程式碼匯入SlackClient,並用我們設定的環境變數SLACK_BOT_TOKEN例項化它。 當該指令碼通過python命令執行時,我們通過會訪問Slack API列出所有的 Slack 使用者並且獲得匹配一個名字為“satrterbot”的ID。

這個獲得聊天機器人的ID的指令碼我們僅需要執行一次。

當它執行為我們提供了聊天機器人的ID時,指令碼會打印出簡單的一行輸出。

在你的Slack 專案中用Python指令碼列印Slack聊天機器人的ID複製這個指令碼打印出的唯一ID。並將該ID作為一個環境變數BOT_ID輸出。

這個指令碼僅僅需要執行一次來獲得聊天機器人的ID。 我們現在可以在我們的執行StarterBot的Python應用程式中使用這個ID。

編碼我們的 StarterBot

現在我們擁有了寫我們的StarterBot程式碼所需的一切。 建立一個新檔案命名為starterbot.py,它包括以下程式碼。

對os和SlackClient的匯入我們看起來很熟悉,因為我們已經在theprintbotid.py中用過它們了。

通過我們匯入的依賴包,我們可以使用它們獲得環境變數值,並例項化Slack客戶端。

該程式碼通過我們以輸出的環境變數SLACK_BOT_TOKEN 例項化SlackClient`客戶端。

Slack 客戶端會連線到 Slack RTM API WebSocket,然後當解析來自 firehose 的訊息時會不斷迴圈。如果有任何發給 StarterBot 的訊息,那麼一個被稱作 handle_command 的函式會決定做什麼。

接下來新增兩個函式來解析 Slack 的輸出並處理命令。

parse_slack_output 函式從 Slack 接受資訊,並且如果它們是發給我們的 StarterBot 時會作出判斷。訊息以一個給我們的聊天機器人 ID 的直接命令開始,然後交由我們的程式碼處理。目前只是通過 Slack 管道釋出一個訊息回去告訴使用者去多寫一些 Python 程式碼!

這是整個程式組合在一起的樣子 (你也可以 在 GitHub 中檢視該檔案):

現在我們的程式碼已經有了,我們可以通過 python starterbot.py 來執行我們 StarterBot 的程式碼了。

當 StarterBot 開始執行而且連線到 API 的輸出通道在 Slack 中建立新通道,並且把 StarterBot 邀請進來,或者把 StarterBot 邀請進一個已經存在的通道中。

在Slack介面建立一個新通道並且邀請 StarterBot現在在你的通道中給 StarterBot 發命令。

在你的Slack通道里給你的 StarterBot 發命令如果你從聊天機器人得到的響應中遇見問題,你可能需要做一個修改。正如上面所寫的這個教程,其中一行AT_BOT = “:”,在“@starter”(你給你自己的聊天機器人起的名字)後需要一個冒號。從 AT_BOT 字串後面移除:。Slack 似乎需要在@ 一個人名後加一個冒號,但這好像是有些不協調的。

結束

好吧,你現在已經獲得一個簡易的聊天機器人,你可以在程式碼中很多地方加入你想要建立的任何特性。

我們能夠使用 Slack RTM API 和 Python 完成很多功能。看看通過這些文章你還可以學習到什麼:

附加一個持久的關係資料庫 或者 NoSQL 後端 比如 PostgreSQL、MySQL 或者 SQLite ,來儲存和檢索使用者資料

新增另外一個與聊天機器人互動的通道,比如 簡訊 或者電話呼叫

整合其它的 web API,比如 GitHub、Twilio 或者 api.ai

原文:fullstackpython.com

譯文:http://linux.cn

譯者:jiajia9linuxer

來源:Python開發

End