# Kakaotalk CLI

> macOS에서 카카오톡 메시지를 읽고 보낸다. 렌더링 안 된 채팅방도 검색으로 찾아 열고 줄바꿈을 보존한다. 실패하는 경로와 대체 경로를 함께 담았다.

- Skill: `bam-bam-2/kakaotalk-cli` (Agent Skill)
- Install (CLI): `npx skillmds@latest add bam-bam-2/kakaotalk-cli`
- Raw SKILL.md: https://api.skillmd.com/api/skills/bam-bam-2/kakaotalk-cli/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: bam-bam-2 (https://skillmd.com/u/bam-bam-2)
- Updated: 2026-09-10
- Page: https://skillmd.com/skills/bam-bam-2/kakaotalk-cli

---


# 카카오톡 보내기·읽기

> **이 스킬이 시스템에 하는 일 (설치 전 확인)**
>
> - **macOS 전용**입니다. 접근성(Accessibility) 권한이 필요합니다.
> - 외부 도구 `kmsg`/`kakaocli`를 통해 **카카오톡 앱을 조작**하고 로컬 메시지 DB를 읽습니다.
> - 메시지 내용을 외부로 전송하지 않습니다. 전부 로컬에서 처리됩니다.
> - 접근성 권한은 화면의 다른 앱도 조작할 수 있는 강한 권한입니다. 부여 전에 이해하고 결정하세요.







> **이 스킬이 시스템에 하는 일 (설치 전 확인)**
>
> - **macOS 전용**입니다. 접근성(Accessibility) 권한이 필요합니다.
> - 외부 도구 `kmsg`/`kakaocli`를 통해 **카카오톡 앱을 조작**하고 로컬 메시지 DB를 읽습니다.
> - 메시지 내용을 외부로 전송하지 않습니다. 전부 로컬에서 처리됩니다.
> - 접근성 권한은 화면의 다른 앱도 조작할 수 있는 강한 권한입니다. 부여 전에 이해하고 결정하세요.







**정본 도구는 `kmsg`다.** `kakaocli send`는 쓰지 않는다 — 화면에 렌더링된 채팅
목록만 훑어서 아래로 밀린 방을 못 찾고, DB 키를 받는 옵션도 없다.

## 왜 SSH를 거치나

Aside 샌드박스는 **GUI 실행·AX(손쉬운 사용)·타 프로세스 조회가 전부 막혀 있다.**
그래서 모든 명령은 SSH 루프백으로 샌드박스 밖에서 실행한다.

```bash
ssh -o BatchMode=yes localhost 'export PATH=/opt/homebrew/bin:$PATH; kmsg ...'
```

`kakaocli status`가 "App state: notRunning"이라고 해도 믿지 말 것. 샌드박스가
프로세스를 못 볼 뿐 카톡은 대개 켜져 있다.

선행 조건(2026-08-15 부여 완료): `/usr/libexec/sshd-keygen-wrapper`에
시스템 설정 → 개인정보 보호 및 보안 → **손쉬운 사용** 권한. 없으면 모든 AX 호출이
`-25211`로 막힌다.

## 절차

```bash
# 1. 상태와 열린 창 확인 — 이 단계를 건너뛰지 말 것
kmsg status --verbose

# 2. (메인 창 외에 채팅 창이 열려 있으면 닫는다)

# 3. 보낼 내용을 파일로 빼서 따옴표 문제를 피한다
kmsg send "<방이름>" "$(cat /path/msg.txt)"

# 4. 실제로 나갔는지 읽어서 확인
kmsg read "<방이름>" --limit 1 --json
```

- **`kmsg send`는 성공 후 방 창을 닫는다.** 그래서 직후 `kmsg read`는 창이 없다며 실패한다. 발송 검증은 `kakaocli messages --chat-id ... --key`로 DB를 보거나, 창을 다시 열고 읽는다.
- 방은 이름 substring 또는 `--chat-id`로 지정한다. `kmsg chats --json`로 목록.
- 보내기 전 `--dry-run`으로 수신자를 한 번 확인한다.
- **나와의 채팅은 `나와의 채팅`이 아니라 프로필명 `내 프로필명`으로 지정한다.**
- 처음 보내는 상대이거나 내용이 길면 먼저 `내 프로필명`으로 연습 발송해 서식을 확인한다.

## AI가 보냈다는 표시 (필수)

카톡은 사용자 본인 명의로 나가므로, **대신 보내는 전달·공지·안내성 메시지에는
본문 맨 끝에 서명 한 줄을 붙인다.**

```
— 이 메시지는 사용자을 대신해 AI가 정리해서 보냈습니다
```

사용자가 2026-08-15에 직접 요청했다("디스코드 봇은 그렇게 해주잖아"). 디스코드는
커뮤니티봇 봇 계정이라 이미 드러나지만 카톡은 안 드러난다는 게 이유.
개인 브랜드 콘텐츠(블로그·스레드·링크드인)는 예외.

## 단톡방에 보낼 때

- **진짜 @멘션은 걸 수 없다.** 카톡 멘션은 `@` 입력 시 뜨는 멤버 선택 팝업에서
  골라야 생기고, 자동 입력은 그 팝업 때문에 문장이 깨질 위험이 있다.
  이름을 본문에 나열하는 방식으로 쓰고, 하이라이트가 필요하면 사용자가 직접 단다.
- 여러 명이 읽는 메시지는 **먼저 `내 프로필명`으로 연습 발송해 서식을 확인**하고,
  사용자 승인을 받은 뒤 보낸다.

## 실패하면

| 증상 | 원인과 조치 |
|---|---|
| `[SEARCH_MISS] Search field not found` | 다른 채팅 창이 열려 있다. 닫고 `--refresh-cache` |
| 같은 오류인데 창이 메인 하나뿐 | 방 창이 막 열리는 중이라 AX 캐시가 어긋난 것. **그대로 `--refresh-cache`로 한 번만 재시도하면 나간다**(2026-08-16 실측). 첫 실패로 발송이 안 된 것이 맞는지 `kakaocli messages`로 먼저 확인할 것 |
| `[WINDOW_NOT_READY]` | 같은 원인. `open -a KakaoTalk` 후 재시도 |
| `[BACKGROUND_SAFE_BLOCKED]` | `--background-safe`는 이미 열린 창만 읽는다. 정상 동작 |
| 방을 못 찾음 | `kmsg chats --limit 200 --json`로 이름 확인 |

## 하지 말 것

- **`kmsg harvest`류의 메타데이터 재수집을 실행하지 말 것.** `kakaocli harvest`가
  `~/.kakaocli/metadata.json`의 방 이름을 전부 `(unknown)`으로 덮어쓴 사고가 있었다.
  백업: `~/.kakaocli/backups/`
- AppleScript `keystroke`로 한글을 치지 말 것 — `ㅁㅁㅁ`으로 깨진다. SSH `pbcopy`도
  GUI 페이스트보드에 닿지 않는다.
- **대량 발송·무인 자동응답 봇으로 확장하지 말 것.** 카카오 운영정책에 자동화
  프로그램 이용 제한이 있고 계정 제재 가능성이 있다. 사용자가 2026-08-15에 무인
  자동응답은 돌리지 않겠다고 명시했다.

## 참고

- 읽기 전용 대량 조회·검색이 필요하면 `kakaocli`(DB 직접 복호화)를 쓴다.
  키는 원격 머신 `~/Projects/<프로젝트>/dashboard/.env`의 `KAKAOCLI_KEY`이며
  `--key`로 넘긴다(환경변수는 읽지 않는다). 절대 출력하지 말 것.
- 전체 배경·폴백(수동 AX 주입)·AppleScript 함정:
  `에이전트 메모`
- 무인 상시 운영이 필요해지면: `에이전트 메모`

---

이 스킬은 [GET100](https://get100.co.kr) 운영하면서 실제로 쓰는 절차입니다.
막히는 부분이 있으면 [스레드](https://www.threads.com/@bam.bam_2)로 물어보셔도 됩니다.

