国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

如何用AWS編寫一個(gè)“無服務(wù)器”的Slack 聊天機(jī)器人?

piapia / 2892人閱讀

摘要:提供任何功能的打包服務(wù),比如我們即將去構(gòu)建的聊天機(jī)器人。而聊天機(jī)器人的工作方式如下用戶向聊天機(jī)器人發(fā)送一個(gè)直接聊天消息表示該消息的事件已發(fā)布如果機(jī)器人訂閱了該類型的事件,則將包含該聊天消息相關(guān)信息的請(qǐng)求發(fā)送到位于給定上的資源中。

最近,圍繞“Serverless”架構(gòu)的討論不絕于耳……

即使你以前從未聽說過這個(gè)詞匯,沒關(guān)系,這并不會(huì)有什么影響。其實(shí),“serverless”就是指專門使用云服務(wù)構(gòu)建的應(yīng)用程序?,F(xiàn)如今,隨著AWS Lambda的引入以及亞馬遜競爭對(duì)手的類似產(chǎn)品的出現(xiàn),使構(gòu)建和部署不需要維護(hù)操作且可以提供無限規(guī)模的應(yīng)用程序成為可能。最關(guān)鍵的是,你不再需要去管理應(yīng)用程序服務(wù)器,從而減少了大量的復(fù)雜性和成本開銷。

在本教程中,我們將通過構(gòu)建一個(gè)可以回復(fù)我們私人聊天消息的簡單Slack聊天機(jī)器人來將我們的技術(shù)付諸實(shí)踐。

創(chuàng)建Slack機(jī)器人

首先,如果你還沒有組隊(duì)的話,趕緊創(chuàng)建你的Slack團(tuán)隊(duì)吧。

點(diǎn)擊左上角的主菜單,然后選擇“Apps & integrations”。

?

選擇構(gòu)建。

?

然后,點(diǎn)擊綠色的開始構(gòu)建按鈕。緊接著會(huì)彈出一個(gè)名為“Create an app”的新窗口。

Slack apps提供任何功能的打包服務(wù),比如我們即將去構(gòu)建的聊天機(jī)器人。然后可以通過Slack APP目錄來分發(fā)APP。

為你的app輸入一個(gè)合適的名稱,并將其分配到你團(tuán)隊(duì)中的“開發(fā)團(tuán)隊(duì)”。而我就將我的機(jī)器人命名為Gort。

?

單擊創(chuàng)建應(yīng)用程序,然后你的面前就會(huì)呈現(xiàn)出你的應(yīng)用程序的配置頁面。

我們現(xiàn)在需要做的是啟用事件訂閱。而聊天機(jī)器人的工作方式如下:

?用戶向聊天機(jī)器人發(fā)送一個(gè)直接聊天消息;

?表示該消息的事件已發(fā)布;

?如果機(jī)器人訂閱了該類型的事件,則將包含該聊天消息相關(guān)信息的HTTP POST請(qǐng)求發(fā)送到位于給定URL上的Web資源中。

該URL可以由Web應(yīng)用程序進(jìn)行處理,而我們可以通過使用幾個(gè)“serverless”AWS云技術(shù)來輕松構(gòu)建該Web應(yīng)用程序:

?位于該URL處的API網(wǎng)關(guān)資源處理傳入的POST請(qǐng)求;

?AWS Lambda函數(shù)處理POST請(qǐng)求的有效負(fù)載,并采取適當(dāng)?shù)牟僮?,如向Slack API發(fā)出新請(qǐng)求(比如回復(fù)消息);

這是一個(gè)交互圖,可以充分顯示每次當(dāng)我們的機(jī)器人收到一條直接消息時(shí)會(huì)有哪些情況發(fā)生:

我們繼續(xù)接下來的工作:我們需要告訴機(jī)器人去訂閱一個(gè)名為im.message的特定事件類型。

轉(zhuǎn)到事件訂閱頁面并啟用事件:

切換開/關(guān)按鈕啟用/禁用事件訂閱

向下滾動(dòng)到“訂閱機(jī)器人事件(Subscribe to Bot Events)”部分,然后單擊添加機(jī)器人用戶文本超鏈接。

你可以重新定義機(jī)器人在與頻道和用戶交互時(shí)使用的昵稱。不要忘記啟用“始終顯示我的機(jī)器人在線”選項(xiàng),因?yàn)槲覀儾荒芤恢笔褂肦TM API來完成這一點(diǎn)。除此之外,AWS基礎(chǔ)設(shè)施是始終處于開啟狀態(tài)的,不相信嗎?這就是使用“serverless”架構(gòu)的優(yōu)點(diǎn)之一:不存在停機(jī)時(shí)間。

你可以通過單擊“添加Bot用戶”按鈕完成此部分。返回到“事件訂閱部分”并切換“開/關(guān)”按鈕。你是否注意到剛剛出現(xiàn)的請(qǐng)求URL?這就是機(jī)器人將收到的直接消息通過HTTPS POST請(qǐng)求來發(fā)送去往的地方。

我們現(xiàn)在需要設(shè)置該Web資源,但在我們進(jìn)行此操作之前,請(qǐng)轉(zhuǎn)到“OAuth和權(quán)限(Permissions)”頁面,然后單擊“安裝應(yīng)用程序到團(tuán)隊(duì)”按鈕。為機(jī)器人授權(quán),然后你將獲得一組OAuth訪問令牌,要記得將Bot用戶OAuth訪問令牌復(fù)制到剪貼板,因?yàn)槲覀兩院髮⒂玫竭@些。

創(chuàng)建API網(wǎng)關(guān)web資源

登錄到你的AWS管理控制臺(tái)。由于我們即將開始創(chuàng)建API網(wǎng)關(guān)資源,所以請(qǐng)轉(zhuǎn)到其信息中心。

點(diǎn)擊“Create API”按鈕,選擇新的API并輸入一個(gè)好的名稱,我稱其為“gort-brains”。

預(yù)定義的資源是root(/),因此我們將創(chuàng)建一個(gè)名為/ event-handler的新資源。單擊“操作”按鈕,然后從下拉菜單中選擇“創(chuàng)建資源”。

輸入“Event Handler(事件處理程序)”作為資源名稱,“event-handler”作為資源路徑。我們不需要啟用CORS,因?yàn)榭蛻舳瞬粫?huì)是瀏覽器,而是有Slack運(yùn)行的任何后端應(yīng)用程序來分派這些請(qǐng)求。最后,不要忘記點(diǎn)擊“Create Resource”按鈕。

?

在完成新的API網(wǎng)關(guān)資源之前,我們需要?jiǎng)?chuàng)建它將觸發(fā)的Lambda函數(shù)。單擊頂部菜單中的“Services”,并在另一個(gè)瀏覽器選項(xiàng)卡中打開Lambda管理控制臺(tái)。

創(chuàng)建Lambda函數(shù)

轉(zhuǎn)到Lambda控制板并創(chuàng)建一個(gè)Lambda函數(shù)。

選擇空白函數(shù)作為操作藍(lán)圖:我們將從零開始。當(dāng)出現(xiàn)“配置觸發(fā)器(Configure Triggers)”部分時(shí),單擊“下一步”。

當(dāng)你感到疑惑甚至忍不住詢問之前,我可以明確的告訴你:是的,我們可以一舉創(chuàng)建Gateway資源和Lambda函數(shù),但是在本教程中,我會(huì)逐步向大家解釋這個(gè)過程。

我們將使用Python 3來編寫我們的Lambda函數(shù),并將其稱為“handleBotEvent”。

Lambda函數(shù)將編碼以下過程:

1.處理來自傳入的POST請(qǐng)求數(shù)據(jù),并提取與事件相關(guān)的部分;

2.檢查消息是否是來自用戶的;

3.反轉(zhuǎn)消息的文本,例如“Hello”變成“olleH”;

4.通過向適當(dāng)?shù)腟lack API資源提交新的GET請(qǐng)求,向用戶發(fā)送響應(yīng)文本:chat.postMessage。

Lambda函數(shù)的行為就像簡單的CGI(或WSGI)處理程序。使用Python 3類型注釋的Python Lambda函數(shù)簽名是:

?

event對(duì)象是我們需要挖掘多個(gè)少量消息數(shù)據(jù)的地方。而你通常得到是這樣的:

?

你會(huì)在那里獲得很多有趣的信息。我已經(jīng)強(qiáng)調(diào)了與我們的用例非常相關(guān)的部分:

?用戶(user):將消息發(fā)送到我們聊天機(jī)器人的用戶的ID;

?文本(text):消息的文本;

?頻道(channel):發(fā)送消息的頻道的ID,基本上是用戶和機(jī)器人之間的私人聊天流。

我希望在函數(shù)中包含上述兩個(gè)功能,我可以通過下面的代碼來實(shí)現(xiàn):

"""

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"

請(qǐng)注意:生產(chǎn)代碼必須驗(yàn)證Slack在請(qǐng)求中發(fā)送的令牌。出于簡單性的考慮,我在代碼中省略了這一點(diǎn),但是我認(rèn)為你應(yīng)該看看尼古拉斯的評(píng)論從而獲得更多的信息。

我們引用了機(jī)器人OAuth令牌的環(huán)境變量,所以讓我們?cè)诰庉嬈飨聦?duì)它進(jìn)行定義:

最后,我們還要為函數(shù)創(chuàng)建一個(gè)適當(dāng)?shù)慕巧O蛳聺L動(dòng)到Lambda函數(shù)處理程序和角色部分,然后從“角色”下拉列表中選擇“創(chuàng)建自定義角色”。打開一個(gè)瀏覽器標(biāo)簽,然后你可以在這個(gè)新頁面上創(chuàng)建一個(gè)新的非?;镜慕巧?/p>

單擊“允許”,則上一個(gè)表單將自動(dòng)填充:

?

這就是我們的Lambda函數(shù)。那么讓我們回到API網(wǎng)關(guān)資源中去進(jìn)行相應(yīng)的操作。

Joining the dots

我們需要配置資源,以便它處理POST請(qǐng)求。再次單擊“操作”按鈕,繼而選擇“創(chuàng)建方法”,然后單擊已出現(xiàn)的新下拉字段并選擇“POST”。最后點(diǎn)擊勾號(hào)圖標(biāo)。

選擇“Lambda函數(shù)”作為集成類型(如果尚未成功),那就在“Lambda Region”中選擇最適合你的。當(dāng)我在愛爾蘭居住時(shí)選擇了“eu-west-1”。輸入“handleBotEvent”作為Lambda函數(shù)的名稱。

單擊“保存”。一個(gè)即將出現(xiàn)的彈出窗口會(huì)通知你為新的Lambda函數(shù)給出API網(wǎng)關(guān)權(quán)限。到這里,我們的工作就做的差不多了。

你應(yīng)該結(jié)束以下工作流程:

?

部署API,它將通過特定的網(wǎng)址來獲得。單擊“操作”,然后單擊“部署API”。

?

在被要求選擇部署階段時(shí),創(chuàng)建一個(gè)新的名為“dev”并進(jìn)行部署!

一旦你這樣做了之后,我們就最終可以得到我們真正想要的:“請(qǐng)求URL”,這里被稱為“Invoke URL”:

我們默認(rèn)啟用HTTPS

重要:你需要“事件處理程序”資源的URL,而不是根資源!展開樹形圖,然后點(diǎn)擊綠色的POST鏈接即可。

復(fù)制鏈接網(wǎng)址。

我們的工作差不多完成了。方程的AWS部分已經(jīng)得到妥善處理?,F(xiàn)在我們需要將機(jī)器人訂閱到正確類型的事件,返回到Slack API事件訂閱頁面。

啟用Slack直接郵件事件并將URL粘貼到“請(qǐng)求URL”字段中。你可能會(huì)立即收到一條警告消息,稱該網(wǎng)址沒有正確回復(fù)由Slack API發(fā)起的挑戰(zhàn)。

?

到底是怎么回事? Slack API謹(jǐn)慎地向你剛剛定義為“請(qǐng)求URL”的新網(wǎng)址發(fā)送一次性挑戰(zhàn)請(qǐng)求。該挑戰(zhàn)包含一段隨機(jī)的字符串,而我們的API預(yù)期在響應(yīng)中使用相同的字符串進(jìn)行響應(yīng)??磥砦覀冃枰薷拇a,以便處理這種情況。

我們應(yīng)該回到Lambda函數(shù)的代碼部分,并在函數(shù)的詞法頂部添加以下條件語句(標(biāo)粗部分):

?

這部分應(yīng)該妥善處理。保存該函數(shù)并返回到“啟用事件”頁面,然后單擊“重試”。現(xiàn)在進(jìn)行的驗(yàn)證應(yīng)該成功了:

向下滾動(dòng)到“訂閱機(jī)器人事件”部分,然后單擊“添加機(jī)器人用戶事件”按鈕。選擇message.im作為事件類型:

保存你的更改并返回到Slack團(tuán)隊(duì)頻道。機(jī)器人應(yīng)該耐心等待:

發(fā)送一條直接消息,而你應(yīng)該會(huì)從機(jī)器人那里獲取反轉(zhuǎn)的文本。

點(diǎn)擊這里獲得本教程的完整代碼。

結(jié)論

我不得不說我不喜歡在Lambda的受限編輯器中編寫Python代碼。這可能就是為什么最近推出了一個(gè)更全面的Web IDE和開發(fā)工具包。不過,我想說的是,一旦你腦海里有了想法和思路(如Slack API不接受JSON有效載荷等)之后,創(chuàng)建一個(gè)基本的機(jī)器人,也就是一件非常簡單的事情了。

那么該從哪里著手呢?我可能會(huì)看看Lex,觀察它是如何進(jìn)行集成的,也可能會(huì)得到一個(gè)數(shù)據(jù)存儲(chǔ),從而給機(jī)器人一個(gè)記憶。在接下來的日子里,我還打算嘗試由AWS贊助的,用于AWS的Python微框架Chalice。

我希望這個(gè)教程對(duì)你來說是有用的。

歡迎加入本站公開興趣群

軟件開發(fā)技術(shù)群

興趣范圍包括:Java,C/C++,Python,PHP,Ruby,shell等各種語言開發(fā)經(jīng)驗(yàn)交流,各種框架使用,外包項(xiàng)目機(jī)會(huì),學(xué)習(xí)、培訓(xùn)、跳槽等交流

QQ群:26931708

Hadoop源代碼研究群

興趣范圍包括:Hadoop源代碼解讀,改進(jìn),優(yōu)化,分布式系統(tǒng)場景定制,與Hadoop有關(guān)的各種開源項(xiàng)目,總之就是玩轉(zhuǎn)Hadoop

QQ群:288410967?

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/4238.html

相關(guān)文章

  • 何用AWS編寫一個(gè)服務(wù)器Slack 聊天機(jī)器人

    摘要:提供任何功能的打包服務(wù),比如我們即將去構(gòu)建的聊天機(jī)器人。而聊天機(jī)器人的工作方式如下用戶向聊天機(jī)器人發(fā)送一個(gè)直接聊天消息表示該消息的事件已發(fā)布如果機(jī)器人訂閱了該類型的事件,則將包含該聊天消息相關(guān)信息的請(qǐng)求發(fā)送到位于給定上的資源中。最近,圍繞Serverless架構(gòu)的討論不絕于耳…… 即使你以前從未聽說過這個(gè)詞匯,沒關(guān)系,這并不會(huì)有什么影響。其實(shí),serverless就是指專門使用云服務(wù)構(gòu)...

    instein 評(píng)論0 收藏0
  • 來 DIY 個(gè)機(jī)器人 - 收藏集 - 掘金

    摘要:能不能省掉這些煩瑣的步驟,讓開發(fā)人員自己完成呢現(xiàn)在好了,你可以用和把聊天機(jī)器人接入微信工具資源掘金今晚看了個(gè)電影,回得有點(diǎn)遲。 小花貓-網(wǎng)頁聊天機(jī)器人 - 前端 - 掘金 基于圖靈機(jī)器人API的網(wǎng)頁聊天機(jī)器人,輸入二維碼+你要說的話有驚喜哦~~~(菜單中的功能尚未開發(fā)完成,玩玩聊天功能就好了~)代碼開源在https://github.com/ColorfulCa... 了~... (英...

    mrli2016 評(píng)論0 收藏0
  • 前端每周清單第 38 期: Node 9 發(fā)布,Kotlin 與 React,Netflix 架構(gòu)解

    摘要:發(fā)布本周正式發(fā)布,包含了一系列的特性提升與問題修復(fù),同時(shí)也在不斷致力于將打造地更為輕巧與高性能。當(dāng)然,姜振勇老師還會(huì)介紹的多種服務(wù),包括大數(shù)據(jù)網(wǎng)絡(luò)和安全,展現(xiàn)彈性安全和高可擴(kuò)展性的全方位能力。 showImg(http://upload-images.jianshu.io/upload_images/1647496-2ce7598e6987d9af.jpg?imageMogr2/aut...

    Carbs 評(píng)論0 收藏0
  • 系統(tǒng)架構(gòu)

    強(qiáng)力推薦!那些你不能錯(cuò)過的 GitHub 插件和工具 以代碼托管平臺(tái)起家的 GitHub 網(wǎng)站,已然成為全球程序員工作和生活中不可或缺的一份子。從優(yōu)秀的企業(yè),到優(yōu)秀的程序員,都將自己最優(yōu)秀的代碼作品存放在這片開源凈土里,供彼此學(xué)習(xí)交流。 GitHub Trending 欄目甚至已經(jīng)成為 IT 從業(yè)人員的新聞日?qǐng)?bào),每日必讀。在之前的一… PostgreSQL 數(shù)據(jù)庫的前世今生 編輯:IT大咖說閱讀字...

    Gilbertat 評(píng)論0 收藏0
  • 系統(tǒng)架構(gòu)

    強(qiáng)力推薦!那些你不能錯(cuò)過的 GitHub 插件和工具 以代碼托管平臺(tái)起家的 GitHub 網(wǎng)站,已然成為全球程序員工作和生活中不可或缺的一份子。從優(yōu)秀的企業(yè),到優(yōu)秀的程序員,都將自己最優(yōu)秀的代碼作品存放在這片開源凈土里,供彼此學(xué)習(xí)交流。 GitHub Trending 欄目甚至已經(jīng)成為 IT 從業(yè)人員的新聞日?qǐng)?bào),每日必讀。在之前的一… PostgreSQL 數(shù)據(jù)庫的前世今生 編輯:IT大咖說閱讀字...

    k00baa 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<