이번 글은 지난 포스트에서 다룬 Google Sheets API 서비스 계정 설정과 Slack Webhook 설정에 이어,
Gmail·Google Calendar API를 활용할 때 필요한 OAuth 인증 과정과, Slack에서 버튼 클릭까지 반영하려는 경우 필요한 Interactivity 설정을 정리했습니다.
1. 왜 추가 설정이 필요한가?
- Google Sheets는 서비스 계정(JSON 키)만으로 접근이 가능합니다.
- 하지만 Gmail과 Google Calendar는 사용자 데이터(메일·일정) 를 다루기 때문에 서비스 계정이 아닌 사용자 OAuth 인증이 필요합니다.
- 또한 Slack은 기본 Incoming Webhook으로 알림 전송까지만 가능하지만, 버튼 클릭 이벤트 처리까지 하려면 Interactivity 설정이 추가로 필요합니다.
2. Gmail·Google Calendar OAuth 인증 가이드
- Google Cloud Console 준비
- 새/기존 프로젝트에서 Gmail API, Calendar API 사용 설정


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



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


- credentials.json 다운로드


- 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을 삭제하고 다시 실행해야 새로 동의 화면이 뜹니다
추가 설명 & 주의사항
- OAuth 클라이언트 JSON 파일명
- Google Cloud Console에서 다운로드하면 보통 client_secret_xxxxx.apps.googleusercontent.com.json 같은 긴 이름으로 내려받음
- 코드에서 credentials.json 으로 되어 있으니, 파일명을 맞추거나 실제 파일명을 코드에 넣어야 함

- 테스트 사용자 추가
- 앱이 아직 “테스트 모드”라면, OAuth 동의 화면 → 테스트 사용자에 본인 Gmail 계정을 반드시 추가해야 인증 가능


추가하지 않으면 403 access_denied 오류 발생
- 앱이 아직 “테스트 모드”라면, OAuth 동의 화면 → 테스트 사용자에 본인 Gmail 계정을 반드시 추가해야 인증 가능
- token.json 파일 관리
- Gmail/Calendar 통합 스코프로 발급받으면 하나의 token.json으로 두 API 모두 접근 가능
- 스코프(SCOPES)를 바꾸면 기존 token.json은 삭제하고 다시 실행해야 새로 동의 화면이 뜸
- 에러 해결 팁
- FileNotFoundError: credentials.json → 파일 이름 불일치. 다운로드 받은 JSON 파일명을 확인
- 403 access_denied → 테스트 사용자에 본인 계정 추가 필요
- insufficientPermissions → 스코프가 바뀌었는데 기존 토큰 재사용 → token.json 삭제 후 재발급
3. Slack 버튼 클릭(Interactivity) 설정 가이드
Incoming Webhook만으로는 알림 전송까지만 가능합니다.
버튼 클릭 이벤트를 처리하려면 Slack 앱에서 Interactivity를 켜야 합니다.
- Python 패키지
pip install flask requests
2.Slack 앱 설정
- Slack API 관리 페이지에서 앱 생성 또는 기존 앱 열기



- 간단한 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 다운로드 후 설치

- 계정 가입 → ngrok config add-authtoken <토큰> 으로 인증(무료 플랜 가능)

ngrok Authtoken 등록 방법
1. 대시보드 접속
- ngrok Dashboard 로그인
- 왼쪽 메뉴에서 “Your Authtoken” 클릭
→ 이런 화면이 보일 거예요:
여기서 2EwxyzAbCdEfG... 부분이 개인 토큰이에요.


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

3. 테스트 실행

- 로컬 엔드포인트: http://localhost:8000/slack/actions
(2) ngrok 실행
- 콘솔에 https://abcd1234.ngrok.io 같은 외부 HTTPS 주소가 표시됨

- 최종 이벤트 수신 URL:
https://abcd1234.ngrok.io/slack/actions
Forwarding 주소 + /slack/actions 를 Slack App → Interactivity → Request URL에 등록해야 합니다.
참고: ngrok는 켤 때마다 주소가 바뀐다(무료). 바뀔 때마다 Slack 설정의 URL도 다시 저장해야 함.
2) Slack 앱 설정 (Interactivity 켜기)
- Slack API → Apps → (내 앱 선택)
- Interactivity & Shortcuts 메뉴로 이동
- Interactivity: ON
- Request URL에 ngrok 주소 입력
- Save (저장)
이제부터 버튼이 눌리면 Slack이 위 URL로 POST 요청을 보냅니다.
3) 테스트 방법
Webhook으로 Block Kit 버튼이 포함된 메시지를 보냄. (Webhook URL은 미리 발급)-



- 방법 1) Python ( send_message.py)
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
- Slack 앱 설정 → Incoming Webhooks → Webhook URL 복사
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 설정도 함께 참고하면 전체 자동화 흐름을 완성할 수 있습니다.
'Make 노코드 & AI 자동화 전문가 과정' 카테고리의 다른 글
| 2주차: 데이터 처리와 시나리오 설계 (0) | 2025.09.23 |
|---|---|
| Make 노코드 & AI 자동화 전문가 과정 시리즈 개요 (0) | 2025.09.22 |
| 1주차: 자동화와 노코드 기본기 (0) | 2025.09.22 |
| Slack Incoming Webhook 설정 및 Python으로 알림 보내기 튜토리얼 (0) | 2025.09.22 |
| Google Cloud Console에서 서비스 계정 생성하고 JSON 키 발급하기 (Python 연동용 가이드) (0) | 2025.09.22 |
