저기압 두통이 심해서 lambda로 슬랙 두통을 표시하는 앱을 만들었어요

완성


결국 이렇게 될 거야.

두통


저기압 두통이 심하다.오늘도 저기압 때문에 몸 상태가 안 좋아요.
다행히 두통 환자를 대상으로 두통 카페라는 도구가 공개됐다.
https://zutool.jp/
고마워요 폴크스 주식회사...
그럼에도 불구하고 매번 골치 아픈 사이트를 보러 갈 때마다 번거롭다.
따라서 슬랙으로 표시할 수 있습니다.
구성은 다음과 같다.간단히

https://github.com/ShuzoN/zut/blob/master/index.js
코드를 여기에 놓으세요.
자세한 설치 생략
  • 두통 API 사용법
  • awslambda에 대한 디버깅
  • 슬랙 앱을 통한 협업
  • 모방할 수 있도록 큰 틀을 쓰는 방법.

    두통 API 사용법



    xhr가 두통 사이트에서 개발자 도구를 열어 디지털 path에 대한 요구를 보냅니다.
    이것은 날씨, 기압 정보의 요구이다.

    위치:


    예를 들어 도쿄 도부시의 상황은 다음과 같다.
    https://zutool.jp/api/getweatherstatus/13208
    
    {place_name: "東京都調布市", place_id: "208", prefectures_id: "13", dateTime: "2020-11-13 22",}
    
    어쨌든prefectures_id + place_idurl로 디자인된 것 같아요.
    13209를 시도하면東京都町田市.
    이런 느낌으로 대체로 연호라서 컬에서 문의드렸는데 이번에는 도쿄도 내 아이디를 산출했습니다.
    대응하면 이런 느낌.
    "千代田": 13101
    "中央": 13102
    "港": 13103
    "新宿": 13104
    ...
    
    도쿄도내 대응표: https://github.com/ShuzoN/zut/blob/master/locations.js

    어제 오늘 내일 모레


    마치다시를 예로 들다.
    1시에 방송하면 어제, 오늘, 내일, 모레의 날씨와 기압을 없앨 수 있다.
    여기서는 생략했지만 0-23시 사이에는 1시간 간격으로 정보를 얻을 수 있다.
    $ curl https://zutool.jp/api/getweatherstatus/13209 | jq
    {
      "place_name": "東京都町田市",
      "place_id": "209",
      "prefectures_id": "13",
      "dateTime": "2020-11-13 22",
      "yesterday": [
        {
          "time": "0",
          "weather": "100",
          "temp": "7.1",
          "pressure": "1033.4",
          "pressure_level": "0"
        },
        ...
        {
          "time": "23",
          "weather": "200",
          "temp": "10.8",
          "pressure": "1030.1",
          "pressure_level": "4"
        }
      ],
      "today": [
        ...
      ],
      "tommorow": [
        ...
      ],
      "dayaftertomorrow": [
        ...
      ]
    }
    
    

    날씨와 기압 수준



    방금 요청한 시간마다 아래 정보를 얻을 수 있습니다.
  • 날씨
  • 온도
  • 기압
  • 기압수준
  • 날씨와 기압 등급은 두통 특유의 마술 번호에 부합한다.
    이것에 관해서는 slack 그림 문자에 대응해서 처리합니다.
        {
          "time": "0",
          "weather": "100",
          "temp": "7.1",
          "pressure": "1033.4",
          "pressure_level": "0"
        }
    
    날씨는 다음과 같습니다.https://github.com/ShuzoN/zut/blob/master/weather.js

    exports.get = function (weatherType) {
      if (weatherType === "100") { // 晴
        return ":sunny:";
      }
      if (weatherType === "200") { // 曇り
        return ":cloud:";
      }
      if (weatherType === "300") { // 雨
        return ":umbrella:";
      }
    
      return ":innocent:"; // 例外
    };
    
    기압수준은 다음과 같다.

    (1 본가의 머리가 아파도 ok이기 때문에 적합하다)
    exports.get = function (pressureLevelType) {
      if (pressureLevelType === "0") { // 🆗
        return ":ok:";
      }
      if (pressureLevelType === "1") { // 🆗 
        return ":ok:";
      }
      if (pressureLevelType === "2") { // ⤵︎
        return ":arrow_heading_down:";
      }
      if (pressureLevelType === "3") { // ⚠️
        return ":warning:";
      }
      if (pressureLevelType === "4") { // 💣
        return ":bomb:";
      }
    
      return ":innocent:"; // 例外 😇
    };
    

    성형하여 청산하다.


    그리고 머리가 아파서 정보를 얻는 거야-> 성형하면 ok
    코드: https://github.com/ShuzoN/zut/blob/master/zutool.js
    이번에는 근무 시간에 따라 당일 8~20시 날씨, 기압 정보를 성형했다.
    exports.formatter = function (json) {
        return json.today
          .filter((h) => h.time > 7 && h.time < 21)
          .map((h) => {
            return `${h.time}${weather.get(h.weather)} ${h.temp}${
              h.pressure
          }hPa ${pressureLevel.get(h.pressure_level)}`;
        });
    }
    

    aws lambda에 대한 디자인


    파일 zip


    lambda를 운행 환경으로 사용합니다.
    이번에 js에서 실시합니다.1script는 읽을 수 없어서 파일 분할을 진행 중입니다.
    여러 파일을 처리하기 위해서는 zip화가 필요합니다
    프로젝트 경로에서 다음 명령을 실행합니다.
    프로젝트명zut으로 제작하여 무엇이든 좋습니다.
    $ zip -r zut.zip .
    

    aws lambda를 통해 함수 만들기


    이런 느낌으로 node12를 만들어 움직이는 lamba.


    zip 파일을 업로드합니다.
    이번에는 설계 절차를 조립하지 않고 수동으로 완성했다.

    awsapi gateway에서 단점 만들기


    lambda의 디자인만api로 작업할 수 없습니다.
    터치하면api gateway를 추가합니다.

    api 제작 후/zut2 경로에post방법 추가

    이렇게 하면post 요청에 대응할 수 있다.
    골문은 슬랙에서 들려온 포스트 리퀘스트다.
    슬랙의 Outgoing WebHooks는 application/x-www-form-urlencoded가 보냈기 때문에 이에 대응한다.
    병합 요청으로 이동

    맵 템플릿을 (으)로 설정합니다.
    이것은 http 콘텐츠 type을 보고 지정한 템플릿에 따라 lambda에 보내는 정보를 바꾸는 기능입니다.

    application/x-www-form-urlencoded
    
    ##  See http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-mapping-template-reference.html
    ##  This template will pass through all parameters including path, querystring, header, stage variables, and context through to the integration endpoint via the body/payload
    #set($allParams = $input.params())
    {
    "body-json" : {"body" :$input.json('$')},
    "params" : {
    #foreach($type in $allParams.keySet())
        #set($params = $allParams.get($type))
    "$type" : {
        #foreach($paramName in $params.keySet())
        "$paramName" : "$util.escapeJavaScript($params.get($paramName))"
            #if($foreach.hasNext),#end
        #end
    }
        #if($foreach.hasNext),#end
    #end
    },
    "stage-variables" : {
    #foreach($key in $stageVariables.keySet())
    "$key" : "$util.escapeJavaScript($stageVariables.get($key))"
        #if($foreach.hasNext),#end
    #end
    },
    "context" : {
        "account-id" : "$context.identity.accountId",
        "api-id" : "$context.apiId",
        "api-key" : "$context.identity.apiKey",
        "authorizer-principal-id" : "$context.authorizer.principalId",
        "caller" : "$context.identity.caller",
        "cognito-authentication-provider" : "$context.identity.cognitoAuthenticationProvider",
        "cognito-authentication-type" : "$context.identity.cognitoAuthenticationType",
        "cognito-identity-id" : "$context.identity.cognitoIdentityId",
        "cognito-identity-pool-id" : "$context.identity.cognitoIdentityPoolId",
        "http-method" : "$context.httpMethod",
        "stage" : "$context.stage",
        "source-ip" : "$context.identity.sourceIp",
        "user" : "$context.identity.user",
        "user-agent" : "$context.identity.userAgent",
        "user-arn" : "$context.identity.userArn",
        "request-id" : "$context.requestId",
        "resource-id" : "$context.resourceId",
        "resource-path" : "$context.resourcePath"
        }
    }
    
    네, 아래 경로로post body를 비추십시오.
    {"body-json" : {"body" :$input.json('$')}}
    
    API에 대한 프로그램을 잊어버리면 반영되지 않으므로 주의하십시오.

    $ curl https://<your>.execute-api.ap-northeast-1.amazonaws.com/default/zut2 -d '{"text": "渋谷"}'
    
    
    {"response_type":"in_channel","blocks":[{"type":"section","text":{"type":"mrkdwn","text":"8時 :sunny: 15.7℃ 1026hPa :ok:\n9時 :sunny: 16.8℃ 1026.4hPa :ok:\n10時 :sunny: 17.8℃ 1026.3hPa :ok:\n11時 :sunny: 18.6℃ 1026hPa :ok:\n12時 :sunny: 19.3℃ 1025.4hPa :ok:\n13時 :sunny: 19.7℃ 1025hPa :ok:\n14時 :sunny: 19.9℃ 1025.1hPa :ok:\n15時 :sunny: 19.5℃ 1025.5hPa :ok:\n16時 :sunny: 18.6℃ 1026.2hPa :ok:\n17時 :sunny: 17.2℃ 1027.1hPa :ok:\n18時 :sunny: 15.7℃ 1028hPa :ok:\n19時 :sunny: 14.2℃ 1028.9hPa :ok:\n20時 :sunny: 12.8℃ 1029.6hPa :ok:"}}]}%  
    
    이렇게 curl - aws apigateway + lambda - 頭痛ーる의 합작이 끝났다.

    slack 및 aws lambda 링크


    https://api.slack.com/apps/
    슬랙 앱을 만듭니다.zut라고도 하죠.Slash Commands -> create new command.
    request url 방금 만든 awsapi gateway의 url을 입력하십시오.

    이렇게 하면 완성된다.다음은 워크스페이스에 대한 로그인입니다.install app -> install app to workspace와 추가 워크스페이스에 응용 프로그램을 넣으려고 시도합니다.
    대상의workspace에 /zut를 입력하면 해당 시내의 이름이 나온다.
    그리고 /zut 渋谷처럼 치면 사용할 수 있어요.

    대단히 기쁘다.그러니까 이번엔 여기까지.
    여러분도 한번 써보세요.

    좋은 웹페이지 즐겨찾기