API를 문서를 읽지 않고, 도전하는 개발자의 실수

# 사전준비 #

가. 텔레그램 계정 : 기존 보유자도 Setting(환경설정)에서 '@' 로 시작하는 이름이 있는지 확인. 없다면 '편집'에서 Username에 입력하면, @홍길동 으로 등록
나. 챗 검색에서 'BotFather'를 검색한후, New Bot 을 생성하고, 아래 그림에서 가려진 부분이 토큰(Token)값임.

다. 챗 검색으로 나와, New Bot을 검색한 후, 대화 1~2개를 던짐
라. 텔레그램은 채팅방마다 Chat-ID를 부여하는데, 나와 Bot의 Chat-id를 찾아야 함
브라우저창에 'https://api.telegram.org/Bot생성시 받은 TOKEN값/getUpdates' 을 입력하면 결과 나옴
(아래의 id 가 Chat-ID 값임)

{"ok":true,"result":[{"update_id":770558652,
"message":{"message_id":3,"from":{"id":5113991,"is_bot":false,"first_name":"Kam","last_name":"dh","username":"teleno0","language_code":"ko"},"chat":{"id":5113991,"first_name":"Kam","last_name":"dh","username":"teleno0","type":"private"},"date":1677135418,"text":"Fjdjdjd"}}]}

여기서 잠깐 트러블 슈팅!!!
저 화면이 안나오는 경우는 2가지
하나. ok는 정상인데, 아래와 깉이 id 값이 없음. 이럴 때는 다시 Bot에게 대화를 한 후 브라우저에 동일하게 접속하면 나옴

{"ok":true,"result":{"id":603078,"is_bot":true,"first_name":"Tellm0","username":"Tellm0_bot","can_join_groups":true,"can_read_all_group_messages":false,"supports_inline_queries":false}}

둘. 토큰값 잘못 입력.
브라우저에 입력할 'https://api.telegram.org/Bot생성시 받은 TOKEN값/getUpdates' 에서 Token값에는 '603~~Xc0' 앞에 'bot'이라는 접두어를 붙어야 한다. 만약 그래도 오류가 나면, 값을 타이핑치지 말고 복사&붙여넣기로 입력..

# 대화시도 #

import telegram, asyncio             # 정책변경으로 async만 가능 

CHAT_ID = '5113996'                  # 상수는 대문자로 선언
TELE_TOKEN = '6030794********dXc0'   # 상수는 대문자로 선언

async def send_text(bot, text) :
    await bot.send_message(CHAT_ID, text)

msg = 'new is start yes' 
 
bot = telegram.Bot(token=TELE_TOKEN)
asyncio.run(send_text(bot, msg))

사전 확인한 CHAT_ID와 토큰으로 메시지를 보내면 된다. crontab 등으로 특정시간대가 되면, 웹크롤링을 수행하여 텔레그램으로 전달해주면 일일이 사이트를 조사할 필요없이 편리하게 이용 가능할 것 같다. 다른 예제들로는 Bot에게 특정어를 입력하면 해당 업무를 수행할 수 있도록 개발할 수도 있다.

# 트러블 슈팅 #

telegram.error.Forbidden: Forbidden: bot can't send messages to bots

Bot이 Bot에게 메시지를 전달할 수없다. 아마 여러분이 이용하고 입력한 CHAT_ID가 사용자나 사용자와 대화하고 있는 채팅방ID가 아닌 BotID일 수 있다. 다시 확인해보자.

RuntimeWarning: coroutine 'Bot.send_message' was never awaited

텔레그램 정책 변경으로 동기방식의 메시지 전송이 불가능하다. 인터넷의 대부분의 예제가
bot = telegram.Bot(token=TELE_TOKEN)
bot.send_message(CHAT_ID, msg)
이와 유사한데, 이제는 이렇게 보낼 수 없다. 위의 방식대로 asyncio.run()을 이용한 비동기 방식을 이용하자.

Posted by 목표를 가지고 달린다
,