[FastAPI] 슬랙 봇이 알려주는 심심풀이 불용한자 3

hukim·2022년 7월 11일
0

Open API

목록 보기
8/11
post-thumbnail

저번 포스팅에 이어서 슬랙 봇 관련하여 코드를 정리해본다.

router 이용하기

최초에 fastapi 생성 후 만들 때 main.py에 모든 기능들을 다 추가하였는데
기능들이 추가될 때 마다 보기힘들고 분류도 되지 않기 때문에

router를 prefix단위로 쪼개서 계속 붙여나가려고 한다.

.
├── app
│   ├── __init__.py
│   ├── main.py
│   ├── dependencies.py
│   └── routers
│   │   ├── __init__.py
│   │   ├── router1.py
│   │   └── router2.py

main.py에 집중되어있던 부분들을 위와같은 구조로 변경하려고한다.

router = APIRouter(
    prefix="/slack",
    tags=["slack"],
)

router 폴더를 만들고 파일을 만든 후 위와같이 APIRouter 클래스를 이용하여 router 객체를 생성한다.
prefix를 이용해서 {서버주소}/slack/myname 형태로 접근할 수 있도록 한다.

@router.post("/myname")
async def input_myname():
    slack_client.post_message(
        channel_id=url.channel_id,
        text="나의이름은",
        blocks=slack_client.plain_text_input(
            label_text="당신의 이름을 '한자'로 입력해 주세요.",
            place_holder="ex) 炯旭 (성을 제외한 이름만 입력해주세요.)"
        )
    )
    return


@router.post("/interactive")
async def post_message(request: Request, db: Session = Depends(get_db)):
    form_data = await request.form()
    payload = json.loads(form_data.get("payload"))

    myname = payload["actions"][0]["value"]
    name_list = [myname[i:i+1] for i in range(len(myname))]

    result = await get_china_character_name(name_list, db)

    if not result:
        message = "멋진 이름입니다. 당신의 이름에는 불용한자가 없습니다!"
    else:
        name_text = ""
        for name in result:
            name_text = f"{name_text}불용한자는 [{name.cha_name},{name.kor_name}]이며, 이 한자는 {name.description}\n"

        message = f"당신의 이름 중 불용한자는 총 {len(result)}개 입니다...\n{name_text}\n\n부모님이 주신 소중한 이름, 재미로만 봐주세요 🥹"

    slack_client.post_message(
        channel_id=url.channel_id,
        text=message,
    )

    return

이런식으로 파일을 계속 추가하면서 기능별로 분리해주도록 하고
router들을 생성한 후에는 main.py에서 해당 router들을 합쳐야한다.

from routers import china_character

app = FastAPI()

app.include_router(china_character.router)

이 때는 include_router를 이용해서 router들을 포함시키도록 한다.

마찬가지로 notion API들도 이동해서 main.py에서 없애도록한다.

import sys, os
import requests

from fastapi import APIRouter, Body

sys.path.append(os.path.dirname(os.path.abspath(os.path.dirname(os.path.abspath(os.path.dirname(__file__))))))
from slack_notion import url
from slack_notion import config


router = APIRouter(
    prefix="/notion",
    tags=["notion"],
)

# URL Setting
# @router.post("/message")
# async def post_message(request_body: dict = Body(...)):
#     response = {"challenge": request_body["challenge"]}
#     print(response)
#     return response


# Notion API
# @router.post("/message")
# async def post_message(request_body: dict = Body(...)):
#     print(request_body["event"]["text"])
#
#     await set_message_notion(request_body["event"]["text"])
#     return request_body["event"]["text"]


# CHA Character
@router.post("/message")
async def post_message(request_body: dict = Body(...)):
    # print(request_body["event"]["text"])
    # print(request_body)

    # await set_message_notion(request_body["event"]["text"])
    return request_body["event"]["text"]


async def set_message_notion(message: str):
    request_body = {"parent": {"database_id": "752bcc48aaa646be99b9a07676b32afc"}, "properties": {"Name": {"title": [{"text": {"content": message}}]}}}
    response = requests.post(url.database_url, headers={"Authorization": f"Bearer {config.notion_token}", "Notion-Version": "2022-02-22"}, json=request_body)
    print(response.text)

0개의 댓글