이번에는 슬랙 봇을 이용하여 슬랙에서 채팅한 것을 가져와서 이 데이터를 노션으로 기록해보는 것을 해보려고 한다.
우선 슬랙 봇의 구독기능을 활용하려고 하는데 슬랙 채널에 특정 이벤트(채팅)를 구독으로 걸어놓고
이 이벤트가 발생하면 자동적으로 봇에게 이벤트를 전달해주는 구조이다.
이를 위해서는 채팅이 발생했을 때, 채팅메시지를 받을 서버가 필요하다.
그래서 이번엔 FastAPI를 서버로 만들고 이를 이용해보려고 한다.
FastAPI는 이름처럼 매우 빠르게 서버를 실행할 수 있다.
pip install fastapi # fastapi 설치
pip install "uvicorn[standard]" # uvicorn 설치
가상환경에 두 가지를 설치해주고 main.py란 파일을 만들어서
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
return {"message": "Hello World"}
위와 같이 코드를 써주고 터미널에서
uvicorn main:app --reload
다음과 같이 입력해주면 서버가 실행된다. 브라우저에서 http://127.0.0.1:8000에 접속해서 확인해준다.
슬랙에서 +앱 추가
버튼을 누르면 다음과 같은 화면이 나오는데 위쪽 상단에 앱 디렉터리를 누르면 슬랙 홈페이지로 이동한다.
오른쪽 상단의 구축을 누르고 마찬가지로
Your Apps로 들어간다.
그리고 Create an App
을 누르고 워크스페이스를 지정하여 슬랙 봇을 생성한다.
봇을 생성했으면 왼쪽 메뉴에서 Oauth & Permissions
메뉴에서
권한 설정을 해주는데 채팅을 이용할 것이기 때문에
채팅 권한을 설정해준다.
그리곤 App Home 메뉴로 가서 봇 정보를 입력하고
Basic Information 에서 Install App to Worksapce를 누르면 봇이 생성된다.
이제 슬랙 봇에 이벤트를 구독할 수 있게 설정해준다.
Oauth & Permissions 바로 밑에 있는 Event Subscriptions 메뉴에 들어간다.
On 버튼을 클릭하고 밑에보면 Request URL을 작성하는 부분이있다.
이 곳에 본인의 서버를 입력하면 되는데 (위에서는 http://127.0.0.1:8000) 입력을 하고 나면
위와 같은 오류가 발생한다.
URL에 대해서 유효성을 검증하는 API를 보내주는데 POST 메소드이고
{
"token": "Jhj5dZrVaK7ZwHHjRyZWjbDl",
"challenge": "3eZbrw1aBm2rZgRNFdxV2595E9CY3gmdALWMmHkvFXO7tYXAYM8P",
"type": "url_verification"
}
body 다음과 같다. (공식문서)
그리고 중요한 점은 위에 만든 서버에서 response 값으로 challenge 값을 그대로 보내줘야 한다.
from fastapi import FastAPI
from pydantic.main import BaseModel
from fastapi import Body
app = FastAPI()
class SlackModel(BaseModel):
token: str
challenge: str
type: str
@app.post("/")
async def post_message(request_body: SlackModel = Body(...)):
response = {"challenge": request_body.challenge}
print(response)
return response
메소드를 post로 변경해주고 body를 받은 후 그 중에서 challenge 값만 response로 다시 전달하면 된다.
그런데 분명 API로 challenge 값을 전달했음에도 오류가 해결되지 않는다.
이는 서버를 로컬에서 띄워서 외부에서 접근이 되게끔 해야하기 때문이다.
ngrok은 네트워크 환경 설정이라던지 포트 포워딩없이 외부에서 나의 localhost로 접근 가능하도록 도와주는 툴이다.
ngrok 설치 (맥 기준)
brew install ngrok
로컬에서 8000포트를 서버로 실행하였기 때문에
ngrok http 8000
터미널에서 해당 명령어를 입력하면 화면이 바뀌면서 외부 도메인 주소가 나온다.
하지만, 기본 상태로 ngrok을 실행하면 세션 만료시간이 존재하고 시간이 만료되면 도메인 주소가 수시로 바뀌게 되어 불편함이 있다.
세션을 계속 유지하려면 해당 블로그에 방법이 나와있다.
간단하게 회원가입(구글,깃헙)을 하고 토큰을 받아서 실행시키면 간단하다.
이제 Session Status에 시간이 나오지 않게된다.
이제 슬랙 봇 페이지로 다시 가서 해당 도메인으로 교체해주면 드디어 Verified 체크가 되었다.
밑으로 스크롤을 좀 더 내려서 Subscribe to events on behalf of users에서
message.channels 이벤트를 등록해준다.
이 후 앱을 재설치하라고 팝업이 뜨는데 재설치해주면된다.