天天看點

Python+Slack API 如何實作聊天機器人

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

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 項目相隔離我們的應用程式依賴關系。

Python+Slack API 如何實作聊天機器人

激活 virtualenv:

Python+Slack API 如何實作聊天機器人

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

Python+Slack API 如何實作聊天機器人

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

Python+Slack API 如何實作聊天機器人

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

Python+Slack API 如何實作聊天機器人

在已經激活的virtualenv用pip安裝slackclient的輸出我們也需要為我們的Slack項目獲得一個通路令牌,以便我們的聊天機器人可以用它來連接配接到Slack API。

Slack 實時消息傳遞(RTM)API

Slack 允許程式通過一個 Web API 來通路他們的消息傳遞通道。去這個 Slack Web API 頁面 注冊建立你自己的 Slack 項目。你也可以登入一個你擁有管理權限的已有賬号。

Python+Slack API 如何實作聊天機器人

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

Python+Slack API 如何實作聊天機器人

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

Python+Slack API 如何實作聊天機器人

添加一個bot integration 并起名為“starterbot”這個頁面将重新加載,你将看到一個新生成的通路令牌。你還可以将标志改成你自己設計的。例如我給的這個“Full Stack Python”标志。

Python+Slack API 如何實作聊天機器人

為你的新 Slack 聊天機器人複制和粘貼通路令牌在頁面底部點選“Save Integration”按鈕。你的聊天機器人現在已經準備好連接配接 Slack API。

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

Python+Slack API 如何實作聊天機器人

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

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

獲得我們聊天機器人的 ID

這是最後寫一些 Python 代碼的時候了! 我們編寫一個簡短的 Python 腳本獲得 StarterBot 的 ID 來熱身一下。這個 ID 基于 Slack 項目而不同。

我們需要該ID,當解析從Slack RTM上發給StarterBot的消息時,它用于對我們的應用驗明正身。我們的腳本也會測試我們SLACK_BOT_TOKEN環境變量是否設定正确。

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

Python+Slack API 如何實作聊天機器人
import os
from slackclient import SlackClient
BOT_NAME = 'ctrebot'
slack_client = SlackClient(os.environ.get('SLACK_BOT_TOKEN'))
if __name__ == "__main__":
    api_call = slack_client.api_call("users.list")
    if api_call.get('ok'):
        # retrieve all users so we can find our bot
        users = api_call.get('members')
        for user in users:
            if 'name' in user and user.get('name') == BOT_NAME:
                print("Bot ID for '" + user['name'] + "' is " + user.get('id'))
    else:
        print("could not find bot user with the name " + BOT_NAME)      

我們的代碼導入SlackClient,并用我們設定的環境變量SLACK_BOT_TOKEN執行個體化它。 當該腳本通過python指令執行時,我們通過會通路Slack API列出所有的 Slack 使用者并且獲得比對一個名字為“satrterbot”的ID。

這個獲得聊天機器人的ID的腳本我們僅需要運作一次。

Python+Slack API 如何實作聊天機器人

當它運作為我們提供了聊天機器人的ID時,腳本會列印出簡單的一行輸出。

Python+Slack API 如何實作聊天機器人

在你的Slack 項目中用Python腳本列印Slack聊天機器人的ID複制這個腳本列印出的唯一ID。并将該ID作為一個環境變量BOT_ID輸出。

Python+Slack API 如何實作聊天機器人

這個腳本僅僅需要運作一次來獲得聊天機器人的ID。 我們現在可以在我們的運作StarterBot的Python應用程式中使用這個ID。

編碼我們的 StarterBot

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

Python+Slack API 如何實作聊天機器人

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

通過我們導入的依賴包,我們可以使用它們獲得環境變量值,并執行個體化Slack用戶端。

Python+Slack API 如何實作聊天機器人

該代碼通過我們以輸出的環境變量SLACK_BOT_TOKEN 執行個體化SlackClient`用戶端。

Python+Slack API 如何實作聊天機器人

Slack 用戶端會連接配接到 Slack RTM API WebSocket,然後當解析來自 firehose 的消息時會不斷循環。如果有任何發給 StarterBot 的消息,那麼一個被稱作 handle_command 的函數會決定做什麼。

接下來添加兩個函數來解析 Slack 的輸出并處理指令。

Python+Slack API 如何實作聊天機器人

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

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

Python+Slack API 如何實作聊天機器人
Python+Slack API 如何實作聊天機器人

現在我們的代碼已經有了,我們可以通過 python starterbot.py 來運作我們 StarterBot 的代碼了。

Python+Slack API 如何實作聊天機器人

當 StarterBot 開始運作而且連接配接到 API 的輸出通道在 Slack 中建立新通道,并且把 StarterBot 邀請進來,或者把 StarterBot 邀請進一個已經存在的通道中。

Python+Slack API 如何實作聊天機器人

在Slack界面建立一個新通道并且邀請 StarterBot現在在你的通道中給 StarterBot 發指令。

Python+Slack API 如何實作聊天機器人

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

結束

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

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

  • 附加一個持久的關系資料庫 或者 NoSQL 後端 比如 PostgreSQL、MySQL 或者 SQLite ,來儲存和檢索使用者資料
  • 添加另外一個與聊天機器人互動的通道,比如 短信 或者電話呼叫
  • 內建其它的 web API,比如 GitHub、Twilio 或者 api.ai