[Ubuntu] SSH 접속 시 텔레그램 알람보내기 #2 (메시지발송편)

[Ubuntu] SSH 접속 시 텔레그램 알람보내기 #2 (메시지발송편)
Photo by Dima Solomin / Unsplash

지난 편에서 텔레그램 봇을 생성했고, 본격적으로 서버에 작업을 하기 전에 PC에서 메시지를 발송해보는 테스트를 해보려고 한다. 메시지를 발송하는 방법은 아주 간단하게 웹브라우저에서 특정 URL을 호출하는 방식으로 해볼 수 있다.

A. API Token 재확인

만약에 텔레그램 봇의 API Token을 적어두지 않았으면 다시 봇파더에게 물어본다.

텔레그램 메신저 캡쳐화면 1 (직접 캡쳐 후 편집)

봇파더의 메뉴에서 /mybots를 선택한다.

텔레그램 메신저 캡쳐화면 2 (직접 캡쳐 후 편집)

내 계정에서 생성한 봇의 목록이 나오고, 그 봇을 클릭하면...

텔레그램 메신저 캡쳐화면 3 (직접 캡쳐 후 편집)
텔레그램 메신저 캡쳐화면 4 (직접 캡쳐 후 편집)

여러 개의 버튼이 나오는데.. 그 중에서 API Token을 클릭하면, 기존에 발행받은 API Token을 재확인 할 수 있다.[1]


  1. 이렇게 원할 때 확인이 가능하므로 굳이 다른 곳에 저장해둘 필요는 없다.(괜히 저장해뒀다가 타인에게 노출되면 더 피곤..) ↩︎

B. 봇 상태 확인

API Token을 확인했으면 이제 봇의 상태를 확인하기 위한 URL을 만들어본다.

※ 본 포스트에는 API Token을 보호하기 위해서 [API_TOKEN]으로 대체하겠다. 각자 생성한 봇의 API Token으로 대체하면 된다.

웹브라우저를 열고서 아래의 URL을 호출한다.[1]

  • URL sample : https://api.telegram.org/bot[API_TOKEN]/getUpdates
  • example
    • API Token : 57412121:AAEF-Zjsdlsd-----YPk[2]
    • URL : https://api.telegram.org/bot57412121:AAEF-Zjsdlsd-----YPk/getUpdates[3]

  1. 가능하면 메모장과 같은 곳에 URL을 완성하고 붙여넣는 것을 추천한다. ↩︎

  2. 예제로 사용한 Token은 발급받은 Token의 중간부분을 임의로 변경한 것이므로 동작하지 않는다. ↩︎

  3. https://api.telegram.org/bot 바로 뒤에 발급받은 Token을 바로 붙여넣으면 된다. ↩︎

엣지 웹브라우저 (직접 캡쳐 후 편집)

C. 내 Chat_id 확인

지금 하려는 작업은 ssh로 누군가가 로그인을 하면, Telegram bot을 통해서 나한테 특정한 메시지를 보내는 것을 만들고 있다.

Telegram bot이 특정 사용자에게 메시지를 보내려면, 그 사용자의 chat_id를 알아야하는데 봇에게 임의의 메시지를 발송하고 getUpdates 명령어를 이용하면 확인할 수 있다.

텔레그램 메신저 캡쳐화면 5 (직접 캡쳐 후 편집)

텔레그램봇에게 임의의 텍스트를 발송한다. 그 뒤에 앞서 실행했던 getUpdates를 실행하면...

{
   "ok":true,
   "result":[
      {
         "update_id":103310160,
         "message":{
            "message_id":2,
            "from":{
               "id":5545034869,
               "is_bot":false,
               "first_name":"SIMPLISM",
               "language_code":"ko"
            },
            "chat":{
               "id":5545034869,
               "first_name":"SIMPLISM",
               "type":"private"
            },
            "date":1688536120,
            "text":"what is my chat id?"
         }
      }
   ]
}

웹브라우저에 위와 같은 json 데이터가 반환된다.[1]

위 JSON 데이터를 대략적으로 정리하면 아래와 같다.

  1. "ok":true : getUpdates를 정상적으로 수행했다.
  2. `"result":[~~~] : getUpdates의 결과를 반환했다.
  3. "update_id":103310160 : getUpdates를 수행한 id는 103310160이다.[2]
  4. "message":{~~~} : 새로운 메시지가 들어왔다.
  5. "message_id":2 : 새로운 메시지의 id는 2이다.
  6. "from":{~~~} : 새로운 메시지를 발송한 사용자의 정보
  7. "id":5545034869 : 새로운 메시지를 발송한 사용자의 ID(chat_id)는 5545034869이다.
  8. 이하는 생략...

어차피 내가 알고자하는 값은... 내 텔레그램 계정의 id(chat_id)이므로 여기에서 확인된 값은 5545034869이다.


  1. 실제로 반환된 데이터는 위 처럼 정리된 형태가 아니고 한줄로 이어진 Text로 반환된다. 위는 보기 편하게 하기 위해서 Json Formatter로 정렬한 것이다. ↩︎

  2. 텔레그램 API 문서를 확인하면 result로 반환된 값의 상세 설명을 확인할 수 있다.(영어로...) ↩︎

D. 메시지 발송테스트

지금까지는 getUpdates 메소드를 이용했는데, 새로운 메소드를 이용한다.(sendMessage 얼마나 직관적인가..ㅎㅎ)

  • URL sample : https://api.telegram.org/bot[API_TOKEN]/sendMessage?chat_id=[CHAT_ID]&text=[MESSAGE]
  • example
    • API_TOKEN : 57412121:AAEF-Zjsdlsd-----YPk
    • CHAT_ID : 5545034869
    • MESSAGE : test
    • URL : https://api.telegram.org/bot57412121:AAEF-Zjsdlsd-----YPk/sendMessage?chat_id=5545034869&text=test

위의 sample과 example를 참고해서 최종 URL을 만든 뒤에 웹브라우저로 실행해보면...

{
   "ok":true,
   "result":{
      "message_id":3,
      "from":{
         "id":6215768963,
         "is_bot":true,
         "first_name":"simplism-ssh-alarm",
         "username":"simplism_ssh_alarm_bot"
      },
      "chat":{
         "id":5545034869,
         "first_name":"SIMPLISM",
         "type":"private"
      },
      "date":1688537969,
      "text":"test"
   }
}

위와 같은 JSON 데이터가 반환된다. 대략적으로 JSON 데이터를 설명해보면, simplism_ssh_alarm_botSIMPLISM(chat_id가 5545034869인 사용자)에게 test라는 text 메시지를 보냈다라는 내용이다.

텔레그램 메신저 캡쳐화면 6 (직접 캡쳐 후 편집)

위 처럼 봇이 보낸 test라는 메시지를 수신한 것을 확인할 수 있다.

E. 마치면서..

정상적으로 메시지가 봇을 통해서 나한테 발송되는 것을 확인했으니... 이제 대망의 bash shellscript를 작성할 차례다. 그나마 1,2편은 스크린샷이 있어서 크게 어렵지 않았을 것 같은데 bash shellscript 부분은 소스코드가 거의 대부분이라서 읽는 사람한테 잘 전달되도록 글 작성이 가능할까?

좀 걱정은 되지만 계속 해보자!

F. 참고문서

  1. Telegram Bot API, Telegram 공식홈페이지, unknown author, 2023/04/21 updated