텔레그램 봇으로 보내는 텍스트·사진·동영상·파일을 실시간으로 감지해, 텍스트는 엑셀 파일에, 나머지는 종류별 폴더에 자동으로 정리해주는 개인용 기록 프로그램입니다. 매매 프로그램(LOG_01)처럼 정교한 복구 로직이 필요한 도구는 아니지만, 메세지를 잃어버리지 않는다는 같은 원칙을 이 프로그램의 규모에 맞게 적용했습니다.

01왜 만들었나

텔레그램으로 순간순간 남기는 메모·사진·짧은 영상들이 대화방 안에 흩어져 있으면 나중에 찾기가 어렵습니다. 봇 하나를 만들어 그 채널로 오는 모든 컨텐츠를 종류별로 자동 분류·저장하도록 했습니다 — 텍스트는 월별 엑셀 파일의 날짜별 시트에, 사진·동영상·첨부파일은 각각 날짜별·월별 폴더에.

02구조 — 오프셋 기반 롱폴링

텔레그램 getUpdates를 오프셋(last_update_id) 기반 롱폴링(poll_timeout=10초)으로 반복 호출합니다. 처리한 update_id는 즉시 로컬에 저장해두기 때문에, 프로그램을 껐다 켜도 이미 처리한 메세지를 중복 저장하지 않습니다. 재생(▶) 버튼을 누르는 순간 먼저 저장된 오프셋 이후로 밀린 메세지가 있는지 확인하고, 있으면 "반영하시겠습니까?"라고 물어본 뒤(자동 반영 설정 시 묻지 않음) 한꺼번에 처리합니다.

03메세지 한 건, 최대 네 갈래

update 한 건은 텍스트·사진·동영상·문서로 나눠 처리됩니다. 사진·동영상·첨부파일에 캡션이 달려있으면 그 캡션은 텍스트 쪽 엑셀에도 함께 기록됩니다. 텔레그램 봇 API가 내려받을 수 있는 파일 크기는 최대 약 20MB라, 이를 넘는 동영상·첨부파일은 다운로드를 시도하지 않고 봇이 "허용된 용량을 초과한 파일입니다."라고 바로 답장하며 로그에도 남깁니다.

04잠긴 엑셀 파일 문제 — 메세지를 잃지 않는 것

사용자가 엑셀 파일을 직접 열어보고 있으면 그 순간 파일이 잠겨 저장이 실패합니다 — 동시에 같은 파일을 고칠 수 없는 자연스러운 충돌입니다. 이전 버전(1.0.0)에서는 이때 실패한 메세지가 "처리 완료"로 표시되어 그대로 유실되는 버그가 있었습니다. 1.0.1부터는 저장에 실패하면 그 메세지를 대기열에 남겨두고, 폴링 루프가 돌 때마다 반복해서 재시도합니다 — 파일을 닫는 순간 자동으로 마저 반영됩니다.

# 저장 실패 시 메세지를 버리지 않고 대기열에 적재
def append_text_row(base_path, dt, text):
    try:
        _write_row(base_path, dt, text)
        return True
    except Exception:
        _enqueue_pending(base_path, dt, text)   # pending.json 에 보관
        return False

# 폴링 루프가 돌 때마다 대기열을 다시 반영 시도 (flush_pending)

05파일명 충돌과 저장 규칙

이미지·동영상·첨부파일은 "년월일시분" 형식 파일명으로 저장하고(예: 2608221530.jpg), 같은 분에 여러 개가 오면 _2, _3 번호를 붙여 겹치지 않게 합니다. 엑셀은 새 날짜 시트가 생길 때마다 맨 앞(왼쪽) 탭에 끼워 넣어서, 최근 날짜가 계속 뒤로 밀리지 않고 항상 먼저 보이도록 했습니다.

06그 외 안전장치

  • 시작 알림 — 재생 버튼으로 실시간 자동저장이 실제로 시작되면 텔레그램으로도 알려줍니다.
  • 자동 실행 — 시스템 시작 시 프로그램이 자동으로 켜지도록 등록할 수 있습니다.
  • 바로가기 — 활동 로그 옆 "저장 폴더 열기" 버튼으로 저장 위치를 바로 탐색기에서 확인합니다.

07지금 이 자리

버전 1.1.3. 1.0.0부터 릴리즈 노트에 남은 건 전부 실제로 쓰다가 걸린 문제들(엑셀 잠금, 파일명 밀림, 용량 초과)을 하나씩 관찰해서 고친 기록입니다. 지금은 특별히 손댈 일 없이 매일 조용히 돌아가는, 여러 반복 끝에 도달한 균형(Balance) 단계입니다.