결론부터
- 1기록은 기준 메시지(offset_id)와 옮긴 칸(add_offset)으로 끊어 받는다.
- 2오래된 쪽은 add_offset 0, 새로운 쪽은 음수, 앞뒤는 절반만큼 음수.
- 3자주 묻는 목록은 hash 를 보내 바뀐 게 없으면 받지 않는다.
대화 기록은 '기준 메시지'로 끊어 받는다
대화 기록(messages.getHistory 등)은 한 번에 다 받지 않고 묶음으로 받습니다. 쪽 번호 대신 기준이 되는 메시지 번호와 거기서 얼마나 떨어진 곳부터 받을지로 위치를 정합니다. 결과는 보통 최신 것부터(번호가 큰 것부터) 옵니다.
| 칸 | 뜻 |
|---|---|
| offset_id | 기준 메시지 번호 |
| add_offset | 기준에서 몇 개 옮긴 곳부터 받을지 — 음수면 더 새로운 쪽으로 |
| limit | 이번에 받을 개수 |
| max_id · min_id | 이 번호보다 큰 것·작은 것은 빼고(경계 번호 자체도 뺀다) |
자주 쓰는 세 가지 모양
| 하려는 것 | offset_id | add_offset | limit |
|---|---|---|---|
| 기준보다 오래된 20개 | 기준 번호 | 0 | 20 |
| 기준보다 새로운 20개 | 기준 번호 | -20 | 20 |
| 기준 앞뒤 20개 | 기준 번호 | -10 | 20 |
위로 스크롤하면 지금 화면 맨 위 메시지를 기준으로 오래된 쪽을, 아래로 내려가면 맨 아래 메시지를 기준으로 새로운 쪽을 받습니다. 검색 결과에서 메시지로 뛰어갈 때는 '앞뒤' 모양이 맞습니다.
hash — 바뀐 게 없으면 받지 않기
대화 목록·스티커 묶음·연락처처럼 자주 다시 묻는 목록에는 hash 칸이 있습니다. 내가 이미 가진 목록에서 계산한 값을 hash 로 보내면, 서버는 바뀐 게 없을 때 내용 대신 '바뀌지 않음'(이름이 NotModified 로 끝나는 응답)만 돌려줍니다. 웹의 ETag 와 같은 생각입니다.
- hash 는 가진 결과의 번호들로 계산합니다. 계산식은 공식 문서에 정해져 있어 그대로 따릅니다(문자열 값은 MD5 앞부분을 64비트 수로 바꿔 넣는 식).
- 처음 받을 때나 가진 게 없을 때는 0 을 보냅니다.
- '바뀌지 않음'을 받으면 내가 저장한 목록을 그대로 씁니다. 매번 전체를 다시 받지 않으니 속도 제한(FLOOD_WAIT)도 덜 걸립니다(오류 읽기).
새로 들어오는 메시지는 기록 다시 받기가 아니라 업데이트로 받습니다 — 업데이트 처리.
자주 묻는 질문
텔레그램 API 에서 이전 메시지를 더 받으려면?
지금 가진 가장 오래된 메시지 번호를 offset_id 로, add_offset 0 으로 다시 요청합니다.
add_offset 은 무엇인가요?
기준 메시지에서 몇 개 옮긴 곳부터 받을지입니다. 음수면 더 새로운 쪽으로 옮깁니다.
hash 에는 무엇을 넣나요?
가진 목록의 번호들로 공식 문서의 식대로 계산한 값을 넣고, 처음이면 0 을 보냅니다.
NotModified 응답은 무슨 뜻인가요?
내가 가진 목록과 서버 목록이 같다는 뜻입니다. 저장한 목록을 그대로 씁니다.
참고한 공식 문서
한눈에 정리
- 1위치
offset_id · add_offset.
- 2모양
오래된 · 새로운 · 앞뒤.
- 3hash
안 바뀌면 NotModified.
최종 수정 2026-10-06