커스텀 명령어
이번에는 Slack API에서 지원하는 슬래시 명령어 대신 직접 커스텀 명령어를 구현해보겠습니다.
아래 글은 이전에 작성한 슬래시 명령어를 구현하는 방법입니다.
[Slack Bot] Slack Bot 슬래시 명령어 만들기
슬래시 명령어 생성 1) Slack API 사이트에서 Slash Commands - Create New Command를 클릭합니다. 2) 만들고 싶은 명령어의 이름, 요청 URL 및 간단한 설명을 입력합니다. 여기서 요청 URL은 사용자가 명령을 트
damon-911.tistory.com
커스텀 명령어 동작 구성
1) 터미널에 다음 명령을 실행하여 필요한 라이브러리를 설치합니다.
pip install flask slack-bolt aiohttp
2) custom_secrets.py 파일을 만들어 SIGNING_SECRET, BOT_TOKEN, APP_TOKEN을 각각 저장합니다.
3) 구현할 기능에 필요한 라이브러리 및 모듈을 가져옵니다.
import asyncio
from slack_bolt.app.async_app import AsyncApp
from slack_bolt.adapter.socket_mode.async_handler import AsyncSocketModeHandler
from custom_secrets import SLACK_SIGNING_SECRET, SLACK_BOT_TOKEN, SLACK_APP_TOKEN
4) slack_bolt 라이브러리의 AsyncApp 클래스를 사용하여 Slack 앱의 새 인스턴스를 만듭니다.
app = AsyncApp(
token=SLACK_BOT_TOKEN,
signing_secret=SLACK_SIGNING_SECRET
)
5) Slack에서 들어오는 메세지를 처리할 AsyncSocketModeHandler 객체의 새 인스턴스를 만듭니다.
asyncio를 통해 앱을 실행하여 비동기 방식으로 Slack에서 메시지를 받을 준비를 완료합니다.
async def main():
handler = AsyncSocketModeHandler(
app, app_token=SLACK_APP_TOKEN)
await handler.start_async()
if __name__ == "__main__":
asyncio.run(main())
7) 앱이 설치된 채널에 올라오는 모든 메세지를 감지하는 이벤트 함수를 만듭니다.
"!안녕" 이라 입력할 경우에만 인사 메세지를 출력하고 다른 경우는 각자 다르게 처리합니다.
@app.event("message")
async def handle_message_events(event, message, say):
if message.get('text') == "!안녕":
await say(f"안녕 <@{event['user']}>")
return
elif (message.get('text')[0] != '!'):
return
else:
await say("등록되어 있는 명령어가 아닙니다.")
return
8) 모든 과정을 마쳤다면, 다음과 같이 정상적으로 커스텀 명령어가 작동합니다.
커스텀 명령어를 구글 시트에 연결
1) 먼저 아래 구글 클라우드 플랫폼 페이지에 접속하여 프로젝트를 생성합니다.
Google 클라우드 플랫폼
로그인 Google 클라우드 플랫폼으로 이동
accounts.google.com
2) API 및 서비스 - 사용자 인증 정보 - 사용자 인증 정보 만들기에서 서비스 계정을 생성합니다.
서비스 계정이 생성되면 해당 계정의 E-mail 정보를 얻을 수 있습니다.
3) 제어할 구글 시트 페이지에 들어가 Share 버튼을 누른 후 위에서 얻은 E-mail을 추가하여 권한을 부여해줍니다.
4) 다시 구글 클라우드 플랫폼 페이지에서 키 관리 메뉴에 들어가 키를 생성합니다.
이 때 JSON 파일로 생성하여 해당 파일을 다운로드합니다.
5) API 및 서비스 - 사용 설정된 API 및 서비스 - API 및 서비스 사용 설정에서 Google Drive API와 Google Sheets API 사용을 활성화시켜줍니다.
6) 터미널에 다음 명령을 실행하여 필요한 라이브러리를 설치합니다.
구글 시트를 다루기 위한 파이썬 라이브러리 gspread와 인증을 위한 oauth2client를 설치합니다.
pip install --upgrade oauth2client
pip install gspread
pip install PyOpenSSL
7) 기존의 custom_secrets.py 파일에 위에서 다운받은 JSON 파일 이름, 구글 시트 URL 주소, 구글 시트 이름을 각각 추가합니다.
8) 모든 사용 환경 설정이 끝났으므로 구글 시트와 연결합니다.
해당 과정을 통해 worksheet에는 구글 시트 정보가 담겨지게 됩니다.
import gspread
import oauth2client.service_account
from custom_secrets import SLACK_BOT_JSON, GOOGLE_SHEET_URL, GOOGLE_SHEET_NAME
scope = [
'https://spreadsheets.google.com/feeds',
'https://www.googleapis.com/auth/drive'
]
json = SLACK_BOT_JSON
credentials = oauth2client.service_account.ServiceAccountCredentials.from_json_keyfile_name(
json, scope)
gc = gspread.authorize(credentials)
sheet_url = GOOGLE_SHEET_URL
doc = gc.open_by_url(sheet_url)
worksheet = doc.worksheet(GOOGLE_SHEET_NAME)
9) 다음과 같이 명령어를 설정하고 해당하는 기능을 구현합니다.
- [!등록] [폰 기종] [사용자] : 구글 시트에서 입력한 "폰 기종"과 일치하는 행을 찾고 같은 행의 "사용자" 칸에 사용자 이름을 기입합니다.
- [!해제] [폰 기종] : 구글 시트에서 입력한 "폰 기종"과 일치하는 행을 찾고 같은 행의 "사용자" 칸을 빈칸으로 만듭니다.
# 구글 시트에서 "폰 기종"에 해당하는 열의 데이터를 가져옵니다 (I열 -> 9번쨰)
data = worksheet.col_values(9)
@app.event("message")
async def handle_message_events(event, message, say):
list = message.get('text').split(' ')
length = len(list)
command = list[0]
if (command == '!등록'):
if (length <= 2):
await say("입력 형식에 맞지 않습니다.")
return
user = list[length - 1]
phone = ''
for i in range(1, length - 1):
phone += list[i] + ' '
phone = phone[0:len(phone)-1]
for i in range(0, len(data)):
if (data[i].lower() == phone.lower()):
cellPos = 'L' + str(i + 1)
if (worksheet.acell(cellPos).value == None):
worksheet.update_acell(cellPos, user)
await say("등록이 완료되었습니다.")
else:
await say("사용자가 이미 등록되어 있습니다.")
return
await say(phone + "은(는) 존재하지 않습니다.")
return
elif (command == '!해제'):
if (length <= 1):
await say("입력 형식에 맞지 않습니다.")
return
phone = ''
for i in range(1, length):
phone += list[i] + ' '
phone = phone[0:len(phone)-1]
for i in range(0, len(data)):
if (data[i].lower() == phone.lower()):
cellPos = 'L' + str(i + 1)
if (worksheet.acell(cellPos).value != None):
worksheet.update_acell(cellPos, "")
await say("해제가 완료되었습니다.")
else:
await say("사용자가 등록되어 있지 않습니다.")
return
await say(phone + "은(는) 존재하지 않습니다.")
return
elif (command[0] != '!'):
return
else:
await say("등록되어 있는 명령어가 아닙니다.")
return
10) 실제로 실행해보면 다음과 같이 정상적으로 커스텀 명령어가 작동하여 구글 시트가 수정됩니다.
'기타 > Slack Bot' 카테고리의 다른 글
[Slack Bot] Slack Bot 슬래시 명령어 만들기 (0) | 2023.09.05 |
---|---|
[Slack Bot] Slack Bot과 Google Sheets 연결하기 (0) | 2023.08.16 |
[Slack Bot] Slack Bot 구현하기 (0) | 2023.08.14 |