파이썬에서 텔레그램 API를 사용하여, 특정 채널에 메시지를 보내는 방법을 알아봅시다. API를 통해서 메시지를 게시하려는 채널이 있다면, 텔레그램에서 새로 봇 하나를 만들고, 이 텔레그램 봇을 해당 채널의 관리자로 추가해줍니다. 이렇게 해 두었다면 API를 사용하여 봇으로 하여금 채널에 메시지를 보낼 수 있게 됩니다. 채널 뿐만 아니라 대화 ID만 알고 있다면,1:1 대화나 그룹대화에도 메시지를 보낼 수 있습니다. 오늘은 이 과정을 하나씩 따라가면서 살펴보겠습니다.
봇 생성하기
봇의 생성은 텔레그램 앱에서 할 수 있습니다. 모바일 앱 외에 PC용 텔레그램에서도 똑같이 할 수 있습니다. 텔레그램에서 제작한 공식 봇인 BotFather
(@BotFather
)를 연락처에 추가하고, 이 봇에 말을 걸어서 봇을 생성할 수 있는데요, 참고로 현재(2022년 7월)는 BotFather로 검색을 해보면 이름이 같거나 유사한 짝퉁들이 많이 있습니다. 공식 봇파더를 잘 찾아서 (봇 아이디 반드시 확인) 봇을 만들도록 합니다. 봇을 생성하는 과정은 다음과 같으며 사실 엄청 간단합니다.
대화 상대 목록에서 BotFather를 선택하고 대화를 시작한다.
/newbot
명령을 보내면, 생성할 봇의 이름을 물어보는데, 생성할 봇의 이름을 준다.
봇 이름을 결정하고 나면, 이번에는 봇의 계정이 이름을 물어본다. 역시 자기 마음대로 지으면 되지만, 계정 이름은 ~bot 으로 끝나야 한다.
이렇게만하면 봇은 생성됩니다. 봇 생성이 완료되면 BotFather는 해당 봇을 작동하기 위한 API를 호출할 때 사용할 bot token을 알려주고, api 문서의 URL을 알려줍니다. (아래 주소입니다.)
https://core.telegram.org/bots/api
api의 기본 사용법
텔레그램 봇을 실제로 작동하는 것은 텔레그램 봇 API를 사용합니다. 이 API는 간단한 형식으로 정의되어 있고, 사용하기에도 그리 어렵지 안습니다. 보통 https://api.telegram.org/bot<token>/{method_name}
이 주소가 됩니다. 이 API를 사용하여 봇의 상태를 조회하거나 메시지를 보내는 등의 작업을 처리할 수 있습니다. 어떤 작업을 처리할 것인지에 따라, 사용할 메소드가 다릅니다. API문서에는 사용 가능한 메소드들의 목록이 나열되어 있습니다.
API를 호출할 때, API가 요구하는 파라미터들은 다양한 방법으로 전달할 수 있습니다. URL에 GET 파라미터로 붙여서 호출하여 전달할 수 있고, POST 요청을 보내면서 폼 데이터나, JSON 페이로드로 전송할 수도 있습니다. 본인이 원하는 편한 방식을 사용하면 됩니다. 단, 어떤 방식으로 호출하든간에 텔레그램 봇 API는 JSON 데이터를 응답으로 전송합니다.
메시지를 확인하여 방 번호 알아내기
채널이나 특정한 채팅방에 메시지를 보내려면 채팅을 구분하는 식별값을 알아야 합니다. 이를 알아내는 방법에는 여러가지가 있는데, 가장 간단하게는 봇 API를 사용하는 방법이 있습니다. 메시지를 보내기 전에 채널이든, 그룹대화든, 1:1 대화든 대화에 참여하여 메시지를 받아보는 것입니다. 받은 메시지에는 어떤 채팅방을 통해서 전달된 메시지인지를 구분하는 값이 있습니다. 이 정보를 사용하면 쉽게 채널 식별값도 알아낼 수 있습니다.
봇이 받은 메시지를 확인하려면 getUpdates
라는 메소드를 사용합니다. 이 메소드의 리턴값에서 response.result
요소가 확인하지 않은 메시지 정보의 배열입니다. response.result[0].channel_post.sender_chat
값을 확인하면, 채팅방 식별값을 알 수 있다. 이 과정을 간단하게 requests
모듈을 사용해서 구현해 본다면 다음과 같이 할 수 있겠습니다.
import requests
__TOKEN = "******.." # bot의 액세스토큰
url = f"https://api.telegram.org/bot{__TOKEN}/getUpdates?"
res = requests.get(url).json()
for item in res.get("result", []):
if "channel_post" in item:
chat = item["channel_post"]["sender_chat"]
print(f"channel: {chat['title']}({chat['id']})")
봇을 구독자에 추가해놓은 채널에 아무 메시지나 보내고 위 코드를 실행하면 봇이 채널을 통해 받은 메시지를 통해 채널 제목 및 채널의 chat_id
를 알아내게 됩니다. (채널에 경우 이 값은 -100으로 시작하는 숫자값입니다.)
이런 용도외에도 getUpdate
를 사용하면 봇이 채팅방을 통해서 받은 메시지를 가져올 수 있습니다. 물론 이걸로 봇이 받는 명령이나 메시지를 실시간으로 처리해서는 안됩니다. 봇이 메시지를 받았을 때마다 특정한 동작을 자동으로 수행하고자 한다면, 그러한 기능은 봇에 웹 훅 URL을 설정해주고 해당 URL에서 필요한 처리를 하도록 해주면 됩니다.
메시지 보내기
특정 대화방이나 채널에 메시지를 전송하도록 하는 메소드는 sendMessage
이다. 메소드 호출에 필요한 몇몇 파라미터들은 다음과 같으며, 성공 시 리턴되는 값은 전송한 메시지의 정보이다.
- chat_id : 메시지를 전송할 대화방의 식별자값. 정수값이거나
@channelname
과 같은 모양의 채널이름일 수 있다. text
: 전송할 메시지의 내용- entities : 텍스트 외에 메시지에 함께 표시되어야 할 콘텐츠가 있다면 entities 항목으로 만들어서 전달할 수 있다.
disable_notification
: true 값으로 보내면 메시지를 알림 없이 전송한다.reply_to_message_id
: 특정한 메시지 번호를 주면, 해당 메시지에 대한 회신으로 전송된다.
그외에 다른 여러 옵션들이 있는데, 이는 api 레퍼런스 페이지에서 확인하면 됩니다. 기본적으로 간단한 알림을 채널을 통해 받는 목적이라면 chat_id
, text
옵션만 사용하면 됩니다.
메시지 발송하기
이제 메시지를 보내볼 차례입니다. 채널에 봇을 추가한 후 관리자로 지정해주어야 합니다. 텔레그램 앱에서 채널을 선택하고 채널 설정 화면으로 들어갑니다. 중간쯤에 보면 “관리자”라는 항목이 있습니다.
“관리자” 항목을 선택하면 관리자를 추가할 수 있습니다. ‘관리자 추가’를 통해 봇을 채널의 관리자로 추가합니다. 추가된 관리자들에 대해서 권한도 여기서 관리할 수 있는데, 메시지 보내기 외의 기능은 필요 없으므로 권한을 빼줍니다. 여기까지 준비했다면 아래와 같이 코드를 작성하고 실행해봅니다.
__TOKEN = "*** ... "
__chat_id = "-100...."
data = {"chat_id" : __chat_id, "text": "Hello" }
url = f"https://api.telegram.org/bot{__TOKEN}/sendMessage?"
res = requests.post(url, json=data)
print(res.json())
만약 자신과 봇과의 개인채팅방으로 메시지를 보내고자 한다면 같은 방법으로 봇에게 말을 걸어서 메시지를 보내고, 앞서 소개한 방법을 썻, 어떤 메시지를 받았는지를 확인해보면 됩니다.