搭建環境:這邊使用的是Python3
(1)使用vistualenv 建立一個與其他python項目隔離的環境
virtualenv starterbot
(2)激活virtualenv
source starterbot/bin/activate
(3)安裝slackclient
Slack建構的官方API幫助程式庫可以發送和接收來自Slack頻道的消息
pip3 install slackclient
(4)登入slack官網,注冊一個賬号,戳賬号注冊
(5)注冊之後來到 戳slackAPI 選擇 start building->create a slack app
還需要建立一個Slack App來為你的機器人接收一個API令牌。使用xxx(按照喜好取名)作為你的應用程式名稱。如果你登入了多個工作區,請從下拉清單中選擇一個開發工作區
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyN1QTOwYTM0EzNwYDM4EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
(6)填入app的名字,和之前注冊slack加入的workspace
(7)create App之後,進入app的配置頁面
(8)我們希望我們的Starter Bot像您團隊中的任何其他使用者一樣出現 - 它将參與管道,小組和DM中的對話。在Slack App中,這被稱為bot使用者,我們通過在“功能”部分下選擇“Bot Users”來設定它。點選“Add a Bot User”後,您應該選擇一個顯示名稱,選擇一個預設的使用者名,并通過點選“添加Bot使用者”儲存您的選擇
(9)“Add Bot User”之後,回到 Settings->Install App 把應用程式安裝到我們的開發工作區中。一旦安裝了該應用程式,它将顯示一個bot使用者oauth通路令牌以作為bot使用者進行身份驗證
(10)将秘密令牌作為環境變量導出。回到終端中,導出Slack令牌,名稱為
SLACK_BOT_TOKEN
export SLACK_BOT_TOKEN='your bot user access token here'
現在我們被授權使用Slack RTM和Web API作為bot使用者
開始編碼
(1)建立一個名為flowerBot.py的檔案,檔案内先引入四個庫
import os
import time
import re
from slackclient import SlackClient
(2)執行個體化SlackClient并使用剛才export出來的SLACK_BOT_TOKEN
#建立一個SlackClient的執行個體,并擷取之前export出來的SLACK_BOT_TOKEN
slack_client = SlackClient(os.environ.get('SLACK_BOT_TOKEN'))
#在bot啟動之後,會獲得一個userId,先初始化
starterbot_id = None
#以下常量備用
RTM_READ_DELAY = 1 #RTM實時通訊,讀完消息後,一秒延遲
EXAMPLE_COMMAND = "do"
MENTION_REGEX = "^<@(|[WU].+?)>(.*)" # @xxx 使用到的正規表達式
(3)書寫main函數
if __name__ == "__main__":
#使用rtm_connect方法,啟動bot;一旦連接配接成功後,會調用web api方法 (auth.test)去找到bot的user ID
#每個bot在目前的app内都有屬于自己的user ID,存儲這個user ID 會幫助程式了解是誰在一個會話裡提到了他
if slack_client.rtm_connect(with_team_state=False):
print("Starter Bot connected and running!")
starterbot_id = slack_client.api_call("auth.test")["user_id"]
while True:
#對于每個讀取的事件,該parse_bot_commands()函數确定事件是否包含Bot的指令。如果是,那麼command将包含一個值,
#該handle_command()函數決定如何處理該指令
command, channel = parse_bot_commands(slack_client.rtm_read())
if command:
handle_command(command, channel)
time.sleep(RTM_READ_DELAY)
else:
print("Connection failed. Exception traceback printed above.")
(4)寫方法
該
parse_bot_commands()
函數從Slack擷取事件并确定它們是否是指向Starter Bot的指令。我們的機器人會遇到很多 事件類型,但為了查找指令我們隻想考慮 消息事件。消息事件也有子類型,但是我們想要查找的指令沒有定義任何子類型。該函數通過檢查這些屬性過濾出無趣的事件。現在我們知道該事件代表了帶有一些文本的消息,但我們想要了解文本中是否提到了Starter Bot。該
parse_direct_mention()
函數将從消息文本開始提到,然後我們将它與我們之前存儲的Starter Bot的使用者ID進行比較。如果它們相同,那麼我們知道這是一個bot指令,并傳回帶有通道ID的指令文本。
該
parse_direct_mentions()
函數使用正規表達式來确定消息開頭是否提及使用者。它傳回使用者ID和剩餘的消息(
None, None
如果沒有發現任何提及)。
最後一個功能
handle_command()
就是在将來您将添加Starter Bot的所有有趣指令,幽默和個性。目前,它隻有一個示例指令:do。如果該指令以已知指令開始,則它将具有适當的響應。如果不是,則使用預設響應。通過調用
chat.postMessage
通道的Web API方法将響應發送回Slack
def parse_bot_commands(slack_events):
"""
解析來自Slack RTM API的事件清單以查找bot指令,
如果找到了bot指令,則此函數傳回一個指令和通道的元組,
如果未找到,則此函數傳回無。
"""
for event in slack_events:
if event["type"] == "message" and not "subtype" in event:
user_id, message = parse_direct_mention(event["text"])
if user_id == starterbot_id:
return message, event["channel"]
return None, None
def parse_direct_mention(message_text):
"""
在消息文本中查找直接提及(在開頭提及)
并傳回提到的使用者ID。如果沒有直接提及,則傳回None
"""
matches = re.search(MENTION_REGEX, message_text)
# 所述第一組包含的使用者名,該第二組包含其餘消息
print('matches.group(1)', matches.group(1))
print('matches.group(2).strip()', matches.group(2).strip())
return (matches.group(1), matches.group(2).strip()) if matches else (None, None)
def handle_command(command, channel):
"""
如果指令已知,則執行機器人指令
"""
# 預設響應是使用者的幫助文本
default_response = "Not sure what you mean. Try *{}*.".format(EXAMPLE_COMMAND)
# 查找并執行給定的指令,填充響應
response = None
# 這是您開始執行更多指令的地方!
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 or default_response
)
(5)整體
以上自己拼一下吧,哈哈哈
運作這個python檔案,出現 Starter Bot connected and running! 說明就成功了
原文參照:https://www.fullstackpython.com/blog/build-first-slack-bot-python.html