Problem Solving Through Python

|  파이썬을 활용하여 우리가 PC를 사용하면서 접하는 문제를 보다 간단히 해결하는 내용을 다룹니다. - 기초수준

조회 수 75 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 첨부
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 첨부

텔레그램에 대한 이미지 검색결과



안녕하세요?


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자 이상의 문자열인 경우에, 이를 캡쳐하여 이미지로 전송하는 방법이 있겠습니다 ^^


허접한 스크립트를 읽어주셔서 감사합니다!


그럼 즐거운 주말 되세요 :)



Problem Solving Through Python

파이썬을 활용하여 우리가 PC를 사용하면서 접하는 문제를 보다 간단히 해결하는 내용을 다룹니다. - 기초수준

List of Articles
번호 제목 글쓴이 날짜 조회 수
20 [BeautifulSoup] 자식태그를 제거하기 - .decompose() & .extract() file 이니스프리 2020.01.16 59
» [python-telegram-bot] 4096자 글자수 제한을 우회하는 방법 file 이니스프리 2020.01.12 75
18 [Requests] Selenium을 이용한 Cloudflare의 우회 3 file 이니스프리 2020.01.08 78
17 9. 파이썬 문법 팁 정리 file 이니스프리 2020.01.04 89
16 [번외편] 네이버 동영상에서 자막을 파일로 추출하는 방법 2 file 이니스프리 2019.12.25 146
15 4. 문자열 처리 (2) - 문자열 조작에 대한 기본함수 및 메서드 1 file 이니스프리 2019.12.12 134
14 6. 리스트와 관련된 기본함수 및 메서드 7 file 이니스프리 2019.12.10 143
13 3. 문자열 처리 (1) - 문자열 접근 및 검색방법 4 file 이니스프리 2019.12.09 114
12 [Selenium] Requests의 session을 Selenium으로 보내기 file 이니스프리 2019.12.07 142
11 1. 반복문 (1) - while 문 5 file 이니스프리 2019.12.06 114
10 (序) Python 강좌를 시작하며... 2 file 이니스프리 2019.12.05 94
9 [Pillow] 파이썬 Pillow 라이브러리를 이용하여 이미지의 배경을 transparent하게 만들기 11 file 이니스프리 2019.08.04 489
8 [번외편 - 법률] 나무위키의 서술 중 법률용어의 사용에 있어 바로잡아야 할 부분 file 이니스프리 2019.07.17 174
7 [번외편 - 유튜브] Youtube API를 이용하거나 또는 이용하지 않고 채널ID를 추출하는 방법 1 file 이니스프리 2019.07.16 379
6 [Selenium] Selenium에서 send_keys를 막아놓은 경우 해결책 이니스프리 2019.07.04 281
5 [번외편 - 아미나] Basic Youtube Title Widget 1.0에서 처음에 엑박으로 뜨는 경우의 해결책 3 file 이니스프리 2018.12.15 448
4 [번외편 - 아미나] 아미나의 회원 이미지와 관련하여 x2 3 file 이니스프리 2018.12.10 423
3 [번외편 - 법률] 현행 저작권법 제30조(사적이용을 위한 복제)에 대하여 - 음원 다운로더의 처벌과 관련하여 6 이니스프리 2018.12.07 712
2 [번외편 - 아미나] 그누보드/아미나에서 게시글의 날짜를 최종수정일로 변경하고, 목록스킨 및 위젯을 최종수정일 순으로 정렬하기 2 file 이니스프리 2018.11.11 2123
1 [번외편 - 구글뉴스] 리뉴얼된 구글뉴스에서 RSS 피드를 생성하는 방법 3 file 이니스프리 2018.10.07 1593
목록
Board Pagination Prev 1 Next
/ 1
서버에 요청 중입니다. 잠시만 기다려 주십시오...