Make 노코드 & AI 자동화 전문가 과정

Gmail·Google Calendar OAuth 인증 & Slack 버튼 인터랙션 설정 가이드

코딩쉐프 2025. 9. 22. 21:21
728x90

이번 글은 지난 포스트에서 다룬 Google Sheets API 서비스 계정 설정Slack Webhook 설정에 이어,
Gmail·Google Calendar API를 활용할 때 필요한 OAuth 인증 과정과, Slack에서 버튼 클릭까지 반영하려는 경우 필요한 Interactivity 설정을 정리했습니다.


1. 왜 추가 설정이 필요한가?

  • Google Sheets는 서비스 계정(JSON 키)만으로 접근이 가능합니다.
  • 하지만 GmailGoogle Calendar사용자 데이터(메일·일정) 를 다루기 때문에 서비스 계정이 아닌 사용자 OAuth 인증이 필요합니다.
  • 또한 Slack은 기본 Incoming Webhook으로 알림 전송까지만 가능하지만, 버튼 클릭 이벤트 처리까지 하려면 Interactivity 설정이 추가로 필요합니다.

2. Gmail·Google Calendar OAuth 인증 가이드

  1. Google Cloud Console 준비
  • 새/기존 프로젝트에서 Gmail API, Calendar API 사용 설정


  • OAuth 동의 화면 구성 (앱 이름, 권한 범위 설정)



  • 인증 정보 → OAuth 클라이언트 ID 생성 (데스크톱 앱 권장)


  • credentials.json 다운로드

 

 

 

 

  1. OAuth 토큰 생성 (로컬 실행)
    아래 예제 스크립트를 실행해 token.json을 생성합니다.
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
from google.oauth2.credentials import Credentials
import os

SCOPES = [
    "https://www.googleapis.com/auth/gmail.readonly",
    "https://www.googleapis.com/auth/calendar",
]

def main():
    creds = None
    if os.path.exists("token.json"):
        creds = Credentials.from_authorized_user_file("token.json", SCOPES)
    if not creds or not creds.valid:
        if creds and creds.expired and creds.refresh_token:
            creds.refresh(Request())
        else:
            flow = InstalledAppFlow.from_client_secrets_file("credentials.json", SCOPES)
            creds = flow.run_local_server(port=0)
        with open("token.json", "w") as token:
            token.write(creds.to_json())
    print("OAuth 완료: token.json 생성됨")

if __name__ == "__main__":
    main()
 

실행 후 브라우저에서 구글 계정을 선택하고 권한을 승인하면 같은 폴더에 token.json이 생성됩니다.


  • Gmail/Calendar를 통합 스코프로 인증하면 하나의 token.json으로 모두 접근 가능
  • 스코프를 바꾸면 기존 token.json을 삭제하고 다시 실행해야 새로 동의 화면이 뜹니다

 

 

추가 설명 & 주의사항

  1. OAuth 클라이언트 JSON 파일명
    • Google Cloud Console에서 다운로드하면 보통 client_secret_xxxxx.apps.googleusercontent.com.json 같은 긴 이름으로 내려받음
    • 코드에서 credentials.json 으로 되어 있으니, 파일명을 맞추거나 실제 파일명을 코드에 넣어야 함 
  2. 테스트 사용자 추가
    • 앱이 아직 “테스트 모드”라면, OAuth 동의 화면 → 테스트 사용자에 본인 Gmail 계정을 반드시 추가해야 인증 가능



      추가하지 않으면 403 access_denied 오류 발생
  3. token.json 파일 관리
    • Gmail/Calendar 통합 스코프로 발급받으면 하나의 token.json으로 두 API 모두 접근 가능
    • 스코프(SCOPES)를 바꾸면 기존 token.json은 삭제하고 다시 실행해야 새로 동의 화면이 뜸
  4. 에러 해결 팁
    • FileNotFoundError: credentials.json → 파일 이름 불일치. 다운로드 받은 JSON 파일명을 확인
    • 403 access_denied → 테스트 사용자에 본인 계정 추가 필요
    • insufficientPermissions → 스코프가 바뀌었는데 기존 토큰 재사용 → token.json 삭제 후 재발급

 

 

 

 


3. Slack 버튼 클릭(Interactivity) 설정 가이드

Incoming Webhook만으로는 알림 전송까지만 가능합니다.
버튼 클릭 이벤트를 처리하려면 Slack 앱에서 Interactivity를 켜야 합니다.

  1. Python 패키지
pip install flask requests

 

   2.Slack 앱 설정

 

  1. 간단한 Flask 서버 예제 (app.py)
from flask import Flask, request, make_response
import json

app = Flask(__name__)

@app.route("/slack/actions", methods=["POST"])
def slack_actions():
    payload = json.loads(request.form.get("payload", "{}"))
    callback_id = payload.get("callback_id")
    actions = payload.get("actions", [])
    action_value = actions[0]["value"] if actions else None

    # 버튼 클릭 값(confirm/later)에 따라 추가 동작 가능
    print(f"버튼 클릭: {action_value}")

    return make_response("OK", 200)

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=8000)
  • 실행:서버가 계속 떠 있어야 함. (다른 창을 열어 다음 단계 진행
python app.py

1) 서버 실행 → ngrok로 외부 주소 열기

(1) ngrok 설치

ngrok Authtoken 등록 방법

1. 대시보드 접속

  1. ngrok Dashboard 로그인
  2. 왼쪽 메뉴에서 “Your Authtoken” 클릭

 

→ 이런 화면이 보일 거예요:

 
Connect your account Run this command to add your authtoken to the ngrok config file ngrok config add-authtoken 2EwxyzAbCdEfG...

여기서 2EwxyzAbCdEfG... 부분이 개인 토큰이에요.


2. CMD 또는 PowerShell 열기

  1. 윈도우에서 Win + R → cmd 입력 → 엔터
    또는 PowerShell 열기
  2. 아래 명령어 실행 (토큰은 본인 걸로 교체):
ngrok config add-authtoken 2EwxyzAbCdEfG...
  1. 성공 메시지가 나오면 ngrok 설정 완료 


3. 테스트 실행

 
(1) Flask 서버 실행
 
python app.py
  • 로컬 엔드포인트: http://localhost:8000/slack/actions

(2) ngrok 실행

 
ngrok http 8000

Forwarding 주소 + /slack/actions 를 Slack App → Interactivity → Request URL에 등록해야 합니다.

참고: ngrok는 켤 때마다 주소가 바뀐다(무료). 바뀔 때마다 Slack 설정의 URL도 다시 저장해야 함.


2) Slack 앱 설정 (Interactivity 켜기)

  1. Slack API → Apps → (내 앱 선택)
  2. Interactivity & Shortcuts 메뉴로 이동
  3. Interactivity: ON
  4. Request URL에 ngrok 주소 입력
  5. Save (저장)

이제부터 버튼이 눌리면 Slack이 위 URL로 POST 요청을 보냅니다.


3) 테스트 방법


  • Webhook으로 Block Kit 버튼이 포함된 메시지를 보냄. (Webhook URL은 미리 발급) 

    • 방법 1) Python ( send_message.py)
    1.
    import requests
    WEBHOOK = "YOUR_WEBHOOK_URL"
    
    payload = {
      "text": "이 메시지엔 버튼이 있어요!",
      "blocks": [
        {"type": "section", "text": {"type": "mrkdwn", "text": "*새 메일 처리 테스트*"}},
        {"type": "actions", "block_id": "email_followup", "elements": [
          {"type": "button", "text": {"type":"plain_text","text":"일정 확정"}, "value":"confirm", "action_id":"confirm_btn"},
          {"type": "button", "text": {"type":"plain_text","text":"나중에"},   "value":"later",   "action_id":"later_btn"}
        ]}
      ]
    }
    print(requests.post(WEBHOOK, json=payload).status_code)
    같은 프로젝트 폴더 안에 send_message.py 라는 이름을 새파일 만들어 저장.

    2.코드 안에 발급받은 Webhook URL을 넣기:

    WEBHOOK = "https://hooks.slack.com/services/XXXX/YYYY/ZZZZ"
    3.CMD에서 실행:
    cd D:\mkb\automation_lab python send_message.py

     
     

    4. 성공하면 Slack 채널에 버튼이 달린 메시지가 올라옴



  • 방법 2) curl 명령어로 Slack에 버튼 메시지 보내기

    (파이썬 스크립트를 만들지 않고, 터미널에서 한 줄로 바로 실행)

    1) Webhook URL 준비

    • Slack 앱 설정 → Incoming Webhooks → Webhook URL 복사
      예:
    • https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX

    2) CMD 또는 PowerShell 열기

    • Win + R → cmd 입력 → 엔터

    3) curl 명령어 실행

    아래 예제에서 $WEBHOOK 부분을 실제 Webhook URL로 교체해야 해요.

    curl -X POST "https://hooks.slack.com/services/XXXX/YYYY/ZZZZ" ^
      -H "Content-type: application/json" ^
      --data "{
        \"text\": \"이 메시지엔 버튼이 있어요!\",
        \"blocks\": [
          {\"type\":\"section\",\"text\":{\"type\":\"mrkdwn\",\"text\":\"*새 메일 처리 테스트*\"}},
          {\"type\":\"actions\",\"block_id\":\"email_followup\",\"elements\":[
            {\"type\":\"button\",\"text\":{\"type\":\"plain_text\",\"text\":\"일정 확정\"},\"value\":\"confirm\",\"action_id\":\"confirm_btn\"},
            {\"type\":\"button\",\"text\":{\"type\":\"plain_text\",\"text\":\"나중에\"},\"value\":\"later\",\"action_id\":\"later_btn\"}
          ]}
        ]
      }"

     


    4) 결과 확인

    • 실행 후 Slack 채널에 버튼 2개가 있는 메시지가 뜨면 성공 🎉
    • 버튼을 누르면 Flask 서버 콘솔에또는출력됨.
    • 버튼 클릭: later
    • 버튼 클릭: confirm
       
     

 

 


4) 자주 막히는 포인트 체크리스트

  • ngrok 주소 갱신: ngrok를 재시작하면 URL이 바뀐다 → Slack Request URL도 함께 업데이트!
  • 메서드/경로 불일치: Flask 라우트가 POST /slack/actions인지 확인
  • 방화벽/프록시: 회사망에서는 ngrok 요청이 막힐 수 있음 → 개인망/테더링으로 테스트
  • 서버 로그 확인: Flask 콘솔에 에러가 없는지, print가 찍히는지 확인
  • JSON 파싱: payload가 비어 있으면 request.form.get("payload") 결과를 확인

5) 다음 확장 아이디어

  • 버튼 값(action_value)에 따라 동작 분기
    • confirm → Google Calendar 이벤트 확정/메모 추가
    • later → 후속 작업으로 상태 변경, Slack 리마인드 예약
  • 응답 메시지 반환: response_url를 이용해 버튼 클릭 후 채널에 후속 메시지 보내기
  • 보안 강화: Slack Signing Secret으로 요청 서명 검증(추천)
  • 영구 주소 사용: ngrok Pro/Cloud Run/Render 등으로 고정 URL 확보

4. 정리

  • Sheets API: 서비스 계정 JSON 키만 있으면 됨
  • Gmail/Calendar API: 반드시 OAuth 인증 필요 → token.json 생성
  • Slack Webhook: 알림 전송만 할 땐 기존 Webhook으로 충분
  • Slack 버튼 클릭 처리: Interactivity 설정 + 서버 엔드포인트 필요

👉 지난 글에서 다룬 Google Sheets 서비스 계정 설정Slack Webhook 설정도 함께 참고하면 전체 자동화 흐름을 완성할 수 있습니다.

728x90