Search

slack incoming webhook 만들기

subtitle
Tags
bot
Created
2021/01/27
2 more properties
incoming webhook을 사용하면 슬랙 외부에서도 특정 채널에 메시지를 보낼 수 있다.
webhook으로 메시지를 보내려면 JSON 데이터와 함께 http request로 요청하면 된다.
이때, text만 보내거나 'attachments'라고 하여 그냥 text보다 더 구조적인 데이터를 보낼 수 있다.
아래 사진에서 빨간색 줄로 표시된 *블록이 attachments이다.
block: slack document에서 많이 보게 될 용어이다. 메시지의 구성 요소 하나하나를 말한다. slack에서 block마다 사용할 수 있는 필드들이 정해져있다. block kit builder를 사용하면 메시지 템플릿도 고를 수 있고, 어떻게 block을 만들어야 하는지 확인할 수도 있다.
봇이 정기적으로 잔액을 조회한 뒤 채널에 알려준다.
1. 앱 생성
api.slack.com/apps 에서 앱 생성 ('create an app' 클릭)
workspace를 선택할 땐, 알림을 보내고 싶은 채널이 있는 워크스페이스를 선택한다.
만약 앱을 만든 워크스페이스가 아닌 다른 곳에 채널이 있다면 manage distribution에서 체크리스트를 채운 다음 active public distribution을 한 뒤 워크스페이스에 앱을 추가하면 된다. 이건 나중에 불특정 다수에게 DM을 보내는 슬랙봇도 포스팅할 예정인데, 거기서 다뤄보도록 하겠다.
2. 좌측 메뉴바 - basic information - display information 수정
앱이 어떻게 보여질지 수정하면 된다. 아이콘은 512*512 또는 2000*2000 픽셀 사이즈여야 하는데, image resize 사이트에서 원하는 이미지를 리사이징하고 넣는다. 이 과정을 안거치면 워크스페이스에 봇을 추가할 수 없다.
+ 이름이 마음에 안드는 경우 나중에 좌측 features 메뉴 - App Home - Your App's Presense 에서 변경 가능하다.
3. build incoming webook
스크롤을 올려서 add features and functionality - incoming webhook을 클릭한다.
activate incoming webhook의 스위치 on
맨 아래 Add new Webhook to Workspace 클릭한다.
workspace에서 봇이 메시지를 날릴 채널을 선택한다.
incoming-webhook 봇이 채널에 접근할 수 있도록 permission을 요청한다.
4. send message
channel을 추가하면 webhook url을 알 수 있다.
terminal 또는 postman으로 요청해서 메시지가 오는지 확인할 수 있다.
postman / webhook url에 요청한다.
5. attachments
좀 더 구조화된 메시지를 보내고 싶다면 text 대신 attachment를 사용한다.
{ "attachments": [ { "fallback": "요청 실패 시 보낼 메시지", "color": "#2eb886", "pretext": "attachment block 위에 나타낼 text", "author_name": "roseline", "author_link": "https://github.com/roseline124", "author_icon": "https://avatars.githubusercontent.com/u/41788121?s=460&u=ee6a6f6499aa68a23947cfb76d5e9cb6eebfd29c&v=4", "title": "attachments 사용법", "title_link": "https://api.slack.com/", "text": "attachment block 안에 보여줄 메시지", "fields": [ { "title": "필드", "value": "value", "short": false } ], "image_url": "http://my-website.com/path/to/image.jpg", "thumb_url": "http://example.com/path/to/thumb.png", "footer": "Slack API", "footer_icon": "https://platform.slack-edge.com/img/default_application_icon.png", "ts": 123456789 } ] }
JSON
복사
6. programmatic하게 메시지 보내기
정기적으로, 또는 특정 이벤트가 발생했을 때 메시지를 보내려면 코드를 짜서 요청한다.
정기적으로 보내고 싶다면 AWS의 Codebuild나 lambda 또는 crontab을 사용할 수 있다.
import axios from 'axios' import format from 'date-fns/format' const API_URL = 'https://api-url.com' const SLACK_WEBHOOK_URL = 'https://your-slack-webhook-url.com' const sendMessage = async () => { const response = await axios.get(API_URL) if (response.data.error) { const attachment = { pretext: '⚠️요청이 실패했습니다.', color: '#FF0000', title: '에러 메시지', text: response.data.error.message, fields: [{ title: '에러 코드', value: response.data.error.code, short: false }], } await axios.post(SLACK_WEBHOOK_URL , { attachments: [attachment] }) return } const balance = Number(response.data.balance) // 화폐 단위에 맞게 숫자에 컴마를 넣어준다. const balanceCurrency = new Intl.NumberFormat('ko-KR').format(balance) const currentTime = format(new Date(), 'yyyy-MM-dd HH:mm') const message = `${currentTime} 현재 잔액은 ${balanceCurrency} 원입니다.` await axios.post(SLACK_WEBHOOK_URL , { text: message }) } export default sendMessage
TypeScript
복사
7. github action을 사용해서 정기적으로 돌리기
액션 스크립트에 on:schedule을 추가하여 정기적으로 코드를 실행할 수 있다.
프로젝트를 생성하고 라이브러리를 설치한다. date-fns는 없어도 된다.
// 프로젝트 폴더 생성 mkdir incoming-webhook // 프로젝트 생성 npm init -y // 라이브러리 설치 npm i axios date-fns // git 연결 git init git switch -c main git add . && git commit -m "add sendMessage and workflow" git push --set-upstream origin main
Shell
복사
sendMessage.js
현재 시간을 슬랙으로 보내주는 함수를 만들고 실행하는 스크립트이다.
점심 시간이 되면 칼같이 알려주는 봇이다. 직장인의 점심 시간은 1분 1초가 중요하니까. 후후.
const axios = require("axios"); const SLACK_WEBHOOK_URL = "slack-webhook-url"; const sendMessage = async () => { const currentTime = format(new Date(), "yyyy-MM-dd HH:mm"); const message = `12시 점심 시간입니다. 그만 일하고 점심 드세요!`; await axios.post(SLACK_WEBHOOK_URL, { text: message }); }; (async () => { await sendMessage(); })();
JavaScript
복사
파일을 추가했으면 package.json의 scripts에 send-message 스크립트를 추가한다.
"send-message": "node ./sendMessage.js"
.github/workflows/slackbot.yml 파일을 생성한다.
name: Send Message on: schedule: # UTC 오전 3시 마다 돌아감 -> 한국 시간 12시 # https://crontab.guru/#0_3_*_*_* - cron: "0 3 * * *" # github action에서 수동으로 액션을 돌릴 수 있다. workflow_dispatch: jobs: test: runs-on: ubuntu-latest steps: - name: Checkout branch uses: actions/checkout@v2 - name: Use Node.js uses: actions/setup-node@v1 with: node-version: "12.18.3" - name: Send message run: | npm i npm run send-message
YAML
복사
근데 위와 같이 간단한 코드라면 action-slack-notify 액션을 써도 된다.
슬랙 웹훅 URL은 깃허브 시크릿에 넣어야 한다.
github project - settings - secrets 에서 추가한다.
name: Crawler Test on: schedule: # UTC 오전 7시 마다 돌아감 -> 한국 시간 4시 # https://crontab.guru/#0_7_*_*_* - cron: "0 7 * * *" workflow_dispatch: jobs: test: runs-on: ubuntu-latest steps: - name: Checkout branch uses: actions/checkout@v2 - name: Lunch Time Notification uses: rtCamp/action-slack-notify@master env: SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }} SLACK_CHANNEL: random SLACK_MESSAGE: '얼른 일어나세요!' SLACK_TITLE: 점심시간입니다 SLACK_USERNAME: slackbot test
YAML
복사