텔레그램 봇
웹훅 URL 셋팅
@PostMapping("/telegram/webhook/{secret}")
public ResponseEntity<String> receive(@RequestHeader(value="X-Telegram-Bot-Api-Secret-Token", required=false) String headerToken,
@PathVariable String secret,
@RequestBody UpdateDto update) {
if (!configuredSecret.equals(secret) || !configuredHeaderToken.equals(headerToken)) {
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build();
}
// 처리...
return ResponseEntity.ok("ok");
}텔레그램 요청
{
"update_id": 123456789,
"message": {
"message_id": 11,
"from": {
"id": 987654321,
"is_bot": false,
"first_name": "흥수",
"username": "heungsu"
},
"chat": {
"id": 987654321,
"type": "private"
},
"date": 1700000000,
"text": "/start"
}
}버튼 생성
sendMessage
예시 JSON (간단한 목록 + 버튼): { "chat_id": 123456789, "text": "항목을 선택하세요.", "reply_markup": { "inline_keyboard": [ [ {"text": "열기", "callback_data": "action:open,id:42"}, {"text": "수정", "callback_data": "action:edit,id:42"}, {"text": "삭제", "callback_data": "action:delete,id:42"} ] ] } }
Map<String,Object> btnOpen = Map.of("text","열기","callback_data","action:open,id:42");
Map<String,Object> btnEdit = Map.of("text","수정","callback_data","action:edit,id:42");
Map<String,Object> btnDelete = Map.of("text","삭제","callback_data","action:delete,id:42");
List<List<Map<String,Object>>> keyboard = List.of(List.of(btnOpen, btnEdit, btnDelete));
Map<String,Object> replyMarkup = Map.of("inline_keyboard", keyboard);
telegramApiClient.sendMessage(chatId, "항목을 선택하세요.", replyMarkup).subscribe();
버튼 클릭(사용자 상호작용) → 서버로 오는 이벤트
{ "update_id": 9999, "callback_query": { "id": "1234567890", "from": {"id": 987654321, "username":"heungsu"}, "message": {"message_id": 111, "chat": {"id": 987654321}}, "data": "action:delete,id:42" } }