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

2021-03-02 Linux中國

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

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

我們所需的工具

我們的聊天機器人我們將它稱作為「StarterBot」,它需要 Python 和 Slack API。要運行我們的 Python 代碼,我們需要:

當你在本教程中進行構建時,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:

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 時,腳本會列印出簡單的一行輸出。

在你的 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 完成很多功能。看看通過這些文章你還可以學習到什麼:

有問題? 通過 Twitter 聯繫我 @fullstackpython[29] 或 @mattmakai[30]。 我在 GitHub 上的用戶名是mattmakai。

這篇文章感興趣? Fork 這個 GitHub 上的頁面[31]吧。

via: https://www.fullstackpython.com/blog/build-first-slack-bot-python.html

作者:Matt Makai[32] 譯者:jiajia9llinuxer 校對:wxy

本文由 LCTT[33] 原創編譯,Linux中國 榮譽推出aa

[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

推薦文章

將文章分享給朋友是對我們最好的讚賞!

相關焦點

  • 如何運用Python建立你的第一個Slack聊天機器人?
    聊天機器人(Bot) 是一種像 Slack 一樣的實用的互動聊天服務方式。如果你之前從來沒有建立過聊天機器人,那麼這篇文章提供了一個簡單的入門指南,告訴你如何用 Python 結合 Slack API 建立你第一個聊天機器人。
  • 如何運用Python建一個聊天機器人?
    通過 Slack 團隊建立的官方 Python Slack 客戶端代碼庫Slack API 測試令牌當你在本教程中進行構建時,Slack API 文檔 是很有用的。本教程中所有的代碼都放在 slack-starterbot 公共庫裡,並以 MIT 許可證開源。
  • 如何用 Python 打造一個聊天機器人?
    感覺這些產品提供的靈活性還蠻大的,可以自己實現許多有意思的機器人。原文:fullstackpython.com(推薦跟著這個網站學習Python全棧)譯文:http://linux.cn譯者:jiajia9linuxer聊天機器人(Bot) 是一種像 Slack 一樣的實用的互動聊天服務方式。
  • 5分鐘內搭建你的第一個Python聊天機器人
    前言在人工智慧時代,聊天機器人日益流行。
  • 5分鐘構建您的第一個Python聊天機器人
    來自:Linux迷   https://www.linuxmi.com/原文:http://codeperfectplus.herokuapp.com/build-your-first-python-chatbot-in
  • 想讓機器人替你聊天?1小時手把手訓練一個克隆版的你
    當今最流行的四個對話機器人是:蘋果的Siri、微軟Cortana、谷歌助理、亞馬遜的Alexa。他們能夠幫你查比分、打電話,當然,偶爾他們也會出錯。本文,我們主要會詳細介紹聊天機器人在文本方面的運作。  在這篇文章中,我們將看到如何使用深度學習模型訓練聊天機器人用我們所希望的方式在社交媒體上進行對話。
  • 不到20行代碼,用Python做一個智能聊天機器人
    聊天機器人就是其中最典型的應用,今天小編就帶領大家用不到20行代碼,運用兩種方式搭建屬於自己的聊天機器人。神器wxpy庫首先,小編先向大家介紹一下本次運用到的python庫,本次項目主要運用到的庫有wxpy和chatterbot。wxpy是在 itchat庫 的基礎上,通過大量接口優化,讓模塊變得簡單易用,並進行了功能上的擴展。
  • python聊天機器人
    1:關注「python趣味愛好者」公眾號,回復「聊天」獲取原始碼。先講一講這個代碼的原理大家在淘寶買東西與客服聊天的時候,可能會注意到。很多與你聊天的客服實際上是機器人。其中比較著名的就是圖靈機器人,是一款非常好用的自動聊天的應用。
  • 5分鐘搭建你的Python聊天機器人!
    在人工智慧時代,聊天機器人日益流行。伴隨著自然語言技術和機器學習技術的發展,網上和你聊天的小姐姐,可能就是一個AI~ 今天,我們要嘗試用幾十行代碼,5分鐘搭建搭建屬於自己的聊天機器人。什麼是聊天機器人聊天機器人是一種軟體應用程式,用於通過文本或文本到語音進行在線聊天對話,而不是與真人代理直接接觸。
  • 實戰 使用Slack、Docker來打造你的運維機器人
    優點就是運維現在對於整個團隊來說都是透明的,因為與Kontena的通訊都是通過與一個cahnnel裡面的機器人對話來完成的。與同事一起做調試也變得十分的簡單,只需要你們建立一個私聊的會話然後邀請機器人加入就行了。通過這種方式你們兩人都可以看見與Kontena grid實時的控制流。機器人是使用Node.js和Slack的Node客戶端寫的。
  • Python 接入圖靈機器人智能聊天
    下面步入正題,如何使用 python 調用圖靈機器人完成自動聊天功能。:" + message); except KeyError: print("你難住我啦,不知道你在說什麼"); if __name__ == '__main__': run();圖靈機器人程序啟動執行結果:請輸入:哈哈圖靈機器人:哈哈,樂完了,我繼續回去研究遊戲了
  • 如何用 Python 和 Flask 建立部署一個 Facebook Messenger 機器人
    這是我建立一個簡單的 Facebook Messenger 機器人的記錄。功能很簡單,它是一個回顯機器人,只是列印回用戶寫了什麼。
  • 手把手教你用Python創建一個自動聊天機器人
    今天給大家安利一個好玩的案例,用圖靈機器人和python打造一個可以在微信上自動聊天的機器人,首先我們先要了解一下itchat模塊,python的itchat第三方模塊實現了微信接口,可以通過pip install itchat安裝,下面給大家介紹一下itchat的一些簡單方法。
  • Python Socket編程之聊天機器人
    本次文章要使用之前寫過的一個代碼,所以沒看過的,請點擊下面連結學習一下。順便按照裡面的要求,去申請一個機器人,獲得apikey。<<【Python】AI智能聊天機器人>>然後發送【源碼】下載【S21.py】這個文件再來開始看今天的教程
  • 做到slack就能成為slack嗎?
    有人說slack的產品體驗超級贊,三級頁面的設計好用到哭,流暢到爆。另一方面和具體的業務無關,可以通過提升公司的工作效率來降低成本和提高收益。比如:增加企業透明度加快信息流動速度Slack很好的解決了以上兩個問題。其次來看slack如何實現這些訴求?第一:公開的群組溝通:Slack的public channel功能很好的解決了企業信息透明的問題。
  • Slack如何靠產品設計撐起160億美金市值?
    因為他們的遊戲開發團隊分布在紐約、舊金山、溫哥華,面臨跨國、跨時區的挑戰,而且有很多人乾脆就遠程辦公——所以他們基於自己的需求,把當時流行的開源聊天工具改造成適合自己團隊協作的工具。他們發現,以後即使在其他地方繼續工作,他們也已經離不開這樣一款聊天工具,於是,他們決定基於這個聊天工具,進行轉型 [2]。
  • Zulip聊天機器人Python開發 豈安乾貨分享
    並且,Zulip還提供了標準的消息/聊天應用功能集合,其中包括拖動上傳文件、粘貼圖片、群聊、聲音通知、未收到消息的電子郵件通知,以及虛擬表情等。最重要的一點,zulip還提供了聊天機器人接口。如此一來,攻城獅還要花時間教小白如何看數據。而且,如果API接口URL中涉及用戶授權認證,就容易暴露內部授權碼,得不償失了。所以我們希望可以通過聊天機器人的開發,把這些非技術人員需要查詢的需求集成進去,然後智能解析他們發送的消息,並以友好方式自動答覆數據結果。舉個慄子。
  • 獨家 | 手把手教你創建聊天機器人來協助網絡運營(附代碼)
    本文是創建聊天機器人實現網絡運營的簡單教程。在本教程中,我們將了解如何利用聊天機器人來協助網絡運營。隨著我們向智能化運營邁進,另一個需要關注的領域是移動性。用一個腳本來進行配置,修復甚至故障檢修是很好的,但它仍然需要有人在場來監督,啟動甚至執行這些程序或腳本。
  • 手把手教你用Python創建微信聊天機器人
    > 3月29日,將於北京舉辦的 2018 年中國 AI 開年盛典——2018 新智元 AI 技術峰會,我們邀請到了德國總理默克爾的科學顧問、諾貝爾獎唯一計算機領域評委、工業 4.0 教父、世界頂級自然語言處理專家 Wolfgang Wahlste 教授。
  • 分享|教你製作一個微信機器人陪你聊天,只要幾行代碼
    今天來分享如何製作一個微信機器人陪你聊天?工具依然是強大的python,而代碼也只有幾行而已。在製作之前,需要在圖靈機器人的官方網站註冊申請一個APIKey,等會需要用到。官方站:http://www.tuling123.com/在官方註冊之後,創建一個機器人之後,就會分配一個APIKey。