成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

Serverless! 使用 AWS 開(kāi)發(fā) Slack Slash Commands

warnerwu / 2790人閱讀

摘要:本文介紹如何使用搭建一個(gè)不需要伺服器的環(huán)境,提供查詢豆瓣電影。在輸入絕地救援,會(huì)顯示相關(guān)的電影資料。特別感謝寫(xiě)的文章本文同步分享於

本文介紹如何使用 AWS Lambda & AWS API Gateway 搭建一個(gè)不需要伺服器的環(huán)境,提供 Slack Slash Commands 查詢豆瓣電影。

在 Slack 輸入 /movie 絕地救援,會(huì)顯示相關(guān)的電影資料。

這篇文章使用到的技術(shù):

Slack Slash Commands

AWS Lambda

AWS API Gateway

豆瓣電影 API

閱讀這篇文章需要具備什麼能力:

Node.js 的基本能力

Amazon Web Services 的基本操作

接下來(lái)我會(huì)逐步講解這些東西:

Slack Slash Commands 的運(yùn)作機(jī)制

建立一個(gè)簡(jiǎn)單的 AWS Lambda function

建立一個(gè)簡(jiǎn)單的 AWS API Gateway 執(zhí)行 Lambda function

使用 Lambda 呼叫豆瓣電影 API

測(cè)試 AWS API Gateway

將 API Gateway endpoint 加入至 Slack Slash Command

Slack Slash Commands 的運(yùn)作機(jī)制

當(dāng)你在 Slack channel 輸入 /movie 權(quán)力的遊戲,Slack 會(huì)發(fā)出一個(gè) content-type Header 設(shè)為 application/x-www-form-urlencoded 的 HTTP POST 請(qǐng)求,格式如下:

token=YOUR_SLASH_COMMAND_TOKEN
team_id=YOUR_TEAM_ID
team_domain=YOUR_TEAM_DOMAIN
channel_id=YOUR_CHANNEL_ID
channel_name=YOUR_CHANNEL_NAME
user_id=YOUR_USER_ID
user_name=YOUR_USER_NAME
command=/movie
text=權(quán)力的遊戲
response_url=YOUR_HOOK_URL

然後 Slack 需要收到的 JSON 回應(yīng)格式如下(詳見(jiàn) Attachments):

{
  "response_type": "in_channel",
  "attachments": [
    {
      "title": "權(quán)力的遊戲 第五季",
      "title_link": "http://movie.douban.com/subject/25826612/",
      "text": "Game of Thrones
2015年",
      "fields": [
        {
          "title": "導(dǎo)演",
          "value": "Michael Slovis
...",
          "short": true
        }, ...
      ],
      "thumb_url": "https://img1.doubanio.com/view/movie_poster_cover/ipst/public/p2230256732.jpg"
    }
  ]
}

responsetype: inchannel 表示 channel 內(nèi)的使用者都可以看見(jiàn),若只想給使用命令的本人看的話可以改成 ephemeral
Slack Slash Commands 有 3000 ms 的 response timeout 限制

建立一個(gè)簡(jiǎn)單的 AWS Lambda function

前往 AWS Lambda

點(diǎn)選 Create a Lambda function

填寫(xiě) Configure function,例:slackFunction

Runtime 選擇 Node.js

Code entry type 選擇 Edit code inline,輸入簡(jiǎn)單的測(cè)試程式碼:

exports.handler = function(event, context) {
  context.succeed("你好世界!");
};

Role 使用 lambdabasicexecution

點(diǎn)選 Next 完成建立

點(diǎn)選 Test 測(cè)試結(jié)果:

你好世界!
建立一個(gè)簡(jiǎn)單的 AWS API Gateway 執(zhí)行 Lambda function

前往 AWS API Gateway

點(diǎn)選 New API

填寫(xiě) API name,例:Slack API

點(diǎn)選 Create API 完成新增

點(diǎn)選 Create Resource

填寫(xiě) Resource Name & Resource Path,例:movie

點(diǎn)選 /movie

點(diǎn)選 Create Method

選擇 POST

Integration type 選擇 Lambda Function

11. 選擇 Lambda Region
12. 填寫(xiě) Lambda Function,例:slackFunction
13. 點(diǎn)選 Save 完成建立
14. 點(diǎn)選 Test 測(cè)試結(jié)果:

你好世界!
使用 Lambda 呼叫豆瓣電影 API

豆瓣電影搜索 API 的格式如下:

GET https://api.douban.com/v2/movie/search?q={text}

例:https://api.douban.com/v2/movie/search?q=權(quán)力的遊戲

{
  "count": 20,
  "start": 0,
  "total": 130,
  "subjects": [
    {
      "rating": {...},
      "genres": [...],
      "collect_count": 47770,
      "casts": [
        {...}, ...
      ],
      "title": "權(quán)力的游戲 第五季",
      "original_title": "Game of Thrones",
      "subtype": "tv",
      "directors": [
        {...}, ...
      ],
      "year": "2015",
      "images": {...},
      "alt": "http://movie.douban.com/subject/25826612/",
      "id": "25826612"
    }, ...
  ],
  "title": "搜索 "權(quán)力的遊戲" 的結(jié)果"
}

取代 Edit code inline,在本地建立一個(gè) Node.js Lambda project:

$ npm init

加入一個(gè)支持 promise 的 XMLHttpRequest 庫(kù):

$ npm install request-promise --save

新增 index.js:

var rp = require("request-promise");
exports.handler = function(event, context) {
  // 從傳進(jìn)來(lái)的參數(shù)之中提取要搜尋的字串
  var text = event.text ? event.text.trim() : null;

  // 向豆瓣 API 發(fā)出 HTTP GET 請(qǐng)求
  rp("https://api.douban.com/v2/movie/search?q=" + text)
    .then(function(data) {
      // 回傳成功的結(jié)果
      context.succeed(data);
    }).catch(function(error) {
      // 回傳失敗的結(jié)果
      context.fail(error);
    });
};

將檔案壓縮成 lambda.zip:

./index.js
./node_module/request-promise

回到 AWS Lambda

點(diǎn)選之前建立的 function,例:slackFunction

將 Code entry type 從 Edit code inline 改為 Upload a .ZIP file

上傳 lambda.zip

點(diǎn)選 Actions > Configure test event,加入測(cè)試用的請(qǐng)求

{
  "text": "權(quán)力的遊戲"
}

點(diǎn)選 Test 測(cè)試豆瓣回應(yīng)的結(jié)果:

{
  // ...
  "subjects": [
    {
      // ...
      "title": "權(quán)力的游戲 第五季",
      // ...
    }, ...
  ],
  "title": "搜索 "權(quán)力的遊戲" 的結(jié)果"
}
測(cè)試 AWS API Gateway

回到 AWS API Gateway

點(diǎn)選 /movie 的 POST method

點(diǎn)選 Test,並在 Request Body 加入測(cè)試用的請(qǐng)求:

{
  "text": "權(quán)力的遊戲"
}

點(diǎn)選 Test 測(cè)試 Lambda 回應(yīng)的豆瓣結(jié)果:

{
  // ...
  "subjects": [
    {
      // ...
      "title": "權(quán)力的游戲 第五季",
      // ...
    }, ...
  ],
  "title": "搜索 "權(quán)力的遊戲" 的結(jié)果"
}
將 API Gateway endpoint 加入至 Slack Slash Command

因?yàn)?Slack 發(fā)送的請(qǐng)求 Header 格式是 application/www-form-urlencoded,所以需要在 AWS API Gateway 之中將它轉(zhuǎn)換成為 application/json 格式:

點(diǎn)選 /movie 的 POST method

點(diǎn)選 Method Execution

點(diǎn)選 Integration Request

點(diǎn)選 Mapping Templates

點(diǎn)選 Add mapping template

Content-Type 填寫(xiě) application/www-form-urlencoded

將 Input passthrough 改成 Mapping template

貼上 Ryan Ray 提供的 template gist

Save

最後,一定要記得把 API Gateway 部署給外部使用:

點(diǎn)選 Deploy API

Deployment stage 選擇 New Stage

填寫(xiě) Stage name,例:development

點(diǎn)選 Deploy 完成發(fā)佈

然後會(huì)得到一個(gè) Invoke URL 格式如下:

https://{hash}.execute-api.{region}.amazonaws.com/{stage}/movie

接下來(lái)的步驟,把 AWS API Gateway endpoint 整合進(jìn) Slack:

前往 https://YOURTEAMDOMAIN.slack.com/apps/manage

在 Search app directory 搜尋框輸入 Slash Commands 並進(jìn)入

點(diǎn)選 Add Configuration

填寫(xiě) Choose a Command,例:/movie

點(diǎn)選 Add Slash Command Integration

填寫(xiě) URL,貼上 AWS API Gateway Invoke URL

Method 選擇 POST

點(diǎn)選 Save Integration 完成新增

最後一個(gè)步驟,更新 Lambda function,讓它可以處理 Slack 的請(qǐng)求與回應(yīng):

var rp = require("request-promise");
exports.handler = function(event, context) {
  /**
   * event 會(huì)收到來(lái)自 AWS API Gateway 轉(zhuǎn)換過(guò)的 Slack POST JOSN
   * {
   *   token=YOUR_SLASH_COMMAND_TOKEN
   *   team_id=YOUR_TEAM_ID
   *   team_domain=YOUR_TEAM_DOMAIN
   *   channel_id=YOUR_CHANNEL_ID
   *   channel_name=YOUR_CHANNEL_NAME
   *   user_id=YOUR_USER_ID
   *   user_name=YOUR_USER_NAME
   *   command=/movie
   *   text=權(quán)力的遊戲
   *   response_url=YOUR_HOOK_URL
   * }
   */
  if(event.token !== "YOUR_SLASH_COMMAND_TOKEN") {
    return context.fail("未經(jīng)授權(quán)的請(qǐng)求");
  }
  var text = event.text ? event.text.trim() : null;

  // 向豆瓣 API 發(fā)出 HTTP GET 請(qǐng)求
  rp("https://api.douban.com/v2/movie/search?q=" + text)
    .then(function(data) {
      // 提取第一筆電影的結(jié)果
      var subject = data.subjects[0];
      // 將豆瓣 API 返回的結(jié)果包裝成 Slack 支持的格式
      var result = {
        "response_type": "in_channel",
        "attachments": [{
          "title": subject.title,
          "title_link": subject.alt,
          "text": subject.original_title+"
"+subject.year+"年",
          "fields": [
            {
              "title": "導(dǎo)演",
              "value": subject.directors[0].name,
              "short": true
            }
          ],
          "thumb_url": subject.images.small
        }]
      };
      // 回傳結(jié)果
      context.succeed(result);
    }).catch(function(error) {
      // 回傳失敗的結(jié)果
      context.fail(error);
    });
};

重新壓縮 lambda.zip 然後上傳

在 Slack channel 輸入 /movie 測(cè)試結(jié)果

總結(jié)

熟悉之後,稍微修改一下,把豆瓣 API 換成其它 API,又可以誕生出更多有趣的 Slash Commands!

2015/12/30: 更新範(fàn)例 GitHub repo Google 大神

因?yàn)?Slack 有 3 秒的回應(yīng)限制,所以 API 不穩(wěn)的話,常常容易發(fā)生 timeout,解決方法可以參考 Slack 提供的方式 Delayed responses and multiple responses,或是提高 Lambda 的 Memory(建議 512 以上),也可使用 AWS SNS 之類(lèi)的服務(wù)處理非同步的 Lambda invoke。

特別感謝 Ryan Ray 寫(xiě)的文章 Serverless Slack Integrations with node.js, AWS Lambda, and AWS API Gateway

本文同步分享於 Medium

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

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

相關(guān)文章

  • DevOps:持續(xù)整合 & 持續(xù)交付(Docker、CircleCI、AWS

    摘要:原文出處持續(xù)整合持續(xù)交付這篇文章將一步一步介紹如何使用與來(lái)完成持續(xù)整合與持續(xù)交付的開(kāi)發(fā)流程。前言什麼是持續(xù)整合持續(xù)交付持續(xù)整合持續(xù)交付,簡(jiǎn)稱,具體介紹可以參考山姆鍋對(duì)持續(xù)整合持續(xù)部署持續(xù)交付的定義這篇文章。 原文出處:DevOps:持續(xù)整合&持續(xù)交付(Docker、CircleCI、AWS) showImg(https://segmentfault.com/img/bVlxh...

    Euphoria 評(píng)論0 收藏0
  • 如何用AWS編寫(xiě)一個(gè)“無(wú)服務(wù)器”的Slack 聊天機(jī)器人?

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

    instein 評(píng)論0 收藏0
  • 如何用AWS編寫(xiě)一個(gè)“無(wú)服務(wù)器”的Slack 聊天機(jī)器人?

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

    piapia 評(píng)論0 收藏0
  • 使用Rancher和DroneCI建立超高速Docker CI/CD流水線

    摘要:本文作者為的架構(gòu)師,他分享了使用和建立超高速流水線的經(jīng)驗(yàn)。月日,北京海航萬(wàn)豪酒店,容器技術(shù)大會(huì)即將舉行。 Higher Education(highereducation.com)是一個(gè)連接學(xué)生與高校的入學(xué)申請(qǐng)平臺(tái),通過(guò)引入高意圖和高質(zhì)量的潛在學(xué)生,以及明確、有效的操作,為網(wǎng)站合作的大學(xué)吸引學(xué)生入學(xué)。每年Higher Education為其大學(xué)合作伙伴招收超過(guò)15000名在線學(xué)生入學(xué)申...

    dreamtecher 評(píng)論0 收藏0
  • 關(guān)于Serverless架構(gòu)及平臺(tái)選擇,你知道多少?

    摘要:初版在年月發(fā)布,隨后在月正式發(fā)布。架構(gòu)屬于平臺(tái)即服務(wù),針對(duì)事件驅(qū)動(dòng),短暫性的工作負(fù)載。架構(gòu)平臺(tái)選擇目前最有效構(gòu)建架構(gòu)方法是在眾多架構(gòu)平臺(tái)中選擇其一,并充分利用它所有的功能,以下將列舉幾個(gè)架構(gòu)平臺(tái)亞馬遜推出了第一個(gè)的云服務(wù)平臺(tái)。 showImg(https://segmentfault.com/img/remote/1460000009775604?w=640&h=356); 數(shù)人云近來(lái)...

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

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

0條評(píng)論

閱讀需要支付1元查看
<