자동화 흐름
출근 지하철 지연 알림 자동화
평일 아침 출근 시간대에 서울시 지하철 실시간 도착 정보 API를 조회하여, 내가 이용하는 역의 열차 지연 여부를 감지하고 알림을 보내는 레시피입니다.
---
사전 준비
| 항목 | 설명 | |------|------| | 서울 열린데이터 API 인증키 | 서울 열린데이터 광장에서 회원가입 후 인증키 발급 | | 카카오 REST API 키 (선택) | 카카오톡 알림 사용 시 필요 | | Slack Webhook URL (선택) | Slack 알림 사용 시 필요 | | Make 계정 | 시나리오 구성 및 스케줄링 |
---
Step 1: 서울시 지하철 실시간 도착 API 호출
HTTP 모듈로 특정 역의 실시간 도착 정보를 조회합니다.
GET http://swopenapi.seoul.go.kr/api/subway/{{API_KEY}}/json/realtimeStationArrival/0/10/{{역명}}
URL 구성:
| 위치 | 값 | 설명 |
|------|-----|------|
| {{API_KEY}} | 인증키 | 서울 열린데이터 인증키 |
| json | 응답형식 | json 또는 xml |
| 0 | 시작 인덱스 | 데이터 시작 위치 |
| 10 | 종료 인덱스 | 한 번에 가져올 개수 |
| {{역명}} | 강남 | 모니터링할 역 이름 |
예시 URL:
http://swopenapi.seoul.go.kr/api/subway/YOUR_KEY/json/realtimeStationArrival/0/10/강남
Tip: 역명은 정확해야 합니다. "서울역"이 아닌 "서울"로, "충무로역"이 아닌 "충무로"로 입력합니다. 역명 끝에 "역"을 붙이지 마세요.
---
Step 2: 응답 데이터 파싱
API 응답 구조:
{
"realtimeStationArrival": {
"row": [
{
"subwayId": "1002",
"updnLine": "상행",
"trainLineNm": "잠실방면 - 강남",
"statnNm": "강남",
"barvlDt": "120",
"arvlMsg2": "전역 도착",
"arvlMsg3": "역삼",
"arvlCd": "1",
"lstcarAt": "0"
}
]
}
}
주요 필드:
| 필드 | 설명 | 활용 |
|------|------|------|
| subwayId | 호선 코드 | 1002=2호선, 1003=3호선 등 |
| updnLine | 상행/하행 | 출근 방향 필터링 |
| trainLineNm | 열차 노선명 | 방면 확인 |
| barvlDt | 도착 예정 시간(초) | 지연 판단 기준 |
| arvlMsg2 | 도착 메시지 | "지연", "전역 출발" 등 |
| arvlCd | 도착 코드 | 0=진입, 1=도착, 2=출발 등 |
호선 코드 참조:
| 코드 | 호선 | 코드 | 호선 | |------|------|------|------| | 1001 | 1호선 | 1002 | 2호선 | | 1003 | 3호선 | 1004 | 4호선 | | 1005 | 5호선 | 1006 | 6호선 | | 1007 | 7호선 | 1008 | 8호선 | | 1009 | 9호선 | 1063 | 경의중앙선 | | 1065 | 공항철도 | 1067 | 경춘선 | | 1077 | 신분당선 | | |
---
Step 3: 출근 방향 필터링
모든 열차가 아닌, 내 출근 방향 열차만 필터링합니다.
Make 필터 조건:
{{item.updnLine == "상행"}}
또는 trainLineNm에 목적지 방면이 포함되어 있는지 확인:
{{contains(item.trainLineNm; "잠실방면")}}
Tip: 내 출근 방향이 상행인지 하행인지 모르겠다면, 먼저 API를 한 번 호출해보고 trainLineNm 필드에서 목적지 방면을 확인하세요.
---
Step 4: 지연 감지 로직
열차 지연을 판정하는 로직을 구성합니다.
지연 판정 기준:
| 지표 | 정상 | 지연 판정 |
|------|------|----------|
| arvlMsg2 내 "지연" 포함 | 미포함 | "지연" 텍스트 포함 |
| 다음 열차 도착시간 | 5분 이내 | 10분 이상 |
| 도착 예정 열차 수 | 3대 이상 | 1대 이하 |
Make 수식 (복합 조건):
{{if(
contains(item.arvlMsg2; "지연");
"DELAY";
if(
parseNumber(item.barvlDt) > 600;
"SLOW";
"NORMAL"
)
)}}
상태별 처리:
| 상태 | 설명 | 액션 |
|------|------|------|
| DELAY | 명시적 지연 | 즉시 알림 발송 |
| SLOW | 배차 간격 넓음 (10분+) | 알림 발송 |
| NORMAL | 정상 운행 | 알림 안함 |
---
Step 5: 카카오톡/Slack 알림 발송
지연 감지 시 카카오톡으로 알림을 보냅니다.
POST https://kapi.kakao.com/v2/api/talk/memo/default/send
Headers:
Authorization: Bearer {{KAKAO_ACCESS_TOKEN}}
Content-Type: application/x-www-form-urlencoded
Body (template_object):
{
"object_type": "text",
"text": "지하철 지연 알림\n\n역: 강남역 (2호선)\n방면: 잠실방면 상행\n상태: 지연 운행 중\n\n다음 열차: 약 12분 후 도착\n메시지: 전역 지연\n\n확인 시각: 07:32\n\n대체 교통수단을 고려해 보세요.",
"link": {
"web_url": "https://m.map.naver.com"
}
}
Slack으로 대체 발송 시:
{
"blocks": [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "지하철 지연 알림\n\n역: 강남역 (2호선)\n방면: 잠실방면 상행\n상태: 지연 운행 중\n다음 열차: 약 12분 후\n\n_대체 교통수단을 고려해 보세요._"
}
}
]
}
---
Step 6: 평일 출근 시간 스케줄 설정
출근 시간에 맞춰 3회 체크합니다.
| 실행 시각 | 목적 | |----------|------| | 07:30 KST | 이른 출근 대비 사전 체크 | | 08:00 KST | 주요 출근 시간대 체크 | | 08:30 KST | 늦은 출근 대비 최종 체크 |
Make 스케줄 설정:
| 설정 항목 | 값 | |----------|-----| | 실행 주기 | 특정 요일 (월-금) | | 실행 시각 | 07:30, 08:00, 08:30 | | 타임존 | Asia/Seoul |
Tip: Make에서 단일 시나리오에 3개 시각을 설정할 수 없다면, 시나리오를 복제하거나 30분 간격 반복 실행으로 설정한 후 시간 범위 필터를 추가하세요: {{if(formatDate(now; "HH:mm") >= "07:30" and formatDate(now; "HH:mm") <= "08:30"; true; false)}}
---
예상 결과
- 평일 아침 07:30, 08:00, 08:30에 자동으로 지하철 상태 체크
- 지연 감지 시 즉시 카카오톡 또는 Slack으로 알림 수신
- 정상 운행 시에는 알림 없음 (불필요한 알림 방지)
- 대체 교통수단 판단을 위한 충분한 시간 확보
트러블슈팅
| 증상 | 원인 | 해결 방법 |
|------|------|-----------|
| 응답이 비어 있음 | 역명 오류 | "역" 접미사 제거 확인 ("강남역" -> "강남") |
| ERROR 코드 반환 | 인증키 만료 또는 비활성 | 서울 열린데이터 광장에서 인증키 상태 확인 |
| 새벽 시간대 데이터 없음 | 운행 종료 시간 | 첫차/막차 시간 외에는 데이터 없음. 스케줄을 운행 시간 내로 설정 |
| 지연 오탐 (항상 알림) | barvlDt 임계값 너무 낮음 | 임계값을 600초(10분)에서 900초(15분)로 상향 조정 |
| 카카오톡 발송 실패 | Access Token 만료 | Refresh Token 갱신 모듈을 시나리오 앞에 배치 |
| 특정 호선만 안 나옴 | subwayId 필터 누락 | 호선 코드 확인 후 조건에 정확한 코드 입력 |
Make 블루프린트 다운로드
JSON 파일을 Make.com에 임포트하면 시나리오가 자동 생성됩니다
댓글 · 질문 (0)
로그인 후 댓글을 작성할 수 있습니다.