이번에 텔레그램 API를 사용해서 특정 채팅방에 텔레그렘을 보내야 하는 일이 있었다.
해당 기능을 개발하면서, 국내에 생각보다 자료들이 많이 없었기에 이번 기회에 개발하면서 알게 된 것들을 공유 하고자 한다.
텔레그램 메세지를 보내기 위해서는 텔레그램 봇을 먼저 생성 해야 한다.
텔레그램 봇을 만드는 과정은 다음 링크를 통해서 진행 하면 된다.
텔레그램 봇을 만들었으면, 봇 토큰을 전달 받을 수 있다.
이제 해당 봇이 메세지를 보내게 될 채팅방에 봇을 초대 해준다.
이 때 봇에게 해당 채팅방에서의 admin 권한을 주어야 한다.
그 후 해당 채팅방에 아무 메세지를 보내고, 잠시 후 아래 주소로 접속 또는 API 요청을 보내자.
https://api.telegram.org/bot{봇ID}/getUpdates
위 {봇ID}에 해당하는 부분에 BotFather에게로부터 전달 받은 봇 토큰 문자열을 넣어주면 된다.
{
"ok": true,
"result": [
{
"update_id": 1234567,
"message": {
"message_id": 123,
"from": {
"id": 12345,
"is_bot": false,
"first_name": "lee",
"last_name": "kevin",
"username": "kevin99"
},
"chat": {
"id": -12345676778,
"title": "테스트 채팅방",
"is_forum": true,
"type": "supergroup"
},
그렇다면 위와 같은 JSON 응답을 받을 수 있다.
이 때 chat Object의 id 값이 채팅방 ID이며, 복사 해두자.
채팅방이 여러 개인 경우에는 여러 chat Object가 출력 되기에 주의하자.
https://api.telegram.org/bot{봇ID}/sendMessage
위 주소로 API 요청을 보낼 때 body는 다음과 같다.
{
"chat_id": "-1001XXX",
"text": "안녕~"
}
이 때 JAVA에서 해당 API 요청을 보낼 때 일반적으로 RestTemplate 같은 라이브러리를 사용할텐데 그 때 아래와 같이 VO 객체를 생성해서 사용하면 된다.
@Getter
@Setter
@JsonInclude(JsonInclude.Include.NON_NULL)
public class TelegramMessage {
@JsonProperty("chat_id")
private String chatId;
private String text;
}
만약 메세지에 아래와 같이 버튼을 추가 하고 싶다면 어떻게 할 수 있을까?
기존 메세지 전송 API spec에서 reply_markup
와 inline_keyboard
필드를 추가 해주면 된다.
{
"chat_id": 123456789,
"text": "메세지 내용",
"reply_markup": {
"inline_keyboard": [
[
{
"text": "🔗게시글 링크 이동",
"url": "buttonUrl"
}
]
]
}
}
reply_markup
필드는 메세지에 키보드나 버튼, 또는 기타 옵션을 함께 보내고 싶을 때 사용된다.
inline_keyboard
필드는 인라인 버튼들을 배열 형태로 구성하며, 인라인 버튼은 메시지 아래에 바로 표시 된다.
reply_markup
필드는 2차원 배열로 구성 되어있다. 각 내부 배열은 한 줄을 나타내고, 내부 배열의 각 객체는 버튼을 구성한다.
각 버튼은 text와 url로 구성되며, 이는 각각 버튼 안에 들어갈 텍스트와 버튼 클릭시 이동할 url로 구성된다.
텔레그램에는 토픽(주제)라는 개념이 있다.
이는 디스코드에도 있는 비슷한 개념인데, 하나의 채팅방(채널)에서 각 주제에 해당하는 여러 채팅방으로 나눌 수 있는 개념이다.
예를 들어 회사 채널이 있다고 하자.
회사 채널에는 아래와 같은 토픽들로 나누어진다고 하자.
이 때 나는 공지사항 봇을 공지 토픽에 추가 하고 싶다면 어떻게 할까?
먼저 해당 토픽에 아무 메세지나 작성하고, 위 사진과 같이 링크를 복사한다.
그러면 https://t.me/c/1112223334/25/33
와 같은 주소가 복사 될 것이다.
이 때 긴 숫자 뒤에 있는 숫자인 25
를 복사해둔다.
해당 숫자가 해당 토픽의 번호이다.
{
"chat_id": "-1001XXX",
"text": "안녕~",
"message_thread_id": "25"
}
해당 번호를 message_thread_id
필드에 담아서 보내면 해당 토픽으로 메세지를 전송 시킬 수 있다.