天天看點

python建立slack bot

搭建環境:這邊使用的是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(按照喜好取名)作為你的應用程式名稱。如果你登入了多個工作區,請從下拉清單中選擇一個開發工作區

python建立slack bot
python建立slack bot

(6)填入app的名字,和之前注冊slack加入的workspace

python建立slack bot

(7)create App之後,進入app的配置頁面

python建立slack bot

(8)我們希望我們的Starter Bot像您團隊中的任何其他使用者一樣出現 - 它将參與管道,小組和DM中的對話。在Slack App中,這被稱為bot使用者,我們通過在“功能”部分下選擇“Bot Users”來設定它。點選“Add a Bot User”後,您應該選擇一個顯示名稱,選擇一個預設的使用者名,并通過點選“添加Bot使用者”儲存您的選擇

python建立slack bot

(9)“Add Bot User”之後,回到 Settings->Install App 把應用程式安裝到我們的開發工作區中。一旦安裝了該應用程式,它将顯示一個bot使用者oauth通路令牌以作為bot使用者進行身份驗證

python建立slack 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