Telegram 메시지를 자연어로 입력하면 GLM이 분석해서 Notion 데이터베이스에 할 일을 추가/조회/완료 처리하는 n8n 워크플로우.
텔레그램 봇에 메시지를 보내면 됩니다. 슬래시(/) 유무 상관없이 동작합니다.
회의 준비 → [미분류] 할 일 추가
5월20일~22일 대전 출장 → [미분류] + 날짜 범위(20~22일) 추가
급해! 보고서 제출 → [미분류] + 우선순위 높음
회사 프로젝트 마감 → [회사] 할 일 추가
보여줘 → 전체 할 일 조회
/보여줘 → 전체 할 일 조회 (슬래시 OK)
회사 뭐있어 → 회사 카테고리만 조회
회의 완료 → '회의' 검색 후 Done 처리
| 기능 | 트리거 예시 | 설명 |
|---|---|---|
| 추가 (add) | 일반 텍스트 | Notion에 새 할 일 생성 |
| 조회 (list) | 보여줘, 뭐있어, 리스트, /보여줘 | 미완료 할 일 목록 출력 |
| 완료 (done) | 완료, 했어, 끝났어 | Notion 상태를 Done으로 변경 |
- 카테고리: 회사 / 집 / 개인 / 학교 / 미분류
- 날짜: 단일 날짜, 기간(
부터까지), 상대 날짜(내일, 다음주 등) - 우선순위: 높음(급해, 빨리, 중요) / 보통 / 낮음(나중에, 여유)
| 명령어 | 동작 |
|---|---|
보여줘, 전체, 리스트 |
전체 할 일 조회 |
오늘, 오늘할일 |
오늘 마감 할 일만 조회 |
회사, 회사할일 |
회사 카테고리 조회 |
집, 집할일 |
집 카테고리 조회 |
개인, 개인할일 |
개인 카테고리 조회 |
학교, 학교할일 |
학교 카테고리 조회 |
하나의 텔레그램 봇을 여러 사용자가 공유할 수 있습니다. 각 사용자는 자신의 Notion DB에 연결됩니다.
# 사용자 등록
python3 manage-users.py add <chat_id> <이름> <notion_api_key> <notion_database_id>
# 예시
python3 manage-users.py add 123456789 홍길동 ntn_xxxabc123 358da5cb-782f-80f5-xxxx
# 사용자 목록
python3 manage-users.py list
# 사용자 삭제
python3 manage-users.py remove <chat_id>- 새 사용자가 봇에 메시지 전송
- 사용자에게 "승인 대기 중" 안내 메시지 전송
- 관리자에게 새 사용자 요청 알림 (chat_id 포함)
- 관리자가
manage-users.py add로 승인 - 이후 정상 사용 가능
10초마다 → 준비 → TG폴링 → 오프셋저장 → TG컨펌
↓
필터+분리 (모든 사용자)
↓
사용자조회 (HTTP → user-api.py)
↓
사용자병합
↓
사용자분기
/ \
approved unknown
/ \
명령어처리 미승인알림 → 관리자알림
↓
명령어분기 (skipGLM?)
/ \
명령어 GLM분류
↓ ↓
결과파싱 ←────────┘
↓
액션라우팅
/ | \
add list done
/ | \
Notion추가 Notion조회 Notion검색
↓ ↓ ↓
TG추가확인 리스트포맷 완료추출
↓ ↓
TG리스트 Notion상태변경
↓
TG완료확인
| 노드 | 타입 | 역할 |
|---|---|---|
| 10초마다 | ScheduleTrigger | 10초 간격 폴링 |
| 환경변수 | Set | tgToken 로드 (공통) |
| 준비 | Code | offset 기반 getUpdates URL 생성 |
| TG폴링 | HttpRequest | Telegram getUpdates 호출 |
| 오프셋저장 | Code | update_id offset 저장 + 중복 제거 확인용 getUpdates 호출 |
| TG컨펌 | HttpRequest | offset 확인용 요청 (중복 메시지 방지) |
| 필터+분리 | Code | 텍스트 메시지 필터링 + 줄바꿈 분리 |
| 사용자조회 | HttpRequest | user-api.py로 사용자 정보 조회 (per-user credentials) |
| 사용자병합 | Code | 원본 메시지 + 사용자 정보 병합 |
| 사용자분기 | Switch | approved / unknown 분기 |
| 명령어처리 | Code | 바로가기 명령어 감지 + skipGLM 처리 |
| 명령어분기 | IF | 명령어 여부에 따라 GLM 분류 스킵 |
| GLM분류 | HttpRequest | GLM-4.5-Air로 자연어 분석 |
| 결과파싱 | Code | GLM 응답 파싱 + fallback 날짜 파서 + Notion body 생성 |
| 액션라우팅 | Switch | add/list/done 분기 |
| Notion추가 | HttpRequest | Notion pages 생성 |
| TG추가확인 | HttpRequest | 추가 완료 텔레그램 메시지 |
| Notion조회 | HttpRequest | Notion database query |
| 리스트포맷 | Code | 조회 결과 포맷팅 |
| TG리스트 | HttpRequest | 목록 텔레그램 메시지 |
| Notion검색 | HttpRequest | 완료할 항목 검색 |
| 완료추출 | Code | 검색 결과에서 pageId 추출 |
| Notion상태변경 | HttpRequest | Notion page 상태 → Done |
| TG완료확인 | HttpRequest | 완료 처리 텔레그램 메시지 |
| 미승인알림 | HttpRequest | 미승인 사용자에게 안내 메시지 |
| 관리자알림 | HttpRequest | 관리자에게 새 사용자 요청 알림 |
볼드체 = v3 다중 사용자 지원에서 추가된 노드
cd /root/todo-router
python3 deploy.py # 배포
sudo systemctl restart n8n # n8n 재시작deploy.py는 n8n SQLite의 workflow_entity와 workflow_history 모두 업데이트합니다.
n8n은 활성 워크플로우 실행 시 workflow_history 테이블을 읽습니다.
todo-router/
├── telegram-notion-router-v2.json # 워크플로우 (26개 노드)
├── deploy.py # n8n SQLite 배포 스크립트
├── manage-users.py # 사용자 관리 CLI
├── user-api.py # 사용자 조회 API (port 9999)
├── users.db # SQLite 사용자 DB
├── .env # 공통 환경변수
├── README.md
└── .gitignore
| 서비스 | Port | 설명 |
|---|---|---|
| n8n | 5678 | 워크플로우 엔진 |
| user-api | 9999 | 사용자 조회 API (SQLite) |
sudo systemctl restart n8n # 워크플로우 재시작
sudo systemctl restart user-api # 사용자 API 재시작- n8n (systemd, port 5678)
- user-api.py (systemd, port 9999) - 사용자 DB 조회
- Telegram Bot API - Long Polling 방식
- GLM-4.5-Air (api.z.ai) - 자연어 분류
- Notion API - 데이터베이스 CRUD (per-user credentials)
| 속성 | 타입 | 설명 |
|---|---|---|
| 이름 | Title | 할 일 제목 |
| 카테고리 | Rich Text | 회사/집/개인/학교 |
| 날짜 | Date | 단일 날짜 또는 기간 |
| 우선순위 | Select | 높음/보통/낮음 |
| 상태 | Status | Done 여부 |
- SQLite 기반 사용자 DB (
users.db) - 사용자별 Notion API 키 / DB ID 관리
- 미승인 사용자 자동 감지 + 관리자 알림
- 관리자 CLI (
manage-users.py) - 사용자 조회 API (
user-api.py, port 9999) - 슬래시 명령어 지원 (
/보여줘,/회사등) .env에서 Notion credentials 제거 → 사용자 DB로 이관
- Telegram Webhook → Long Polling 전환 (10초 폴링)
- offset 기반 중복 메시지 방지
- GLM 프롬프트 고도화 (날짜 범위, 카테고리, 우선순위 추출)
- 한국어 날짜 fallback 파서 추가
- 할 일 완료(done) 기능 추가
- 줄바꿈으로 여러 할 일 동시 입력 지원
- 초기 버전 (Webhook 기반, 단일 사용자)