카카오톡 PC 채팅방을 모니터링하고, AI가 자동으로 답장해주는 봇입니다.
kakaotalk-mcp의 Win32 API를 활용하고, GitHub Models API로 자연스러운 응답을 생성합니다.
- 🤖 AI 자동 응답 — 새 메시지를 감지하면 LLM이 자연스럽게 답장
- 🎭 사람별 페르소나 —
personas.json으로 상대방마다 말투/톤 설정 - 🔄 백그라운드 모니터링 — 주기적 폴링으로 새 메시지 감지
- 🛡️ 안전 장치 — 전송 전 재확인, 자기 메시지 무시, dry-run 모드
- 🆓 무료 — GitHub Models API 사용 (GitHub 계정만 있으면 OK)
- Windows 10/11
- 카카오톡 PC 설치 및 로그인 상태
- Python 3.10 이상
- GitHub CLI (
gh) 로그인 상태 - kakaotalk-mcp 패키지
# 1. 저장소 클론
git clone https://github.com/johklo/moltbot.git
cd moltbot
# 2. 의존성 설치
pip install kakaotalk-mcp requests
# 3. GitHub CLI 로그인 (이미 되어있으면 건너뛰기)
gh auth login상대방별 말투와 톤을 설정합니다. 프로젝트 루트에 personas.json 파일을 생성하세요:
{
"홍길동": {
"persona": "친근한 동료. 반말+요체 섞어서. 유머 섞어서.",
"my_name": "나의카톡이름"
},
"김부장님": {
"persona": "회사 상사. 존댓말 사용. 정중하고 공손하게.",
"my_name": "나의카톡이름"
},
"아내": {
"persona": "아내와의 대화. 친근하고 다정하게. 반말 사용.",
"my_name": "나의카톡이름"
}
}| 필드 | 설명 |
|---|---|
persona |
AI가 참고할 말투/성격 설명 |
my_name |
카카오톡에서 표시되는 내 이름 |
💡
my_name을 설정하면--my-name인자를 생략할 수 있습니다.
# personas.json에 설정된 채팅방
python kakao_auto_reply.py --room "홍길동"
# my_name 직접 지정
python kakao_auto_reply.py --room "홍길동" --my-name "나의카톡이름"# 테스트 (전송 안 함)
python kakao_auto_reply.py --room "홍길동" --dry-run
# 5초마다 체크
python kakao_auto_reply.py --room "홍길동" --interval 5
# 실행 로그 예시
[16:23:11] ✅ 카카오톡 실행 확인
[16:23:11] 📌 채팅방: '홍길동'
[16:23:11] 👤 내 이름: '나의카톡이름'
[16:23:11] 🎭 페르소나: 친근한 동료. 반말+요체 섞어서.
[16:23:11] 🔑 GitHub 인증 완료
[16:23:12] 🔄 모니터링 시작 (주기: 10초)
────────────────────────────────────────
[16:24:22] 📩 [홍길동] 점심 뭐 먹을까
[16:24:24] 💬 답변: 오늘 국밥 어때요? ㅋㅋ
[16:24:25] ✅ 전송 완료┌──────────────┐ 폴링 ┌──────────────┐
│ 카카오톡 PC │ ◄──────── │ moltbot │
│ (Win32) │ │ │
│ │ Ctrl+A/C │ 새 메시지? │
│ │ ──────────►│ │ │
│ │ │ ▼ │
│ │ 클립보드 │ fingerprint │
│ │ 붙여넣기 │ 비교 │
│ │ ◄──────────│ │ │
└──────────────┘ │ ▼ │
│ ┌──────────┐ │
│ │ GitHub │ │
│ │ Models │ │
│ │ API │ │
│ └──────────┘ │
└──────────────┘
시작
├─ 카카오톡 PC 실행 확인 (Win32 FindWindow)
├─ 채팅방 창 검색 및 열기 (없으면 Ctrl+F로 검색)
├─ personas.json 로드 → 채팅방에 맞는 페르소나 선택
├─ GitHub 토큰 획득 (gh auth token)
└─ 현재 대화의 fingerprint 저장 (기존 대화에 반응하지 않음)
매 주기(기본 10초)마다 다음을 반복합니다:
- 카카오톡 창 활성화 —
bring_window_to_front()로 채팅방을 앞으로 가져옴 - 클립보드 초기화 — 이전 클립보드 내용 제거
- 대화 전체 선택 & 복사 —
Ctrl+A→Ctrl+C(Win32 keybd_event) - 클립보드에서 텍스트 읽기 —
win32clipboard.GetClipboardData()
읽어온 텍스트는 다음과 같은 형식입니다:
15 April 2026
[홍길동] [14:01] 점심 뭐 먹을까
[나] [14:02] 국밥 어때요?
[홍길동] [14:02] 좋아요!
단순 해시 비교가 아닌 메시지별 fingerprint 추적 방식을 사용합니다:
fingerprint = MD5(발신자 + 시간 + 내용)
- 마지막으로 처리한 메시지의 fingerprint를 저장
- 새로 읽은 메시지 목록에서 해당 fingerprint 이후의 메시지만 추출
- 내 메시지, 사진/동영상/파일은 자동 제외
이 방식의 장점:
- 여러 메시지가 한꺼번에 와도 누락 없이 처리
- 내 메시지에 자기 응답하는 루프 방지
새 메시지가 감지되면:
- 최근 15개 메시지를 LLM 대화 형식으로 변환
- 내 메시지 →
assistantrole - 상대 메시지 →
userrole (발신자 이름 포함:[홍길동] 내용)
- 내 메시지 →
personas.json의 페르소나를 시스템 프롬프트에 주입- GitHub Models API (
gpt-4o-mini) 호출
시스템 프롬프트:
"너는 '나의카톡이름'이라는 사람이야. 카카오톡으로 대화 중이야.
친근한 동료. 반말+요체 섞어서. 유머 섞어서.
- 짧고 자연스럽게 대화해 (1-2문장)
- 절대 AI임을 밝히지 마
..."
답변을 보내기 직전에 한 번 더 채팅방을 읽어서 확인합니다:
LLM 응답 생성 완료
└─ 전송 전 재확인
├─ 새 메시지가 추가로 왔나? → 있으면 이번 답변 취소, 다음 주기에서 재처리
└─ 없으면 → 전송
이렇게 하면 LLM이 응답을 생성하는 동안 상대가 추가 메시지를 보낸 경우, 맥락에 맞지 않는 답변이 전송되는 것을 방지합니다.
send_message_to_room()— 클립보드에 텍스트 복사 후Ctrl+V→Enter- 전송 후 2초 대기하여 내 메시지가 채팅방에 반영되도록 함
- fingerprint 갱신하여 내 메시지에 다시 반응하지 않도록 처리
- Windows 전용 — Win32 API 기반
- 포그라운드 필요 — 메시지 읽기/전송 시 카카오톡 창이 잠시 앞으로 올라옴
- 클립보드 사용 — 작업 중 시스템 클립보드가 변경됨
- 1:1 채팅 전용 — 그룹 채팅에서는 정확도가 떨어질 수 있음
- API 사용량 — 새 메시지가 감지될 때만 LLM API 호출
moltbot/
├── kakao_auto_reply.py # 메인 스크립트
├── personas.json # 사람별 페르소나 설정 (사용자 생성)
├── personas.example.json # 페르소나 설정 예시
├── README.md
├── LICENSE
└── .gitignore
- kakaotalk-mcp — 카카오톡 PC Win32 API MCP 서버
