# 사례: 텔레그램 "자료 수집 유저봇" 만들기
> 비개발자가 AI 코딩 도구의 도움을 받아, 여러 텔레그램 대화방·채널의 글을
> 한 곳에 모아주는 개인용 봇을 처음부터 끝까지 만들어 본 기록입니다.
> (등장하는 계정·번호·방 이름·경로 등은 모두 예시로 익명화했습니다.)
---
## 1. 무엇을 만들고 싶었나
- 내가 참여 중인 **여러 대화방·채널** 중 원하는 곳을 골라,
- 그곳의 글을 **하나의 전용 방**에 모아서 정리하고,
- 모으는 시점은 **내가 명령할 때마다** "직전 명령 이후 ~ 지금"까지,
- 맨 처음 명령은 **현재 시각 기준 1시간 전**부터.
한 줄 요약: **"흩어진 방들의 자료를 명령 한 번으로 내 방에 모아두기."**
---
## 2. 첫 갈림길 — "일반 봇"으로는 안 된다
가장 먼저 부딪힌 핵심 제약:
- **BotFather로 만드는 일반 봇(Bot API)** 은
- 자기가 **관리자로 추가되지 않은 방**의 글을 못 읽고,
- 자기가 추가되기 **이전의 과거 메시지**를 아예 못 가져온다.
즉 "내가 멤버인 방들의 과거 내역을 모은다"는 목표와 맞지 않았다.
**해결책 = 유저봇(Userbot).**
- 라이브러리 **Telethon** + **본인 텔레그램 계정**으로 로그인(MTProto).
- 그러면 "내가 속한 방"의 과거 내역을 **내 권한 그대로** 읽을 수 있다.
- 로그인에 필요한 api_id / api_hash 는 my.telegram.org 에서 무료 발급.
> 교훈: "텔레그램 봇 = 파이썬/BotFather" 라는 고정관념과 달리,
> **목적에 따라 '유저봇'이라는 다른 길**이 필요할 수 있다.
---
## 3. 요구사항 확정
| 항목 | 선택 |
|------|------|
| 방식 | 유저봇 (Telethon + 본인 계정) |
| 수집 대상 | 텍스트 + 사진/영상/파일 + 링크(URL 별도 모음) |
| 저장 위치 | 전용 비공개 그룹(= 명령을 입력하는 방) |
| 실행 환경 | 개인 PC (Windows) |
---
## 4. 계정 정지를 피하 기 위한 설계
유저봇은 **과한 자동화가 스팸으로 탐지**되면 일시 제한(FloodWait)이나
정지로 이어질 수 있다. 그래서 "사람처럼 천천히" 동작하도록 설계에 반영했다.
- **요청 사이 간격 + 랜덤 지터** — 기계처럼 연속 호출하지 않음
- **전달은 작은 묶음(25건)으로 나눠** 묶음마다 휴식
- **FloodWait 자동 준수** — 제한이 걸리면 시키는 만큼 기다렸다 이어감
- **1회 처리량 상한**(소스당 기본 500건) — 초과분은 다음 명령에서 **무손실**로 이어받기
- **실제 데스크톱 클라이언트처럼** 기기/앱 정보 지정
- **엔티티 캐시**로 불필요한 반복 조회 제거
또한 "직전 이후"를 **소스별 마지막 메시지 id**로 추적해,
여러 방을 등록해도 각자 정확히 빠진 부분만 가져오고 **중복·누락이 없게** 했다.
---
## 5. 설치 여정 (실제로 겪은 순서)
1. **Python 설치 문제**
- 처음엔 PATH에 잡히는 게 가짜 Python(스토어 스텁) 이라 pip 이 없었다.
- 정식 Python(python.org / winget)을 설치해 해결.
- **PATH 갱신** = "PowerShell 창을 닫고 새로 열기" 만으로 끝.
- 검증: python --version, python -m pip --version 둘 다 정상 출력.
2. **패키지 설치**
- pip install -r requirements.txt → telethon 등 설치 완료.
3. **API 키 발급 (`my.telegram.org`)**
- 사이트가 느려 ERR_CONNECTION_TIMED_OUT 발생.
→ 재시도 / 다른 네트워크(모바일 핫스팟) / VPN 으로 우회 가능.
- 전화번호는 **국제 형식**(`+82` + 앞 0 제거)으로 입력.
- 앱 생성 후 **App api_id / api_hash** 두 값을 확보.
- 두 값은 **본인 .env 파일에만** 입력(타인·채팅창에 노출 금지).
4. **첫 로그인**
- python bot.py → 전화번호 → 인증코드 → (2단계 인증 시) 비밀번호.
- **비밀번호 입력칸은 화면에 글자가 안 보이는 게 정상**(보안).
- 텔레그램이 보낸 **"새 기기 로그인 확인"** 알림에는 **"네, 맞습니다"** 로 승인.
- 세션이 *.session 파일로 저장돼, 이후엔 재로그인 불필요.
---
## 6. 사용 흐름
봇이 실행된 상태에서, 전용 방에 명령을 입력한다.
```
/here ← 이 방을 수집·명령 방으로 지정 (최초 1회)
/dialogs <검색어> ← 모을 방의 id 찾기 (이름 일부로 검색)
/add -1001234567890 ← 소스 등록 (마이너스 포함)
/sources ← 등록 확인
/collect ← 1시간 전부터(이후엔 직전 이후) 모으기
```
설정(수집 방·소스·마지막 수집 시점)은 state.json 에 저장돼
**봇을 껐다 켜도 그대로 유지**된다.
---
## 7. 사용 중 알게 된 점들
- **`/collect` 는 소스 방에 흔적을 남기지 않는다.** 조용히 읽어오기만 하므로
소스 방의 "읽음 표시"가 바뀌거나 알림이 가지 않는다.
- **봇이 곧 내 계정**이라, 봇의 모든 동작은 "나"로 표시되지만
그 동작은 **내 수집 방 안에서만** 일어난다.
- **`/dialogs` 목록은 최근 활동순으로 일부만** 보여준다(개수 제한).
조용한 방은 뒤로 밀릴 뿐 사라진 게 아니며,
**한 번 등록해두면 활동이 적어도 /collect 때 정상 수집**된다.
- 봇은 **PowerShell 창이 켜져 있는 동안만** 명령을 받는다.
꺼져 있던 동안의 메시지도, 다시 켜고 /collect 하면 빠짐없이 가져온다.
---
## 8. 비용/키 정리
| 키 | 용도 | 현재 단계 |
|----|------|-----------|
| api_id / api_hash | 텔레그램 로그인 | **필요 (발급 완료)** |
| Claude API 키(AI) | 메시지 요약 | **아직 불필요** |
지금까지의 "수집·정리"는 **AI 키 없이, 추가 비용 없이** 동작한다.
---
## 9. 다음 단계 (구상)
현재는 "여러 방 → 한 방에 모으기" 단계.
최종 목표는 **"대화방·채널별로 구분 + 자료 요약해서 보기."**
```
[지금] 여러 소스 → 한 방에 통째로 모음
[다음] 여러 소스 → 소스별 '토픽'으로 구분 정리 (AI 키 불필요)
[최종] 여러 소스 → 소스별 + AI가 핵심 요약까지 (Claude API 키 필요)
```
- **소스별 구분**: 텔레그램 "토픽" 기 능을 쓰면 소스마다 탭처럼 분리 가능.
- **AI 요약**: 모은 메시지를 LLM에 보내 "핵심 N줄 + 관련 링크"로 압축.
이 단계에서 처음으로 AI API 키와 사용량 과금이 생긴다.
---
## 10. 회고
- **비개발자도** AI 코딩 도구의 단계별 안내를 따라
"환경 설치 → 키 발급 → 로그인 → 실사용"까지 완주할 수 있었다.
- 가장 중요한 분기점은 코드가 아니라 **"일반 봇이 아니라 유저봇"** 이라는
**구조적 판단**이었다.
- 자동화는 **'할 수 있다'와 '안전하게 한다'가 다르다.**
계정 보호(속도 제한·상한·FloodWait 준수)를 처음부터 설계에 넣은 것이 핵심.
---
본 문서는 학습/공유용 사례 기록이며, 등장하는 계정·번호·경로·방 이름은 모두 익명 예시입니다.