如何運用 Python 建立你的第一個 Slack 聊天機器人?

      網友投稿 1402 2022-05-30

      譯者: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]

      如何運用 Python 建立你的第一個 Slack 聊天機器人?

      當你在本教程中進行構建時,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小時內刪除侵權內容。

      上一篇:Atlas初步配置與運行
      下一篇:物聯網項目實施中的五大挑戰
      相關文章
      亚洲av无码成人黄网站在线观看| 亚洲精品成人网站在线观看| 亚洲综合色丁香麻豆| 亚洲国产另类久久久精品| 精品国产亚洲一区二区在线观看| 久久精品国产亚洲av天美18 | 亚洲人成无码www久久久| 亚洲AV无码一区二区三区网址| 亚洲欧美日韩中文高清www777| 国产人成亚洲第一网站在线播放| 亚洲av永久无码嘿嘿嘿| 亚洲噜噜噜噜噜影院在线播放| 亚洲午夜久久久久久尤物| 亚洲中文字幕人成乱码 | 亚洲国产精品人久久电影| 亚洲酒色1314狠狠做| 亚洲欧洲国产成人精品| 亚洲男女性高爱潮网站| 亚洲午夜电影在线观看高清| 亚洲精品第一综合99久久| 伊人久久五月丁香综合中文亚洲 | 亚洲综合色一区二区三区| 亚洲精品中文字幕| 婷婷国产偷v国产偷v亚洲| 亚洲欧洲一区二区三区| 亚洲日韩精品一区二区三区无码 | 亚洲深深色噜噜狠狠爱网站| 亚洲国产精品无码av| 亚洲人成电影亚洲人成9999网| 亚洲成a人片在线观看中文app| 久久精品国产亚洲AV忘忧草18| 亚洲va久久久久| 欧美日韩亚洲精品| 亚洲精品国产高清不卡在线| 亚洲一区二区三区影院| 无码乱人伦一区二区亚洲| 亚洲最大在线视频| 亚洲欧美中文日韩视频| 亚洲XX00视频| 亚洲国产精品一区二区久久hs| 亚洲精品在线视频观看|