摘要:提供任何功能的打包服務,比如我們即將去構建的聊天機器人。而聊天機器人的工作方式如下用戶向聊天機器人發送一個直接聊天消息表示該消息的事件已發布如果機器人訂閱了該類型的事件,則將包含該聊天消息相關信息的請求發送到位于給定上的資源中。
最近,圍繞“Serverless”架構的討論不絕于耳……
即使你以前從未聽說過這個詞匯,沒關系,這并不會有什么影響。其實,“serverless”就是指專門使用云服務構建的應用程序。現如今,隨著AWS Lambda的引入以及亞馬遜競爭對手的類似產品的出現,使構建和部署不需要維護操作且可以提供無限規模的應用程序成為可能。最關鍵的是,你不再需要去管理應用程序服務器,從而減少了大量的復雜性和成本開銷。
?
?
在本教程中,我們將通過構建一個可以回復我們私人聊天消息的簡單Slack聊天機器人來將我們的技術付諸實踐。
創建Slack機器人
首先,如果你還沒有組隊的話,趕緊創建你的Slack團隊吧。
點擊左上角的主菜單,然后選擇“Apps & integrations”。
?
?
?
選擇構建。
?
?
?
然后,點擊綠色的開始構建按鈕。緊接著會彈出一個名為“Create an app”的新窗口。
Slack apps提供任何功能的打包服務,比如我們即將去構建的聊天機器人。然后可以通過Slack APP目錄來分發APP。
為你的app輸入一個合適的名稱,并將其分配到你團隊中的“開發團隊”。而我就將我的機器人命名為Gort。
?
?
?
單擊創建應用程序,然后你的面前就會呈現出你的應用程序的配置頁面。
我們現在需要做的是啟用事件訂閱。而聊天機器人的工作方式如下:
?用戶向聊天機器人發送一個直接聊天消息;
?表示該消息的事件已發布;
?如果機器人訂閱了該類型的事件,則將包含該聊天消息相關信息的HTTP POST請求發送到位于給定URL上的Web資源中。
該URL可以由Web應用程序進行處理,而我們可以通過使用幾個“serverless”AWS云技術來輕松構建該Web應用程序:
?位于該URL處的API網關資源處理傳入的POST請求;
?AWS Lambda函數處理POST請求的有效負載,并采取適當的操作,如向Slack API發出新請求(比如回復消息);
這是一個交互圖,可以充分顯示每次當我們的機器人收到一條直接消息時會有哪些情況發生:
?
?
我們繼續接下來的工作:我們需要告訴機器人去訂閱一個名為im.message的特定事件類型。
轉到事件訂閱頁面并啟用事件:
?
?
切換開/關按鈕啟用/禁用事件訂閱
向下滾動到“訂閱機器人事件(Subscribe to Bot Events)”部分,然后單擊添加機器人用戶文本超鏈接。
?
?
你可以重新定義機器人在與頻道和用戶交互時使用的昵稱。不要忘記啟用“始終顯示我的機器人在線”選項,因為我們不能一直使用RTM API來完成這一點。除此之外,AWS基礎設施是始終處于開啟狀態的,不相信嗎?這就是使用“serverless”架構的優點之一:不存在停機時間。
?
?
你可以通過單擊“添加Bot用戶”按鈕完成此部分。返回到“事件訂閱部分”并切換“開/關”按鈕。你是否注意到剛剛出現的請求URL?這就是機器人將收到的直接消息通過HTTPS POST請求來發送去往的地方。
我們現在需要設置該Web資源,但在我們進行此操作之前,請轉到“OAuth和權限(Permissions)”頁面,然后單擊“安裝應用程序到團隊”按鈕。為機器人授權,然后你將獲得一組OAuth訪問令牌,要記得將Bot用戶OAuth訪問令牌復制到剪貼板,因為我們稍后將用到這些。
?
?
創建API網關web資源
登錄到你的AWS管理控制臺。由于我們即將開始創建API網關資源,所以請轉到其信息中心。
?
?
點擊“Create API”按鈕,選擇新的API并輸入一個好的名稱,我稱其為“gort-brains”。
?
?
預定義的資源是root(/),因此我們將創建一個名為/ event-handler的新資源。單擊“操作”按鈕,然后從下拉菜單中選擇“創建資源”。
?
?
輸入“Event Handler(事件處理程序)”作為資源名稱,“event-handler”作為資源路徑。我們不需要啟用CORS,因為客戶端不會是瀏覽器,而是有Slack運行的任何后端應用程序來分派這些請求。最后,不要忘記點擊“Create Resource”按鈕。
?
?
?
在完成新的API網關資源之前,我們需要創建它將觸發的Lambda函數。單擊頂部菜單中的“Services”,并在另一個瀏覽器選項卡中打開Lambda管理控制臺。
創建Lambda函數
轉到Lambda控制板并創建一個Lambda函數。
?
?
選擇空白函數作為操作藍圖:我們將從零開始。當出現“配置觸發器(Configure Triggers)”部分時,單擊“下一步”。
?
?
當你感到疑惑甚至忍不住詢問之前,我可以明確的告訴你:是的,我們可以一舉創建Gateway資源和Lambda函數,但是在本教程中,我會逐步向大家解釋這個過程。
我們將使用Python 3來編寫我們的Lambda函數,并將其稱為“handleBotEvent”。
?
?
Lambda函數將編碼以下過程:
1.處理來自傳入的POST請求數據,并提取與事件相關的部分;
2.檢查消息是否是來自用戶的;
3.反轉消息的文本,例如“Hello”變成“olleH”;
4.通過向適當的Slack API資源提交新的GET請求,向用戶發送響應文本:chat.postMessage。
Lambda函數的行為就像簡單的CGI(或WSGI)處理程序。使用Python 3類型注釋的Python Lambda函數簽名是:
?
?
?
event對象是我們需要挖掘多個少量消息數據的地方。而你通常得到是這樣的:
?
?
?
你會在那里獲得很多有趣的信息。我已經強調了與我們的用例非常相關的部分:
?用戶(user):將消息發送到我們聊天機器人的用戶的ID;
?文本(text):消息的文本;
?頻道(channel):發送消息的頻道的ID,基本上是用戶和機器人之間的私人聊天流。
我希望在函數中包含上述兩個功能,我可以通過下面的代碼來實現:
"""
Slack chat-bot Lambda handler.
"""
Import os
import logging
import urllib
# Grab the Bot OAuth token from the environment.
BOT_TOKEN = os.environ["BOT_TOKEN"]
# Define the URL of the targeted Slack API resource.
# We"ll send our replies there.
SLACK_URL = "https://slack.com/api/chat.postMessage"
Def lambda_handler(data, context):
? ? """Handle an incoming HTTP request from a Slack chat-bot.
? ? """
? ? # Grab the Slack event data.
slack_event = data["event"]
? ? # We need to discriminate between events generated by?
? ? # the users, which we want to process and handle,?
? ? # and those generated by the bot.
if "bot_id" in slack_event:
logging.warn("Ignore bot event")
else:
? ? ? ? # Get the text of the message the user sent to the bot,
? ? ? ? # and reverse it.
text = slack_event["text"]
reversed_text = text[::-1]
? ? ? ? # Get the ID of the channel where the message was posted.
channel_id = slack_event["channel"]
# We need to send back three pieces of information:
# ? ? 1. The reversed text (text)
# ? ? 2. The channel id of the private, direct chat (channel)
# ? ? 3. The OAuth token required to communicate with?
# ? ? ? ?the API (token)
# Then, create an associative array and URL-encode it,?
# since the Slack API doesn"t not handle JSON (bummer).
data = urllib.parse.urlencode(
? ?(
? ? ? ? ("token", BOT_TOKEN),
? ? ? ? ("channel", channel_id),
? ? ? ? ("text", reversed_text)
)
)
data = data.encode("ascii")
# Construct the HTTP request that will be sent to the Slack API.
request = urllib.request.Request(
? ? ? ? ? ? SLACK_URL,?
data=data,?
method="POST"
?)
# Add a header mentioning that the text is URL-encoded.
request.add_header(
? ? ? ? ? ? "Content-Type",?
? ? ? ? ? ? "application/x-www-form-urlencoded"
?)
? ? ? ? # Fire off the request!
urllib.request.urlopen(request).read()
? ? # Everything went fine.
return "200 OK"
請注意:生產代碼必須驗證Slack在請求中發送的令牌。出于簡單性的考慮,我在代碼中省略了這一點,但是我認為你應該看看尼古拉斯的評論從而獲得更多的信息。
我們引用了機器人OAuth令牌的環境變量,所以讓我們在編輯器下對它進行定義:
?
?
最后,我們還要為函數創建一個適當的角色。向下滾動到Lambda函數處理程序和角色部分,然后從“角色”下拉列表中選擇“創建自定義角色”。打開一個瀏覽器標簽,然后你可以在這個新頁面上創建一個新的非常基本的角色:
?
?
單擊“允許”,則上一個表單將自動填充:
?
?
?
這就是我們的Lambda函數。那么讓我們回到API網關資源中去進行相應的操作。
Joining the dots
我們需要配置資源,以便它處理POST請求。再次單擊“操作”按鈕,繼而選擇“創建方法”,然后單擊已出現的新下拉字段并選擇“POST”。最后點擊勾號圖標。
選擇“Lambda函數”作為集成類型(如果尚未成功),那就在“Lambda Region”中選擇最適合你的。當我在愛爾蘭居住時選擇了“eu-west-1”。輸入“handleBotEvent”作為Lambda函數的名稱。
?
?
單擊“保存”。一個即將出現的彈出窗口會通知你為新的Lambda函數給出API網關權限。到這里,我們的工作就做的差不多了。
?
?
你應該結束以下工作流程:
?
?
?
部署API,它將通過特定的網址來獲得。單擊“操作”,然后單擊“部署API”。
?
?
?
在被要求選擇部署階段時,創建一個新的名為“dev”并進行部署!
?
?
一旦你這樣做了之后,我們就最終可以得到我們真正想要的:“請求URL”,這里被稱為“Invoke URL”:
?
?
我們默認啟用HTTPS
重要:你需要“事件處理程序”資源的URL,而不是根資源!展開樹形圖,然后點擊綠色的POST鏈接即可。
復制鏈接網址。
我們的工作差不多完成了。方程的AWS部分已經得到妥善處理。現在我們需要將機器人訂閱到正確類型的事件,返回到Slack API事件訂閱頁面。
啟用Slack直接郵件事件并將URL粘貼到“請求URL”字段中。你可能會立即收到一條警告消息,稱該網址沒有正確回復由Slack API發起的挑戰。
?
?
?
到底是怎么回事? Slack API謹慎地向你剛剛定義為“請求URL”的新網址發送一次性挑戰請求。該挑戰包含一段隨機的字符串,而我們的API預期在響應中使用相同的字符串進行響應。看來我們需要修改代碼,以便處理這種情況。
我們應該回到Lambda函數的代碼部分,并在函數的詞法頂部添加以下條件語句(標粗部分):
?
?
?
這部分應該妥善處理。保存該函數并返回到“啟用事件”頁面,然后單擊“重試”。現在進行的驗證應該成功了:
?
?
向下滾動到“訂閱機器人事件”部分,然后單擊“添加機器人用戶事件”按鈕。選擇message.im作為事件類型:
?
?
保存你的更改并返回到Slack團隊頻道。機器人應該耐心等待:
?
?
發送一條直接消息,而你應該會從機器人那里獲取反轉的文本。
?
?
點擊這里獲得本教程的完整代碼。
結論
我不得不說我不喜歡在Lambda的受限編輯器中編寫Python代碼。這可能就是為什么最近推出了一個更全面的Web IDE和開發工具包。不過,我想說的是,一旦你腦海里有了想法和思路(如Slack API不接受JSON有效載荷等)之后,創建一個基本的機器人,也就是一件非常簡單的事情了。
那么該從哪里著手呢?我可能會看看Lex,觀察它是如何進行集成的,也可能會得到一個數據存儲,從而給機器人一個記憶。在接下來的日子里,我還打算嘗試由AWS贊助的,用于AWS的Python微框架Chalice。
我希望這個教程對你來說是有用的。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/3540.html
摘要:提供任何功能的打包服務,比如我們即將去構建的聊天機器人。而聊天機器人的工作方式如下用戶向聊天機器人發送一個直接聊天消息表示該消息的事件已發布如果機器人訂閱了該類型的事件,則將包含該聊天消息相關信息的請求發送到位于給定上的資源中。 最近,圍繞Serverless架構的討論不絕于耳……即使你以前從未聽說過這個詞匯,沒關系,這并不會有什么影響。其實,serverless就是指專門使用云服務構建的應...
摘要:能不能省掉這些煩瑣的步驟,讓開發人員自己完成呢現在好了,你可以用和把聊天機器人接入微信工具資源掘金今晚看了個電影,回得有點遲。 小花貓-網頁聊天機器人 - 前端 - 掘金 基于圖靈機器人API的網頁聊天機器人,輸入二維碼+你要說的話有驚喜哦~~~(菜單中的功能尚未開發完成,玩玩聊天功能就好了~)代碼開源在https://github.com/ColorfulCa... 了~... (英...
摘要:發布本周正式發布,包含了一系列的特性提升與問題修復,同時也在不斷致力于將打造地更為輕巧與高性能。當然,姜振勇老師還會介紹的多種服務,包括大數據網絡和安全,展現彈性安全和高可擴展性的全方位能力。 showImg(http://upload-images.jianshu.io/upload_images/1647496-2ce7598e6987d9af.jpg?imageMogr2/aut...
閱讀 2044·2021-11-15 11:39
閱讀 3226·2021-10-09 09:41
閱讀 1491·2019-08-30 14:20
閱讀 3262·2019-08-30 13:53
閱讀 3325·2019-08-29 16:32
閱讀 3362·2019-08-29 11:20
閱讀 3018·2019-08-26 13:53
閱讀 775·2019-08-26 12:18