Cloud Functions 및 Slash_command로 Slack에서 Connpass 정보 가져오기

소개



엔지니어가 참가하는 외부 공부회라고 하면, 대부분은 TechPlay나 Connpass등에서 찾아 응모하고 있는 것이 아닐까요.

참가 이벤트가 늘어나면, 각 이벤트 상세 화면에 가는 것이 귀찮게 하거나 합니다.
또, 상사나 선배, 자주 이벤트로 보이는 사람등이 어떤 이벤트에 가고 있는지 궁금하기도 합니다만, 이 근처도 일부러 쫓는 것은 멘도입니다.

그래서 슬래시 명령을 사용하여 언제든지 최신 참가 상황을 사람마다 Slack에서 일람 취득할 수 있도록 했습니다.

작성 절차



슬래시 명령



먼저 여기에서 Slash Command를 검색합니다.
그러면 다음과 같은 화면에 갈까 생각합니다.


Add Configration에서 다양한 설정을 수행합니다.

Integration Settings에서 주로 이용하는 항목은 다음과 같습니다.
  • Command ... 실제로 Slack에서 치는 명령 (이번에는 /connpass이라고합니다)
  • URL ··· 명령 실행시에 보내지는 Webhook (나중에 작성하는 Cloud Functions의 URL를 넣습니다)
  • Methods ... POST/GET (POST로 설정)
  • Token · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·
  • Customize Name ... Slack에 표시되는 Bot의 이름입니다
  • Customize Icon ... Slack에 표시되는 Bot 아이콘입니다

  • Cloud Functions



    Slash Command의 설정이 끝나면 다음은 실제로 코드를 작성합니다.
    서버리스로 만들고 싶기 때문에 GCP의 Cloud Functions를 이용합니다.

    Cloud Functions에 배포하는 방법은 크게 세 가지가 있습니다.
    - 인라인 편집기
    - Cloud Storage zip
    - Cloud Source 리포지토리

    빨리 만들려면 인라인 에디터를 사용하면 좋지만 이번에는 모듈을 이용하고 싶으므로 zip으로 배포합니다.

    디렉토리 구성


    |- node_modules/
    |- index.js
    |- package-lock.json
    └ package.json
    

    소스 코드



    connpass API의 node SDK를 만드는 분이 있으므로 그쪽을 이용했습니다.

    index.js
    const BOT_TOKEN = '(SlashCommandのToken)';
    const connpass = require("connpass");
    
    exports.getConnpass = (req, res) => {
        let returnMessage;
    
        if(req.body.token === BOT_TOKEN) {
            let text = "";
            //今月と来月のイベントのみに絞り込み
            const now = new Date();
            const thisMonth = ('0000' + now.getFullYear()).slice(-4) + ('00' + (now.getMonth()+1)).slice(-2);
            const nextMonth = ('0000' + now.getFullYear()).slice(-4) + ('00' + (now.getMonth()+2)).slice(-2);
            //検索したい人のユーザIDとSlack上への表示名を記入
            const users = [
                {id: 'userId1', name: '山本さん'},
                {id: 'userId2', name: '伊藤さん'},
                {id: 'userId3', name: '鈴木さん'},
                {id: 'userId4', name: '吉田さん'}
            ];
            getEvent(0);
    
            function getEvent(i) {
                connpass.get({order : 2, ym : `${thisMonth}, ${nextMonth}`, nickname : users[i].id})
                    .then((result) =>{
                        text += `${users[i].name}\n`;
                        result.events.forEach((event) => {
                            text += `${ event.started_at.slice(0, 10) } : <${event.event_url}|${event.title}> \n`;
                        });
    
                        if(++i < users.length) {
                            getEvent(i);
                        } else {
                            //Slackに返すオブジェクト
                            returnMessage = {
                                'response_type': 'in_channel',
                                'text': text
                            };
                            res.status(200).send(returnMessage)
                        }
                    })
                    .catch((error) => {
                        console.log(error);
                    });
            }
    
    
        } else {
            returnMessage = { 'text': '認証情報が異なります'};
            res.status(400).send(returnMessage);
        }
    };
    

    Slack에 대한 게시물은 개체의 text 필드 값을 메시지로 표시합니다.
    또한, response_type에서 in_channel를 지정하면 Bot의 회신이 전체 공개가 되고, response_type를 붙이지 않는 경우는 슬래시 커멘드를 친 본인만이 보이는 메세지가 됩니다.

    배포



    ⑴ 위의 4개의 파일/디렉토리를 압축하여 zip으로 합니다.

    여기에서 로그인하고 콘솔 → Cloud Functions로 이동합니다.

    ⑶ 함수를 작성합니다. 다음을 각각 설정합니다.
    - 이름
    - 할당된 메모리
    - 트리거(http 트리거로 합니다)
    - 소스 코드 (zip 업로드 선택)
    - zip 파일(압축된 zip 업로드)
    - 스테이지 버킷 (zip 파일을 넣을 위치를 선택하십시오)
    - 실행하는 함수 (exports.xxxxx의 부분입니다. 이번 예제라면 getConnpass입니다.)

    ⑷ 설정이 완료되면 저장하고 닫습니다.
    배포가 완료되는 데 몇 분이 걸릴 수 있습니다.

    ⑸ 마지막으로, 트리거가 되는 URL을 슬래시 커멘드의 URL에 기입해 종료입니다.

    동작 확인



    이제 Slack에서 슬래시 명령을 두드리면 Bot이 반환 할 수 있습니다.



    슬래시 커맨드는 이런 희망시에만 보러 가는 귀찮은 정보 취득에는 상당히 사용할 수 있는 것 같은 인상입니다.
    근태 입력 등에도 사용할 수 있을 것 같네요.

    좋은 웹페이지 즐겨찾기