如何運用 Python 建立你的第一個 Slack 聊天機器人?
聊天機器人(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:
source starterbot/bin/activate
你的提示符現在應該看起來如截圖:
這個官方的 slack 客戶端 API 幫助庫是由 Slack 建立的,它可以通過 Slack 通道傳送和接收訊息。通過這個 pip
命令安裝 slackclient 庫:
pip install slackclient
當 pip
命令完成時,你應該看到類似這樣的輸出,並返回提示符。
我們也需要為我們的 Slack 專案獲得一個訪問令牌,以便我們的聊天機器人可以用它來連線到 Slack API。
Slack 實時訊息傳遞(RTM)API
Slack 允許程式通過一個 Web API 來訪問他們的訊息傳遞通道。去這個 Slack Web API 頁面 註冊建立你自己的 Slack 專案。你也可以登入一個你擁有管理許可權的已有賬號。
登入後你會到達 聊天機器人使用者頁面。
給你的聊天機器人起名為“starterbot”然後點選 “Add bot integration” 按鈕。
這個頁面將重新載入,你將看到一個新生成的訪問令牌。你還可以將標誌改成你自己設計的。例如我給的這個“Full Stack Python”標誌。
在頁面底部點選“Save Integration”按鈕。你的聊天機器人現在已經準備好連線 Slack API。
Python 開發人員的一個常見的做法是以環境變數輸出祕密令牌。輸出的 Slack 令牌名字為SLACK_BOT_TOKEN
:
export SLACK_BOT_TOKEN='你的 slack 令牌粘帖在這裡'
好了,我們現在得到了將這個 Slack API 用作聊天機器人的授權。
我們建立聊天機器人還需要更多資訊:我們的聊天機器人的 ID。接下來我們將會寫一個簡短的指令碼,從 Slack API 獲得該 ID。
獲得我們聊天機器人的 ID
這是最後寫一些 Python 程式碼的時候了! 我們編寫一個簡短的 Python 指令碼獲得 StarterBot 的 ID 來熱身一下。這個 ID 基於 Slack 專案而不同。
我們需要該 ID,當解析從 Slack RTM 上發給 StarterBot 的訊息時,它用於對我們的應用驗明正身。我們的指令碼也會測試我們 SLACK_BOT_TOKEN
環境變數是否設定正確。
建立一個命名為 printbotid.py 的新檔案,並且填入下面的程式碼:
import os
from slackclient import SlackClient
BOT_NAME = 'starterbot'
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 print_bot_id.py
當它執行為我們提供了聊天機器人的 ID 時,指令碼會列印出簡單的一行輸出。
複製這個指令碼列印出的唯一 ID。並將該 ID 作為一個環境變數 BOT_ID
輸出。
(starterbot)$ export BOT_ID='bot id returned by script'
這個指令碼僅僅需要執行一次來獲得聊天機器人的 ID。 我們現在可以在我們的執行 StarterBot 的 Python應用程式中使用這個 ID 。
編碼我們的 StarterBot
現在我們擁有了寫我們的 StarterBot 程式碼所需的一切。 建立一個新檔案命名為 starterbot.py ,它包括以下程式碼。
import os
import time
from slackclient import SlackClient
對 os
和 SlackClient
的匯入我們看起來很熟悉,因為我們已經在 theprintbotid.py 中用過它們了。
通過我們匯入的依賴包,我們可以使用它們獲得環境變數值,並例項化 Slack 客戶端。
# starterbot 的 ID 作為一個環境變數
BOT_ID = os.environ.get("BOT_ID")
# 常量
AT_BOT = "<@" + BOT_ID + ">:"
EXAMPLE_COMMAND = "do"
# 例項化 Slack 和 Twilio 客戶端
slack_client = SlackClient(os.environ.get('SLACK_BOT_TOKEN'))
該程式碼通過我們以輸出的環境變數 SLACK_BOT_TOKEN 例項化
SlackClient` 客戶端。
if __name__ == "__main__":
READ_WEBSOCKET_DELAY = 1 # 1 從 firehose 讀取延遲 1 秒
if slack_client.rtm_connect():
print("StarterBot connected and running!")
while True:
command, channel = parse_slack_output(slack_client.rtm_read())
if command and channel:
handle_command(command, channel)
time.sleep(READ_WEBSOCKET_DELAY)
else:
print("Connection failed. Invalid Slack token or bot ID?")
Slack 客戶端會連線到 Slack RTM API WebSocket,然後當解析來自 firehose 的訊息時會不斷迴圈。如果有任何發給 StarterBot 的訊息,那麼一個被稱作 handle_command
的函式會決定做什麼。
接下來新增兩個函式來解析 Slack 的輸出並處理命令。
def handle_command(command, channel):
"""
Receives commands directed at the bot and determines if they
are valid commands. If so, then acts on the commands. If not,
returns back what it needs for clarification.
"""
response = "Not sure what you mean. Use the *" + EXAMPLE_COMMAND + \
"* command with numbers, delimited by spaces."
if command.startswith(EXAMPLE_COMMAND):
response = "Sure...write some more code then I can do that!"
slack_client.api_call("chat.postMessage", channel=channel,
text=response, as_user=True)
def parse_slack_output(slack_rtm_output):
"""
The Slack Real Time Messaging API is an events firehose.
this parsing function returns None unless a message is
directed at the Bot, based on its ID.
"""
output_list = slack_rtm_output
if output_list and len(output_list) > 0:
for output in output_list:
if output and 'text' in output and AT_BOT in output['text']:
# 返回 @ 之後的文字,刪除空格
return output['text'].split(AT_BOT)[1].strip().lower(), \
output['channel']
return None, None
parse_slack_output
函式從 Slack 接受資訊,並且如果它們是發給我們的 StarterBot 時會作出判斷。訊息以一個給我們的聊天機器人 ID 的直接命令開始,然後交由我們的程式碼處理。目前只是通過 Slack 管道釋出一個訊息回去告訴使用者去多寫一些 Python 程式碼!
這是整個程式組合在一起的樣子 (你也可以 在 GitHub 中檢視該檔案):
import os
import time
from slackclient import SlackClient
# starterbot 的 ID 作為一個環境變數
BOT_ID = os.environ.get("BOT_ID")
# 常量
AT_BOT = "<@" + BOT_ID + ">:"
EXAMPLE_COMMAND = "do"
# 例項化 Slack 和 Twilio 客戶端
slack_client = SlackClient(os.environ.get('SLACK_BOT_TOKEN'))
def handle_command(command, channel):
"""
Receives commands directed at the bot and determines if they
are valid commands. If so, then acts on the commands. If not,
returns back what it needs for clarification.
"""
response = "Not sure what you mean. Use the *" + EXAMPLE_COMMAND + \
"* command with numbers, delimited by spaces."
if command.startswith(EXAMPLE_COMMAND):
response = "Sure...write some more code then I can do that!"
slack_client.api_call("chat.postMessage", channel=channel,
text=response, as_user=True)
def parse_slack_output(slack_rtm_output):
"""
The Slack Real Time Messaging API is an events firehose.
this parsing function returns None unless a message is
directed at the Bot, based on its ID.
"""
output_list = slack_rtm_output
if output_list and len(output_list) > 0:
for output in output_list:
if output and 'text' in output and AT_BOT in output['text']:
# 返回 @ 之後的文字,刪除空格
return output['text'].split(AT_BOT)[1].strip().lower(), \
output['channel']
return None, None
if __name__ == "__main__":
READ_WEBSOCKET_DELAY = 1 # 1 second delay between reading from firehose
if slack_client.rtm_connect():
print("StarterBot connected and running!")
while True:
command, channel = parse_slack_output(slack_client.rtm_read())
if command and channel:
handle_command(command, channel)
time.sleep(READ_WEBSOCKET_DELAY)
else:
print("Connection failed. Invalid Slack token or bot ID?")
現在我們的程式碼已經有了,我們可以通過 python starterbot.py
來執行我們 StarterBot 的程式碼了。
在 Slack 中建立新通道,並且把 StarterBot 邀請進來,或者把 StarterBot 邀請進一個已經存在的通道中。
現在在你的通道中給 StarterBot 發命令。
如果你從聊天機器人得到的響應中遇見問題,你可能需要做一個修改。正如上面所寫的這個教程,其中一行 AT_BOT = "<@" + BOT_ID + ">:"
,在“@starter”(你給你自己的聊天機器人起的名字)後需要一個冒號。從 AT_BOT
字串後面移除:
。Slack 似乎需要在@
一個人名後加一個冒號,但這好像是有些不協調的。
結束
好吧,你現在已經獲得一個簡易的聊天機器人,你可以在程式碼中很多地方加入你想要建立的任何特性。
我們能夠使用 Slack RTM API 和 Python 完成很多功能。看看通過這些文章你還可以學習到什麼:
- 附加一個持久的關聯式資料庫 或者 NoSQL 後端 比如 PostgreSQL、MySQL 或者 SQLite ,來儲存和檢索使用者資料
- 新增另外一個與聊天機器人互動的通道,比如 簡訊 或者電話呼叫
- 整合其它的 web API,比如 GitHub、Twilio 或者 api.ai
有問題? 通過 Twitter 聯絡我 @fullstackpython 或 @mattmakai。 我在 GitHub 上的使用者名稱是 mattmakai。
這篇文章感興趣? Fork 這個 GitHub 上的頁面吧。
via: https://www.fullstackpython.com/blog/build-first-slack-bot-python.html
作者:Matt Makai 譯者:jiajia9llinuxer 校對:wxy
相關文章
- 【掘金小報】 第十五期 用 slack 和 hubot 搭建你自己的運維機器人運維機器人
- 用圖靈機器人實現的兩個機器人對話聊天圖靈機器人
- 定製個機器人幫你和Ta聊天機器人
- 如何用Java寫一個聊天機器人Java機器人
- 使用 python 打造一個微信聊天機器人Python機器人
- 一份產品經理指南:建立你的第一個機器人機器人
- 乾貨 | 如何用 Python 打造一個聊天機器人?【附程式碼】Python機器人
- 用Python基於Google Bard做一個互動式的聊天機器人PythonGo機器人
- 建立聊天機器人,統共分幾步?機器人
- 使用阿里雲ECS建立聊天機器人阿里機器人
- 用 Swift 做一個智慧機器人聊天 App (1)Swift機器人APP
- 用 Swift 做一個智慧機器人聊天 App (2)Swift機器人APP
- 用 Swift 做一個智慧機器人聊天 App (4)Swift機器人APP
- 如何讓聊天機器人懂情感機器人
- 用python玩微信(聊天機器人,好友資訊統計)Python機器人
- Python進階丨如何建立你的第一個Python元類?Python
- Tensorflow搞一個聊天機器人機器人
- 利用GPTs,打造你的專屬AI聊天機器人GPTAI機器人
- 一個使用Python的人工智慧聊天機器人框架Python人工智慧機器人框架
- 寫一個自動回覆的聊天機器人機器人
- 如何用 Python 和 Flask 建立部署一個 Facebook Messenger 機器人PythonFlaskMessenger機器人
- 打造一個window桌面應用:線上聊天對話機器人機器人
- 用深度學習網路搭建一個聊天機器人(下篇)深度學習機器人
- 用深度學習網路搭建一個聊天機器人(上篇)深度學習機器人
- 如何建立電報機器人機器人
- Facebook的下一個前沿陣地:聊天機器人機器人
- 用c#快速實現的智慧聊天機器人C#機器人
- 世界第一個機器人機器人
- 自動聊天機器人專案班 [一門課搞定聊天機器人]機器人
- 我用tensorflow實現的“一個神經聊天模型”:一個基於深度學習的聊天機器人模型深度學習機器人
- 用AIML開發人工智慧聊天機器人AI人工智慧機器人
- 在Linux上使用Python和Flask建立你的第一個應用LinuxPythonFlask
- 智慧聊天機器人CMO的完全指南機器人
- 建立你的第一個JavaScript庫JavaScript
- 從零開始造一個“智障”聊天機器人機器人
- 怎麼快速搭建一個聊天機器人系統機器人
- 兩個機器人聊天對話實現原始碼機器人原始碼
- 如何用 TensorFlow 訓練聊天機器人(附github)機器人Github