- 0
- 이니스프리
- 조회 수 2375
안녕하세요?
python-telegram-bot(최신버전 12.3.0)을 사용하다보면 4096자 글자수 제한 때문에 에러가 발생하는 경우가 있습니다.
4096자 제한이라고 하면 일반적인 채팅을 기준으로 할 때 상당히 긴 문자열이라고 생각되시겠지만, 크롤링을 한 결과를 전송하다보면 이를 초과하는 경우도 종종 발생합니다 ^^
긴 문자열의 메시지가 에러로 인해 전송이 되지 못한다면, 중요한 정보의 손실이 아닐 수 없겠죠.
이러한 제한을 우회하기 위해서는 결국 4096자를 기준으로 문자열을 잘라서 전송할 수밖에 없습니다.
다만 단순히 4096자 간격으로 자르다보면 읽는 사람의 입장에서 상당히 불편하기 때문에, 어떻게 하면 보기에 좋도록 적절히 자를 수 있는지가 문제됩니다.
아래의 스크립트는 다음 URL의 아이디어를 기초로 작성되었습니다.
https://github.com/python-telegram-bot/python-telegram-bot/issues/768
import telegram def t_msg(text): bot = telegram.Bot(token='토큰을 입력하세요') try: chat_id = bot.getUpdates()[-1].message.chat.id except: chat_id = 챗아이디를 입력하세요 if len(text) <= 4096: bot.sendMessage(chat_id=chat_id, text=text) else: parts = [] while len(text) > 0: if len(text) > 4080: # '(Continuing...)\n'이 16자임을 고려하여 4096-16=4080을 했습니다. part = text[:4080] first_lnbr = part.rfind('\n') if first_lnbr != -1: # 가능하면 개행문자를 기준으로 자릅니다. parts.append(part[:first_lnbr]) text = text[first_lnbr:] else: parts.append(part) text = text[4080:] else: parts.append(text) break for idx, part in enumerate(parts): if idx == 0: bot.send_message(chat_id, text = part) else: # 두번째 메시지부터 '(Continuing...)\n'을 앞에 붙여줍니다. bot.send_message(chat_id, text = '(Continuing...)\n' + part) time.sleep(0.5)
테스트 결과 아직까지는 별 문제 없이 잘 작동합니다.
이론적으로는 인덱스를 자르는 기준으로 text[:4081]까지도 가능할텐데 귀찮아서 그냥 4080로 숫자를 모두 통일했습니다 ㅎㅎ
다른 우회방법을 찾자면 크롤링할 대상이 4096자 이상의 문자열인 경우에, 이를 캡쳐하여 이미지로 전송하는 방법이 있겠습니다 ^^
허접한 스크립트를 읽어주셔서 감사합니다!
그럼 즐거운 주말 되세요 :)
님 포함 1명이 추천
추천인 1
작성자
댓글 0
권한이 없습니다.