Slack bot을 만들어서 Slack 채널의 소식을 한 채널에 집중시킬 수 있습니다.

제작의 배경으로 멤버들이 쓴 분보 채널이 있으면 채널에 나가지 않아도 같이 확인할 수 있으면 좋겠다고 생각해서 해봤어요.
슬랙의 지보가 회사 내 트위터에!여러분의 분류를 한 채널로 모으는 슬랙봇을 만들어 봤습니다.
https://zenn.dev/ryo_kawamata/articles/times-all-bot
의 표절은 GAS판 투고일 뿐이다.

생성물


https://github.com/igara/bot_slack_matome_channnel

집합하고 싶지 않은 채널에서 무시할 수 있는 옵션을 만들었습니다.
GAS이기 때문에 사용 횟수 제한이 있으니 주의해야 한다.
https://developers.google.com/apps-script/guides/services/quotas
2021/04/20시
Feature
Consumer (e.g., gmail.com) and G Suite free edition(legacy)
Google Workspace accounts
Triggers total runtime
90 min/day
6 hr/day
URL Fetch calls
20,000/day
100,000/day
이런 내용이 기재돼 있기 때문에 GAS가 아닌 규모감에 따라 구현하는 방식이 좋다.
Trigger는 Spreadsheet에 Slack 정보를 캐시하는 데 사용
URL Fetch는 슬랙에서 정보를 재생하기 위해 사용되며, 상기 상한선이 엄격하다고 생각되면 이 기사를 참고하지 않는 것이 좋다.

설정


Slack 프로그램의 scope 설정


https://api.slack.com/apps에서 애플리케이션 생성
OAuth &Permissions 화면에서 Bot User에 아래의 scope를 추가합니다.
  • channels:history
  • channels:read
  • chat:write
  • users.profile:read
  • users:read
  • users:read.email
  • 사용자의 scope는 Spreadsheet에 메시지를 남길 때 메일 주소와 Google Workspace의 연합은 보기에 매우 가벼운 미래 실물로 보이기 때문에 주제에서 필요없는 scope입니다.

    설정이 완료되면 OAuth & Permissions 화면 상단의 Bot User OAuth Token 값을 복제합니다.

    GAS 프로젝트 만들기


    다음 명령에 따라 소스를 가져오시오.
    git clone https://github.com/igara/bot_slack_matome_channnel.git
    cd bot_slack_matome_channnel
    
    환경 변수에 적응한다.
    cp .env.sample.ts .env.ts
    
    export default {
      // Slackのチーム名
      SLACK_TEAM: "hoge",
      // OAuth & Permissionsのページに記載されてたBot User OAuth Token
      SLACK_ACCESS_TOKEN: "xoxb-xxxxx-xxxxx-xxxxx",
      // メッセージを送りたい対象のチャンネル名
      BOT_SLACK_MATOME_CHANNEL_NAME: "bot_slack_matome_channnel",
      // 集約したい対象のチャンネル名の正規表現 下記は分報チャンネル想定
      TARGET_CHANNEL_REGEXES: [/^t_\S*/, /^time_\S*/],
      // TARGET_CHANNEL_REGEXESの中から除外したいチャンネルの正規表現
      IGNORE_TARGET_CHANNEL_REGEXES: [/^t_ignore_\S*/, /^time_ignore_\S*/],
    };
    
    다음 명령에 따라 Spreadsheet & GAS 만들기
    npm install
    
    # login
    npx clasp login
    
    # new create spreadsheet & script project & .clasp.json
    npm run new name=hoge
    
    # build
    npm run build
    # push
    npx clasp push
    
    위의 작업을 수행하면 Spreadsheet이 만들어지고 스크립트 편집을 열면 GAS가 추가됩니다.


    Spreadsheet에서 Slack 정보 읽기


    스크립트 편집기에서 다음 함수를 실행하여 Spreadsheet에서 Slack 정보를 유지합니다.

  • create_sheets.ts.gs의createSheets를 실행하여 필요한 작업표를 작성합니다

  • get_channels.ts.gs의 getChannels를 실행하고 워크시트에 채널 정보를 남기기

  • get_users.ts.gs의 getUsers를 실행하고 작업표에 사용자의 정보를 남기기
  • 스크립트 편집을 거치지 않고 실행하는 방법으로
    https://qiita.com/jiroshin/items/dcc398285c652554e66a#로컬
    Google Cloud Console과 직접 만든 Clape이 로그인하면
    npx clasp run createSheets
    npx clasp run getChannels
    npx clasp run getUsers
    
    명령을 사용하여 수행할 수 있습니다.
    이 시점의 Google 애플리케이션의 범위 설정은 이쪽에서 해야 합니다.
    https://github.com/igara/bot_slack_matome_channnel/blob/master/dist/appsscript.json#L14-L29

    웹 응용 프로그램 공개


    스크립트 편집기 메뉴에서 공개 -> 웹 프로그램으로 가져온 후 업데이트 실행

    공개된 웹 응용 프로그램의 URL을 복사합니다.

    Slack의 Event Subscriptions에 로그인


    Request URL에 공개된 GAS의 웹 응용 프로그램 URL을 붙여 Verified가 표시되는지 확인합니다.

    확인 후 Subscribe to bot events 항목
  • message.channels
  • 등록.

    이상 설정이 완료되었습니다.
    Slack을 통해 대상 채널을 만들고 정보를 발표합니다.bot의 정보를 보내면 성공합니다.

    소스 코드 설명


    src/tasks/create_clasp_json.ts


    맞춤형https://github.com/google/clasp#create
    Spreadsheet과 스크립트 편집자의 이름을 같이 넣고 싶어서 만든 거예요.

    src/gas/create_sheets.ts


    GAS용 함수
    GAS를 통한 워크시트 작성
    Spreadshhet.deleteSheet(Spreadshhet.getSheetByName("channels"));
    const channelsSheetColumnNames = ["id", "name"];
    const ChannelsSheet = Spreadshhet.insertSheet("channels");
    ChannelsSheet.getRange(1, 1, 1, channelsSheetColumnNames.length).setValues([channelsSheetColumnNames]);
    
    의 삭제 후 워크시트 다시 만들기
    과거 Google API를 통해 CSV를 기반으로 워크시트를 제작한
    https://github.com/igara/spreadsheet_master/blob/master/src/tasks/recreate_spreadsheet.ts
    로컬 PC에서 실행하는 것보다 이번에는 GAS 환경에서 실행하고 싶습니다.

    src/gas/do_post.ts


    Slack의 Event Subscriptions를 통해 메시지를 요청하고 처리하는 GAS의 함수
    이번에 설정한 Event Subscriptions는 메시지의 업데이트 시스템도 밀렸기 때문에 제외하기 위해 다음과 같이 썼습니다.
    https://github.com/igara/bot_slack_matome_channnel/blob/master/src/gas/do_post.ts#L9-L23
    필요에 따라 제외된 것들을 활용해보는 것도 좋을 것 같아요.
    또한 GAS의 활용 범위

    src/gas/get_channels.ts


    GAS용 함수
    모든 채널을 보려면 Slack API 를 클릭하십시오.
    스크립트 편집기에서 정기적으로 실행되는 트리거를 설정할 수 있기 때문에 이 함수를 시간적으로 실행하는 것이 좋습니다
    트리거 설정도 인코딩하고 싶으면 아래 코드를 참고해도 될까요?안해봤어요.
    https://developers.google.com/apps-script/guides/triggers/installable#managing_triggers_programmatically

    src/gas/get_users.ts


    GAS용 함수
    모든 사용자를 보려면 Slack API를 클릭하십시오.

    src/utils/tasks/clasp_json.ts


    JSON 파일이라도 유형을 정의하고 싶은 생각이 강해서 ts 파일을 통해 읽을 예정입니다.

    src/utils/tasks/clasprc_json.ts


    JSON 파일이라도 유형을 정의하고 싶은 생각이 강해서 ts 파일을 통해 읽을 예정입니다.

    src/utils/tasks/google.ts


    Google API 클라이언트 처리

    좋은 웹페이지 즐겨찾기