민프

[Python] 텔레그램 봇을 만들어서 공유해보자 (feat error. RuntimeWarning: coroutine 'Bot.send_message' ) 본문

[Python]

[Python] 텔레그램 봇을 만들어서 공유해보자 (feat error. RuntimeWarning: coroutine 'Bot.send_message' )

민프야 2023. 4. 17. 16:06

https://core.telegram.org/bots/api

 

Telegram Bot API

The Bot API is an HTTP-based interface created for developers keen on building bots for Telegram. To learn how to create…

core.telegram.org

https://python-telegram-bot.org/

 

python-telegram-bot

A Python framework for the Telegram Bot API

python-telegram-bot.org

위 API문서를 참고해보자

1. telegram - 친구찾기에서 botfather을 검색 후 추가

 BotFather는 텔레그램 봇을 만들어주는 역할을 하는데 이를 사칭하는 유사 유저들이 많기 때문에 오타 없이 잘 검색해야한다.

 

2. 채팅시작

채팅 시작을 하면 위 사진과 같이 어떻게 봇을 사용하는지 나와있다.

여기에서 /newbot 을 눌러서 나의 봇을 만들어보자

 

/newbot을 클릭하면 아래와 같이 Botfather가 말한다

Alright, a new bot. How are we going to call it? Please choose a name for your bot.

이것은 우리가 사용할 봇의 이름을 입력하라는 것 이다.

입력에 성공하게 되면 생성된 봇에 대한 엑세스 토큰 값이 나오게 된다.

이 값을 통해 봇 계정을 사용할 수 있기 때문에 다른 사람에게는 절대 알려주지 말자!

 

 

3. 텔레그램 봇 파이썬 모듈 설치하기

pip install python-telegram-bot

 

4. chat_id 찾기

https://api.telegram.org/bot[토큰값]/getUpdates

chatId는 위와 같은 URL을 하면 아래 사진과 같이 결과가 나온다

앞서 봇을 만들었던 BotFather 와의 대화창에서 t.me/~bot를 누르면 아래와 같은 대화창이 뜨고 여기서 START 를 눌러 방금 만든 봇과의 대화를 시작한다.

 

대화 시작 후 다시 위 URL을 들어가보면

result값이 바뀌어 있을 것 이다.

5. 봇에 메세지 보내기

import telegram

token = "token"
bot = telegram.Bot(token)
bot.sendMessage(chat_id="userId", text="봇 테스트 입니다")

위에서 받은 토큰과 chat_id를 넣어보자

근데 이렇게 넣게 되면

아래와 같은 에러가 나게 되는데 

RuntimeWarning: coroutine 'Bot.send_message' was never awaited bot.sendMessage..... RuntimeWarning: Enable tracemalloc to get the object allocation traceback

v20.0으로 업데이트 되면서

봇이 비동기(coroutine) 타입이어서 아래 코드들과 같이 작동 신호를 넣어줘야 한다. 

import telegram
import asyncio

token = "mytoken"
bot = telegram.Bot(token)
asyncio.run(bot.sendMessage(chat_id=MychatId, text="안녕하세요. 저는 봇입니다."))

or

import asyncio
import telegram

async def main():
    token = "mytoken" 
    bot = telegram.Bot(token = token)
    await bot.send_message(myChatId,'보낼메세지')

asyncio.run(main())

이렇게 하면 봇에 메세지가 잘 전달되는 것을 볼 수 있다.

 

6. 공유하기

공유하는 방법은 상대방 Telegram - 친구 찾기에서 나의 봇이름을 검색해서 채팅방에 들어오면 된다.

근데 여기서 채팅방 각 인원마다 다른 chat ID를 가지고 있다. 
이 부분을 잘 처리해서 각 Bot에다가 메세지를 전달하면 될 것 같다. 

개인에게는 그렇게 보내면 되고, 사람들이 모여있는 그룹방에 bot을 추가하고 싶으면

 

먼저 텔레그램 그룹에 봇을 추가하려면, BotFather에서 봇의 그룹 추가가 가능한지 살펴봐야 한다. 추가하려는 봇이 ENABLED라고 표시돼야 한다.

이렇게 하고 그룹 방의 chat_id로 변경하고 메세지를 보내면 된다. 

그룹의 chat_id는 아래 사진과 같이 음수로 표기되니 확인하고 보내자

 

Comments