feat: Gmail → Apps Script → Worker 입금 알림 연동

- POST /api/bank-notification 엔드포인트 추가
- 하나은행 Web발신 SMS 패턴 파싱 지원
- Gmail message_id 기반 중복 방지
- BANK_API_SECRET 인증 추가
- deposit_transactions 자동 매칭 구현
- 문서 업데이트 (CLAUDE.md, README.md)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
kappa
2026-01-17 00:09:16 +09:00
parent cd33a7c790
commit 9822b28028
7 changed files with 652 additions and 300 deletions

View File

@@ -25,6 +25,7 @@
- **Function Calling**: 날씨, 검색, 시간, 계산, **문서 조회**, **도메인 관리**, **예치금 관리** 등 AI가 자동으로 도구 호출
- **Context7 연동**: 프로그래밍 라이브러리 공식 문서 실시간 조회
- **Domain Agent**: OpenAI Assistants API 기반 도메인 관리 에이전트 연동
- **Deposit Agent**: OpenAI Assistants API 기반 예치금 관리 에이전트 연동
- **예치금 시스템**: 은행 입금 자동 감지 + 사용자 신고 매칭으로 자동 충전
- **Email Worker**: SMS → 메일 → 자동 파싱으로 입금 알림 처리
- **무한 컨텍스트**: 슬라이딩 윈도우(3개)로 프로필 유지, 무제한 대화 기억
@@ -40,6 +41,7 @@
| **OpenAI** | GPT-4o-mini + Function Calling |
| **Context7** | 라이브러리 문서 조회 API |
| **Domain Agent** | 도메인 관리 (OpenAI Assistants) |
| **Deposit Agent** | 예치금 관리 (OpenAI Assistants) |
| **Namecheap API** | 도메인 조회/관리 백엔드 |
| **Email Workers** | SMS → 메일 파싱 (입금 알림) |
| **Workers AI** | 폴백용 (Llama 3.1 8B) |
@@ -67,12 +69,13 @@
┌───┴───┬───────┬───────┬───────┬───────┬───────┐
▼ ▼ ▼ ▼ ▼ ▼ ▼
[날씨] [검색] [시간] [계산] [문서] [도메인] [예치금] → 외부 API/D1
[날씨] [검색] [시간] [계산] [문서] [도메인] [예치금]
│ │ │ │ │ │ │
│ │ │ │ │ │ └── D1 (자동 매칭)
│ │ │ │ │ └── Domain Agent (Assistants API)
│ │ │ │ │
│ │ │ │ └── Context7 API Namecheap API
│ │ │ │ │ │ └── Deposit Agent (Assistants API)
│ │ │ │ │ │ ↓
│ │ │ │ │ └── Domain Agent D1 (자동 매칭)
│ │ │ │ │ ↓
│ │ │ │ └── Context7 Namecheap API
└───┬───┴───────┴───────┴───────┴───────────────────┘
┌──────────────────┐
@@ -217,15 +220,59 @@ OpenAI: 날씨 데이터를 자연어로 응답 생성
| `수동 확인` | 입금 수동 확정 처리 | 관리자 전용 |
| `입금 거절` | 입금 요청 거절 | 관리자 전용 |
### Email Worker 설정
### Gmail → Apps Script → Worker 연동
Cloudflare Email Routing으로 SMS를 메일로 전달받아 파싱합니다.
SMS를 Gmail로 전달받아 Apps Script에서 Worker API를 호출합니다.
1. **Dashboard 설정**: Email > Email Routing > Routes
2. **라우팅**: `deposit@your-domain.com` → Worker: `telegram-summary-bot`
**흐름:**
```
은행 SMS → Gmail(deposit.anvil@gmail.com) → Apps Script (1분마다)
POST /api/bank-notification → DB 저장 → 자동 매칭
```
지원 은행 SMS 패턴:
- 하나은행: `[하나은행] 01/16 14:30 입금 50,000원 홍길동 잔액 1,234,567원`
**Apps Script 코드:**
```javascript
function checkBankEmails() {
var threads = GmailApp.search('is:unread 입금', 0, 10);
for (var i = 0; i < threads.length; i++) {
var messages = threads[i].getMessages();
for (var j = 0; j < messages.length; j++) {
var message = messages[j];
if (!message.isUnread()) continue;
var messageId = message.getId();
var body = message.getPlainBody();
try {
UrlFetchApp.fetch(
'https://telegram-summary-bot.kappa-d8e.workers.dev/api/bank-notification',
{
method: 'POST',
contentType: 'application/json',
payload: JSON.stringify({
content: body,
messageId: messageId,
secret: 'BANK_API_SECRET 값'
})
}
);
} catch (e) {
console.log('Error: ' + e);
}
}
threads[i].markRead();
}
}
```
**트리거 설정:** 시간 기반 → 분 타이머 → 1분마다
**지원 은행 SMS 패턴:**
- 하나은행 (Web발신): `[Web발신] 하나,01/16, 23:30 427******27104 입금5원 황병하`
- 하나은행 (기존): `[하나은행] 01/16 14:30 입금 50,000원 홍길동 잔액 1,234,567원`
- KB국민: `[KB] 입금 50,000원 01/16 14:30 홍길동`
- 신한: `[신한] 01/16 입금 50,000원 홍길동`
@@ -287,6 +334,7 @@ telegram-bot-workers/
│ ├── telegram.ts # Telegram API 유틸
│ ├── summary-service.ts # 프로필 분석 서비스
│ ├── openai-service.ts # OpenAI + Function Calling
│ ├── deposit-agent.ts # 예치금 에이전트 (Assistants API)
│ ├── n8n-service.ts # n8n 연동 (선택)
│ └── commands.ts # 봇 명령어 핸들러
├── schema.sql # D1 스키마
@@ -338,6 +386,9 @@ wrangler secret put WEBHOOK_SECRET
# OpenAI API Key (필수)
wrangler secret put OPENAI_API_KEY
# 입금 알림 API Secret (Apps Script 연동용)
wrangler secret put BANK_API_SECRET
```
### Vault 연동 (선택)
@@ -437,6 +488,7 @@ MAX_SUMMARIES_PER_USER = "3"
N8N_WEBHOOK_URL = "https://n8n.anvil.it.com"
DOMAIN_AGENT_ID = "asst_MzPFKoqt7V4w6bc0UwcXU4ob"
DOMAIN_OWNER_ID = "821596605"
DEPOSIT_AGENT_ID = "asst_XMoVGU7ZwRpUPI6PHGvRNm8E"
DEPOSIT_ADMIN_ID = "821596605"
[[d1_databases]]
@@ -470,6 +522,7 @@ database_id = "c285bb5b-888b-405d-b36f-475ae5aed20e"
| `/webhook-info` | GET | Webhook 상태 |
| `/setup-webhook` | GET | Webhook 설정 |
| `/webhook` | POST | Telegram Webhook |
| `/api/bank-notification` | POST | 입금 알림 API (Apps Script 연동) |
---