如何運用 Python 建立你的第一個 Slack 聊天機器人?
譯者:jiajia9llinuxer
-我們所需的工具
-搭建我們的環境
-Slack 實時消息傳遞(RTM)API
-獲得我們聊天機器人的 ID
-編碼我們的 StarterBot
-結束
聊天機器人(Bot)
[1]
Slack
[2]
[3]
我們通過搭建你的開發環境, 獲得一個 Slack API 的聊天機器人令牌,并用 Pyhon 開發一個簡單聊天機器人。
我們所需的工具
我們的聊天機器人我們將它稱作為“StarterBot”,它需要 Python 和 Slack API。要運行我們的 Python 代碼,我們需要:
Python 2 或者 Python 3[4]
pip[5]?和?virtualenv[6]?來處理 Python?應用程序依賴關系[7]
一個可以訪問 API 的免費 Slack 賬號[8],或者你可以注冊一個?Slack Developer Hangout team[9]。
通過 Slack 團隊建立的官方?Python Slack 客戶端[10]代碼庫
Slack API 測試令牌[11]
當你在本教程中進行構建時,Slack API 文檔[12]是很有用的。
本教程中所有的代碼都放在?slack-starterbot[13]公共庫里,并以 MIT 許可證開源。
搭建我們的環境
我們現在已經知道我們的項目需要什么樣的工具,因此讓我們來搭建我們所的開發環境吧。首先到終端上(或者 Windows 上的命令提示符)并且切換到你想要存儲這個項目的目錄。在那個目錄里,創建一個新的 virtualenv 以便和其他的 Python 項目相隔離我們的應用程序依賴關系。
virtualenv?starterbot
激活 virtualenv:
source?starterbot/bin/activate
你的提示符現在應該看起來如截圖:
已經激活的 starterbot 的 virtualenv的命令提示符
這個官方的 slack 客戶端 API 幫助庫是由 Slack 建立的,它可以通過 Slack 通道發送和接收消息。通過這個pip命令安裝 slackclient 庫:
pip?install?slackclient
當pip命令完成時,你應該看到類似這樣的輸出,并返回提示符。
在已經激活的 virtualenv 用 pip 安裝 slackclient 的輸出
我們也需要為我們的 Slack 項目獲得一個訪問令牌,以便我們的聊天機器人可以用它來連接到 Slack API。
Slack 實時消息傳遞(RTM)API
Slack 允許程序通過一個?Web API[14]來訪問他們的消息傳遞通道。去這個?Slack Web API 頁面[15]?注冊建立你自己的 Slack 項目。你也可以登錄一個你擁有管理權限的已有賬號。
使用 Web API頁面的右上角登錄按鈕
登錄后你會到達?聊天機器人用戶頁面[16]。
定制聊天機器人用戶頁面
給你的聊天機器人起名為“starterbot”然后點擊 “Add bot integration” 按鈕。
添加一個bot integration 并起名為“starterbot”
這個頁面將重新加載,你將看到一個新生成的訪問令牌。你還可以將標志改成你自己設計的。例如我給的這個“Full Stack Python”標志。
為你的新 Slack 聊天機器人復制和粘貼訪問令牌
在頁面底部點擊“Save Integration”按鈕。你的聊天機器人現在已經準備好連接 Slack API。
Python 開發人員的一個常見的做法是以環境變量輸出秘密令牌。輸出的 Slack 令牌名字為SLACK_BOT_TOKEN:
cexport?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 時,腳本會打印出簡單的一行輸出。
在你的 Slack 項目中用 Python 腳本打印 Slack 聊天機器人的 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 中查看該文件[17]):
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 的代碼了。
當 StarterBot 開始運行而且連接到 API 的輸出通道
在 Slack 中創建新通道,并且把 StarterBot 邀請進來,或者把 StarterBot 邀請進一個已經存在的通道中。
在 Slack 界面創建一個新通道并且邀請 StarterBot
現在在你的通道中給 StarterBot 發命令。
在你的 Slack 通道里給你的 StarterBot 發命令
如果你從聊天機器人得到的響應中遇見問題,你可能需要做一個修改。正如上面所寫的這個教程,其中一行AT_BOT = "<@" + BOT_ID + ">:",在“@starter”(你給你自己的聊天機器人起的名字)后需要一個冒號。從?AT_BOT?字符串后面移除:。Slack 似乎需要在@?一個人名后加一個冒號,但這好像是有些不協調的。
結束
好吧,你現在已經獲得一個簡易的聊天機器人,你可以在代碼中很多地方加入你想要創建的任何特性。
我們能夠使用 Slack RTM API 和 Python 完成很多功能。看看通過這些文章你還可以學習到什么:
附加一個持久的關系數據庫[18]?或者?NoSQL 后端[19]?比如?PostgreSQL[20]、MySQL[21]或者?SQLite[22]?,來保存和檢索用戶數據
添加另外一個與聊天機器人互動的通道,比如?短信[23]?或者電話呼叫[24]
集成其它的?web API[25],比如?GitHub[26]、Twilio[27]或者?api.ai[28]
有問題? 通過 Twitter 聯系我?@fullstackpython[29]?或?@mattmakai[30]。 我在 GitHub 上的用戶名是mattmakai。
這篇文章感興趣? Fork 這個?GitHub 上的頁面[31]吧。
via:?https://www.fullstackpython.com/blog/build-first-slack-bot-python.html
本文由?LCTT[33]?原創編譯,?Linux中國榮譽推出
[1]: https://www.fullstackpython.com/bots.html
[2]: https://slack.com/
[3]: https://api.slack.com/
[4]: https://www.fullstackpython.com/python-2-or-3.html
[5]: https://pip.pypa.io/en/stable/
[6]: https://virtualenv.pypa.io/en/stable/
[7]: https://www.fullstackpython.com/application-dependencies.html
[8]: https://slack.com/
[9]: http://dev4slack.xoxco.com/
[10]: https://github.com/slackhq/python-slackclient
[11]: https://api.slack.com/tokens
[12]: https://api.slack.com/
[13]: https://github.com/mattmakai/slack-starterbot
[14]: https://www.fullstackpython.com/application-programming-interfaces.html
[15]: https://api.slack.com/
[16]: https://api.slack.com/bot-users
[17]: https://github.com/mattmakai/slack-starterbot/blob/master/starterbot.py
[18]: https://www.fullstackpython.com/databases.html
[19]: https://www.fullstackpython.com/no-sql-datastore.html
[20]: https://www.fullstackpython.com/postgresql.html
[21]: https://www.fullstackpython.com/mysql.html
[22]: https://www.fullstackpython.com/sqlite.html
[23]: https://www.twilio.com/blog/2016/05/build-sms-slack-bot-python.html
[24]: https://www.twilio.com/blog/2016/05/add-phone-calling-slack-python.html
[25]: https://www.fullstackpython.com/api-integration.html
[26]: https://developer.github.com/v3/
[27]: https://www.twilio.com/docs
[28]: https://docs.api.ai/
[29]: https://twitter.com/fullstackpython
[30]: https://twitter.com/mattmakai
[31]: https://github.com/mattmakai/fullstackpython.com/blob/gh-pages/source/content/posts/160604-build-first-slack-bot-python.markdown
[32]: https://www.fullstackpython.com/about-author.html
[33]: https://github.com/LCTT/TranslateProject
本文轉載自異步社區
原文鏈接:https://www.epubit.com/articleDetails?id=NC7E3EF91AA5000011B411FA01CAB2ED0
軟件開發 編程語言
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。