결론부터
- 1인라인 버튼은 메시지 아래 신호, 답장 키보드는 버튼 글이 대화로 간다.
- 2callback_data 는 64바이트 — 짧은 코드만, 누르면 꼭 응답한다.
- 3답장 키보드는 resize 를 켜고, 연락처·위치는 사용자가 허락해야 간다.
버튼은 두 종류
| 종류 | 어디에 뜨나 | 누르면 |
|---|---|---|
| 인라인 버튼(InlineKeyboardMarkup) | 메시지 바로 아래에 붙는다 | 대화에 아무것도 보내지 않고 봇에게 신호만 간다 · 링크 열기 · 미니 앱 열기 등 |
| 답장 키보드(ReplyKeyboardMarkup) | 입력창 아래 키보드 자리를 바꾼다 | 버튼 글자가 사용자의 메시지로 대화에 보내진다 |
메뉴를 고르게 하거나 설정을 바꾸는 일은 대화가 지저분해지지 않는 인라인 버튼이 맞고, '예/아니요'처럼 사용자의 답이 대화에 남아야 하는 일은 답장 키보드가 맞습니다.
인라인 버튼
sendMessage 의 reply_markup 에 버튼 줄(배열의 배열)을 넣습니다.
{"inline_keyboard": [
[{"text": "알림 켜기", "callback_data": "notify_on"},
{"text": "알림 끄기", "callback_data": "notify_off"}],
[{"text": "도움말 보기", "url": "https://example.com/help"}]
]}
| 버튼 칸 | 하는 일 |
|---|---|
| callback_data | 봇에게 신호(callback_query)를 보낸다 — 1~64바이트 |
| url | 링크를 연다 |
| web_app | 미니 앱을 연다 |
| switch_inline_query | 대화를 골라 인라인 모드로 봇을 부른다(인라인 봇) |
| copy_text | 정해 둔 글을 클립보드에 복사 |
| login_url · pay | 사이트 로그인 · 결제(스타 결제) |
callback_data 는 짧게, 답은 반드시
- 64바이트 한도는 글자 수가 아니라 바이트입니다. 한글은 한 글자에 3바이트라 금방 찹니다.
notify_on처럼 영문 짧은 코드를 넣고, 긴 정보는 내 서버에 두고 번호만 싣습니다. - 버튼을 누르면 사용자 화면에 로딩 표시가 돕니다. 봇은
answerCallbackQuery로 꼭 응답해 이 표시를 끝냅니다. 짧은 알림 글이나 경고 창(show_alert)을 함께 띄울 수 있습니다. - 결과는 새 메시지를 보내기보다 그 메시지를 고쳐서(editMessageText · editMessageReplyMarkup) 보여 주는 편이 대화가 깔끔합니다.
- callback_data 는 사용자가 꾸며 보낼 수 있다고 보고, 받은 값으로 권한을 다시 확인합니다.
답장 키보드
{"keyboard": [[{"text": "예"}, {"text": "아니요"}],
[{"text": "내 연락처 보내기", "request_contact": true}]],
"resize_keyboard": true,
"one_time_keyboard": true,
"input_field_placeholder": "답을 골라 주세요"}
| 칸 | 뜻 |
|---|---|
| resize_keyboard | 버튼 수에 맞게 키보드 높이를 줄인다 — 거의 늘 켠다 |
| one_time_keyboard | 한 번 누르면 키보드를 접는다 |
| is_persistent | 일반 키보드로 바꿔도 다시 돌아오게 둔다 |
| input_field_placeholder | 입력창의 흐린 안내 글(최대 64자) |
| selective | 그룹에서 특정 사용자에게만 키보드를 보인다 |
버튼에 request_contact · request_location · request_users · request_chat · request_poll 을 붙이면 연락처·위치·사용자·대화·투표를 고르는 텔레그램 화면이 열립니다. 연락처와 위치는 사용자가 확인 창에서 허락해야 보내집니다. 키보드를 치우려면 {"remove_keyboard": true}(ReplyKeyboardRemove)를 보냅니다.
요청 주소와 응답 읽기는 봇 API 첫 요청, 버튼 신호를 받는 방법은 업데이트 받기에 있습니다.
자주 묻는 질문
인라인 버튼과 답장 키보드는 무엇이 다른가요?
인라인 버튼은 메시지 아래에 붙어 봇에게 신호만 보내고, 답장 키보드는 입력창 자리를 바꿔 버튼 글자가 사용자 메시지로 대화에 보내집니다.
버튼을 누르면 로딩 표시가 계속 돌아요.
봇이 answerCallbackQuery 로 응답하지 않아서입니다. 버튼 신호를 받으면 꼭 응답합니다.
callback_data 에 한글을 넣어도 되나요?
1~64바이트 한도라 한글은 금방 찹니다. 짧은 영문 코드를 넣고 긴 정보는 서버에 둡니다.
답장 키보드는 어떻게 없애나요?
remove_keyboard 를 true 로 한 ReplyKeyboardRemove 를 메시지와 함께 보냅니다.
참고한 공식 문서
한눈에 정리
- 1인라인
신호 · 64바이트 · 꼭 응답.
- 2답장 키보드
글이 대화로 · resize.
- 3요청 버튼
연락처 · 위치 · 대화.
최종 수정 2026-10-06